

# 使用对象锁定以锁定对象
<a name="object-lock"></a>

​S3 对象锁定可以协助在固定的时间长度内或无限期地阻止删除或覆盖 Amazon S3 对象。对象锁定使用*一次写入多次读取*（WORM）模式存储对象。您可以使用对象锁定来协助满足需要 WORM 存储的法规要求，或用于添加额外的保护层来防止对象被更改和删除。

**注意**  
S3 对象锁定已由 Cohasset Associates 评估，可在受 SEC 17a-4、CFTC 和 FINRA 法规约束的环境中使用。有关对象锁定与这些法规关系的更多信息，请参阅 [Cohasset Associates 合规性评估](https://d1.awsstatic.com/r2018/b/S3-Object-Lock/Amazon-S3-Compliance-Assessment.pdf)。

对象锁定提供了以下两种方式来管理对象保留：*保留期限*和*依法保留*。对象版本可以同时具有保留期限和/或依法保留。
+ **保留期**：保留期指定对象版本可以保持锁定状态的固定时间长度。您可以为各个对象设置唯一的保留期。此外，您可以在 S3 存储桶上设置默认保留期。您还可以在桶策略中使用 `s3:object-lock-remaining-retention-days` 条件键限制允许的最小和最大保留期。此条件键有助于您确定可支持的保留期。有关更多信息，请参阅[使用存储桶策略为保留期限设置限制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock-managing.html#object-lock-managing-retention-limits)。
+ **依法保留** – 依法保留提供的保护与保留期限相同，但没有到期日期。依法保留将一直有效，直至您明确将其删除。法定保留与保留期无关，且应该对单独的对象目标应用。

对象锁定仅在启用 S3 版本控制的存储桶中生效。当您锁定某一对象版本时，Amazon S3 会将锁定信息存储在该对象版本的元数据中。在对象上实施保留期限或依法保留仅保护在请求中指定的版本。保留期和法定保留不会阻止创建对象的新版本，也不会阻止在对象顶部添加删除标记。有关 S3 版本控制的信息，请参阅[使用 S3 版本控制保留对象的多个版本](Versioning.md)。

如果您将一个对象放入存储桶中，而存储桶中包含的现有受保护对象与其具有相同的对象键名，Amazon S3 将创建对象的新版本。现有受保护版本的对象将根据其保留配置保持锁定状态。

## S3 对象锁定的工作原理
<a name="object-lock-overview"></a>

**Topics**
+ [保留期限](#object-lock-retention-periods)
+ [保留模式](#object-lock-retention-modes)
+ [法定保留](#object-lock-legal-holds)
+ [删除如何处理 S3 对象锁定](#object-lock-how-deletes-work)
+ [使用 S3 对象锁定的最佳实践](#object-lock-best-practices)
+ [所需的权限](#object-lock-permissions)

### 保留期限
<a name="object-lock-retention-periods"></a>

*保留期限*可在固定时间内保护对象版本。当您对对象版本施加保留期限时，Amazon S3 会在该对象版本的元数据中存储时间戳，以指示保留期限的到期时间。在保留期限到期后，便可覆盖或删除对象版本。

您可以对单独对象版本或在存储桶属性上明确设置保留期限，以便它自动应用于存储桶中的所有对象。将保留期显式应用于对象版本时，即为对象版本指定*保留到期日期*。Amazon S3 将此日期存储在对象版本的元数据中。

您还可以在存储桶的属性中设置保留期限。在存储存储桶上设置保留期限时，您可以指定放入存储桶中的每个对象版本受保护的持续时间，以天或年为单位。当您将对象放入存储桶时，Amazon S3 将该对象版本的创建时间戳加上指定的持续时间，以此来计算*保留到期日*。然后，在您对该对象版本明确应用的单独锁定保留期限内，对象版本将受到保护。

**注意**  
当您在存储桶中 `PUT` 具有明确的单独保留模式和期限的对象版本时，该对象版本的单独对象锁定设置会覆盖所有存储桶属性保留设置。

与所有其他对象锁定设置一样，保留期限适用于各个对象版本。单个对象的不同版本可以具有不同的保留模式和周期。

例如，如果您将 15 天的对象放入 30 天保留期限，并将一个保留期限为 60 天的同名对象 `PUT` 到 Amazon S3 中。在这种情况下，您的 `PUT` 请求将成功，Amazon S3 将创建一个保留期限为 60 天的新对象版本。较旧版本将保持其原来的保留期限，并且可在 15 天内删除。

在某个对象版本上应用了保留设置后，您可以延长保留期限。要执行此操作，您需对该对象版本提交新对象锁定请求，其*保留到期日*晚于当前为该对象版本配置的保留到期日期。Amazon S3 将用更长的新期限替换现有的保留期限。任何用户只要具有实施对象保留期限的权限，即可对象版本的保留期限。要设置保留期限，您必须具有 `s3:PutObjectRetention` 权限。

在对象或 S3 存储桶上设置保留权期限时，您必须选择两种保留模式之一：*合规性*或*监管*。

### 保留模式
<a name="object-lock-retention-modes"></a>

S3 对象锁定提供了两种保留模式，可为对象应用不同级别的保护：
+ 合规性模式
+ 监管模式

在*合规性*模式中，任何用户都不能覆盖或删除受保护的对象版本，包括 AWS 账户中的根用户。在合规性模式下锁定对象后，其保留模式便无法更改，其保留期限也不能缩短。合规性模式可帮助确保在保留期限内无法覆盖或删除对象版本。

**注意**  
在合规模式下，要想在保留日期到期前删除对象，唯一的方法就是删除相关的 AWS 账户。

在*监管* 模式中，除非用户具有特殊权限，否则用户不能覆盖或删除对象版本，或更改其锁定设置。使用监管模式，您可以保护对象以免被大多数用户删除，但您仍可向部分用户授予权限，以在必要时更改保留设置或删除对象。您还可以在创建合规性模式保留期限之前使用监管模式测试保留期限设置。

要覆盖或删除监管模式保留设置，您必须具有 `s3:BypassGovernanceRetention` 权限，并且在需要覆盖监管模式的任何请求中，必须明确包含 `x-amz-bypass-governance-retention:true` 作为请求标头。

**注意**  
默认情况下，Amazon S3 控制台包括 `x-amz-bypass-governance-retention:true` 标头。如果您尝试删除受*监管*模式保护的对象并且拥有 `s3:BypassGovernanceRetention` 权限，则操作将会成功。

### 法定保留
<a name="object-lock-legal-holds"></a>

使用对象锁定，您还可以在对象版本上实施*依法保留*。与保留期限相似，依法保留可防止对象版本被覆盖或删除。但是，依法保留没有关联的固定时间长度，会一直有效，直至删除。拥有 `s3:PutObjectLegalHold` 权限的任何用户均可自由实施和删除依法保留。

依法保留与保留期限无关。对对象版本实施依法保留不会影响该对象版本的保留模式或保留期限。

例如，假设您对某一对象版本实施依法保留，同时该对象版本也受保留期限保护。如果保留期限过期，该对象不会失去其 WORM 保护。那么依法保留将继续保护该对象，直至授权用户明确删除依法保留对象。与之相似，如果您在对象版本的保留期限生效时删除依法保留，该对象版本将一直受保护，直至保留期限过期。

### 删除如何处理 S3 对象锁定
<a name="object-lock-how-deletes-work"></a>

如果存储桶启用了 S3 对象锁定，并且该对象受保留期或法定保留的保护，而您尝试删除某个对象，则 Amazon S3 会返回以下响应之一，具体取决于您尝试删除该对象的方式：
+ **永久 `DELETE` 请求**：如果您发出了永久 `DELETE` 请求（指定版本 ID 的请求），则当您尝试删除对象时，Amazon S3 会返回拒绝访问 (`403 Forbidden`) 错误。有关排查与对象锁定有关的拒绝访问错误的更多信息，请参阅 [S3 对象锁定设置](troubleshoot-403-errors.md#troubleshoot-403-object-lock)。
+ **简单 `DELETE` 请求**：如果您发出了简单 `DELETE` 请求（未指定版本 ID 的请求），Amazon S3 将返回 `200 OK` 响应并在存储桶中插入[删除标记](DeleteMarker.md)，该标记将成为具有新 ID 的对象的当前版本。有关管理具有对象锁定的删除标记的更多信息，请参阅[使用对象锁定管理删除标记](object-lock-managing.md#object-lock-managing-delete-markers)。

### 使用 S3 对象锁定的最佳实践
<a name="object-lock-best-practices"></a>

如果您想保护对象在预定义的保留期内不被大多数用户删除，但同时又希望一些具有特殊权限的用户能够灵活地更改保留设置或删除对象，请考虑使用*监管模式*。

如果您从不希望任何用户（包括您的 AWS 账户中的根用户）能够在预定义的保留期内删除对象，请考虑使用*合规模式*。如果您需要存储合规数据，则可以使用此模式。

当您不确定要让对象保持不可变的时长时，可以使用*依法保留*。这可能是因为您即将对数据进行外部审计，并希望在审计完成之前保持对象不可变。或者，您可能有一个正在进行的项目，而您希望在项目完成之前，让该项目使用的数据集保持不变。

### 所需的权限
<a name="object-lock-permissions"></a>

对象锁定操作需要特定的权限。根据您正在尝试的确切操作，您可能需要以下任意权限：
+ `s3:BypassGovernanceRetention`
+ `s3:GetBucketObjectLockConfiguration`
+ `s3:GetObjectLegalHold`
+ `s3:GetObjectRetention`
+ `s3:PutBucketObjectLockConfiguration`
+ `s3:PutObjectLegalHold`
+ `s3:PutObjectRetention`

有关 Amazon S3 权限的完整列表及其描述，请参阅《Service Authorization Reference》**中的 [Actions, resources, and condition keys for Amazon S3](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html)。

有关按 S3 资源类型对 S3 API 操作的权限的更多信息，请参阅 [Amazon S3 API 操作所需的权限](using-with-s3-policy-actions.md)。

有关将条件与权限结合使用的信息，请参阅 [使用条件键的存储桶策略示例](amazon-s3-policy-keys.md)。