合规保留策略

对象存储OSS支持WORM特性,允许用户以“不可删除、不可篡改”方式保存和使用数据,符合美国证券交易委员会(SEC)和金融业监管局(FINRA)的合规要求。

背景信息

OSS提供强合规策略,用户可针对存储空间(Bucket)设置基于时间的合规保留策略。当策略锁定后,用户可以在Bucket中上传和读取文件(Object),但是在Object的保留时间到期之前,任何用户都无法删除Object和策略。Object的保留时间到期后,才可以删除Object。OSS支持的WORM特性,适用于金融、保险、医疗、证券等行业。您可以基于OSS搭建云上数据合规存储空间。

OSS是目前已通过Cohasset Associates审计认证的云服务,可满足严格的电子记录保留要求,例如SEC Rule 17a-4(f)、FINRA 4511、CFTC 1.31等合规要求。更多信息,请参见OSS Cohasset Assessment Report

注意事项

  • 合规保留策略正在公测中,如需试用此功能,请联系技术支持申请试用。

  • OSS目前仅支持针对Bucket级别设置合规保留策略。

  • 同一个Bucket中,版本控制和合规保留策略无法同时配置。若Bucket已开启版本控制功能,则无法再配置保留策略。版本控制功能详情请参见版本控制介绍

  • Bucket内的Object在合规保留策略生效期间,可通过设置生命周期规则进行存储类型转化,在保证合规性的前提下,降低存储成本。

规则说明

OSS允许添加一条基于时间的合规保留策略,保护周期为1天到70年。

假设您在2013年6月1日创建一个名为examplebucket的Bucket,并且在不同时间上传了file1.txt、file2.txt、file3.txt三个Object。随后,在2014年7月1日创建了保护周期为5年的合规保留策略。有关这三个Object的具体上传时间以及对应的Object到期时间如下:

Object名称

上传时间

Object到期时间

file1.txt

2013年6月1日

2018年5月31日

file2.txt

2014年7月1日

2019年6月30日

file3.txt

2018年9月30日

2023年9月29日

  • 生效规则

    当基于时间的合规保留策略创建后,该策略默认处于“InProgress”状态,且该状态的有效期为 24 小时。在有效期24小时内,此策略对应的Bucket资源处于保护状态。

    • 启动合规保留策略24小时内:若该策略未提交锁定,则Bucket所有者以及授权用户可以删除该策略;若该保留策略已提交锁定,则不允许删除该策略,且无法缩短策略保护周期,仅可以延长保护周期。

    • 启动合规保留策略24小时后:若超过24小时该保留策略未提交锁定,则该策略自动失效。

    • Bucket内的数据处于被保护状态时,若您尝试删除或修改这些数据,OSS API将返回409 FileImmutable的错误信息。

  • 删除规则

    • 基于时间的合规保留策略是Bucket的一种Metadata属性。当删除某个Bucket时,该Bucket对应的合规保留策略以及访问策略也会被删除。因此当Bucket为空时,Bucket的所有者可以删除该Bucket,从而间接删除该Bucket的保留策略。

    • 启动保留策略24小时内,若该保留策略未提交锁定,则Bucket所有者以及授权用户可以删除该策略。

    • 若Bucket内有文件处于保护周期内,那么您将无法删除保留策略,同时也无法删除Bucket。

使用OSS控制台

  1. 登录OSS管理控制台

  2. 单击左侧导航栏的Bucket列表,然后单击目标Bucket名称。

  3. 在左侧导航栏,选择基础设置>保留策略。在保留策略区域,单击设置

  4. 单击创建策略

  5. 创建策略对话框,设置合规保留策略的保留周期。保留周期的取值范围为1天到70年。

  6. 单击确定

策略创建后,状态显示为IN_PROGRESS。此状态下,策略可被锁定和删除。

  1. 单击锁定。确认合规保留策略无误后,单击确定

注意
  • 此时策略状态变为LOCKED,您仅可以单击编辑延长文件的保护周期,无法删除策略或缩短文件的保护周期。

  • 当Bucket内的数据处于被保护状态时,如果您在控制台上尝试删除或修改这些数据,控制台上会返回“该文件已被锁定,不可执行操作”的错误提示。

使用阿里云SDK

以下仅列举常见SDK的设置合规保留策略的代码示例。关于其他SDK的设置合规保留策略的代码示例,请参见SDK简介

// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。关于其他Region对应的Endpoint信息,请参见访问域名和数据中心。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
 String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
 // 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";

// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

// 创建InitiateBucketWormRequest对象。
InitiateBucketWormRequest initiateBucketWormRequest = new InitiateBucketWormRequest(bucketName);
// 指定Object保护天数为30天。
initiateBucketWormRequest.setRetentionPeriodInDays(30);

// 创建合规保留策略。
InitiateBucketWormResult initiateBucketWormResult = ossClient.initiateBucketWorm(initiateBucketWormRequest);

// 查看合规保留策略Id。
String wormId = initiateBucketWormResult.getWormId();
System.out.println(wormId);

// 关闭ossClient。
ossClient.shutdown();
const OSS = require('ali-oss');

const client = new OSS({
  // region以杭州为例(oss-cn-hangzhou),其他region按实际情况填写。
  region: '<Your region>',
  // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
  accessKeyId: '<Your AccessKeyId>',
  accessKeySecret: '<Your AccessKeySecret>'
});
// 创建合规保留策略。
async function initiateBucketWorm() {
  const bucket = '<Your Bucket Name>'
  // 指定Object保护天数。
  const days = '<Retention Days>'
	const res = await client.initiateBucketWorm(bucket, days)
  console.log(res.wormId)
}

initiateBucketWorm()
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\OssClient;
use OSS\Core\OssException;

// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
$accessKeyId = "yourAccessKeyId";
$accessKeySecret = "yourAccessKeySecret";
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "yourEndpoint";
// 填写Bucket名称,例如examplebucket。
$bucket= "examplebucket";

$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false);

try {
    // 创建合规保留策略,指定Object保护天数为30天。
    $wormId = $ossClient->initiateBucketWorm($bucket, 30);

    // 查看合规保留策略ID。
    print($wormId);
} catch (OssException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
}

print(__FUNCTION__ . ": OK" . "\n");
# -*- coding: utf-8 -*-
import oss2

# 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
auth = oss2.Auth('yourAccessKeyId', 'yourAccessKeySecret')
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称。
bucket = oss2.Bucket(auth, 'yourEndpoint', 'examplebucket')

# 新建合规保留策略,并指定Object保护天数为30天。
result = bucket.init_bucket_worm(30)
# 查看合规保留策略ID。
print(result.worm_id)

使用命令行管理工具ossutil

关于使用ossutil设置合规保留策略的具体操作,请参见创建并锁定合规保留策略

使用REST API

如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。更多信息,请参见InitiateBucketWorm

阿里云首页 对象存储 OSS 相关技术圈