

# Amazon S3 存储桶策略的示例
<a name="example-bucket-policies"></a>

使用 Amazon S3 存储桶策略，您可以保护对存储桶中对象的访问，这样，只有具有适当权限的用户才能访问它们。您甚至可以阻止没有适当权限的经过身份验证的用户访问您的 Amazon S3 资源。

本节介绍关于存储桶策略的典型使用案例的示例。这些示例策略将 `amzn-s3-demo-bucket` 用作资源值。要测试这些策略，您需要将 `user input placeholders` 替换为您自己的信息（例如存储桶名称）。

要授予或拒绝对一组对象的权限，可以在 Amazon资源名称（ARN）和其他值中使用通配符（`*`）。例如，您可以控制对以通用[前缀](https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#keyprefix)或以特定扩展名结尾的对象组的访问，例如 `.html`。

有关 AWS Identity and Access Management（IAM）策略语言的更多信息，请参阅[Amazon S3 中的策略和权限](access-policy-language-overview.md)。

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

**注意**  
使用 Amazon S3 控制台测试权限时，您必须授予控制台所需的其他权限（`s3:ListAllMyBuckets`、`s3:GetBucketLocation` 和 `s3:ListBucket`）。有关向用户授予权限并使用控制台测试这些权限的示例演练，请参阅[使用用户策略控制对存储桶的访问](walkthrough1.md)。

用于创建存储桶策略的其它资源包括以下内容：
+ 有关在创建存储桶策略时可以使用的 IAM 策略操作、资源和条件键的列表，请参阅《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)。
+ 有关创建 S3 策略的指南，请参阅[使用 Amazon S3 控制台添加存储桶策略](add-bucket-policy.md)。
+ 要对策略错误进行故障排查，请参阅[排查 Amazon S3 中的拒绝访问（403 Forbidden）错误](troubleshoot-403-errors.md)。

如果您在添加或更新策略时遇到问题，请参阅 AWS re:Post 知识中心中的[我尝试更新 Amazon S3 存储桶策略时，为什么会收到“策略中的主体无效”错误？](https://repost.aws/knowledge-center/s3-invalid-principal-in-policy-error)

**Topics**
+ [向公共匿名用户授予只读权限](#example-bucket-policies-anonymous-user)
+ [需要加密](#example-bucket-policies-encryption)
+ [使用标准 ACL 管理存储桶](#example-bucket-policies-public-access)
+ [使用对象标记管理对象访问权限](#example-bucket-policies-object-tags)
+ [使用全局条件键管理对象访问权限](#example-bucket-policies-global-condition-keys)
+ [管理基于 HTTP 或 HTTPS 请求的访问权限](#example-bucket-policies-HTTP-HTTPS)
+ [管理用户对特定文件夹的访问权限](#example-bucket-policies-folders)
+ [管理访问日志的访问权限](#example-bucket-policies-access-logs)
+ [管理对 Amazon CloudFront OAI 的访问](#example-bucket-policies-cloudfront)
+ [管理 Amazon S3 Storage Lens 存储统计管理工具的访问权限](#example-bucket-policies-lens)
+ [管理 S3 清单、S3 分析和 S3 清单报告的权限](#example-bucket-policies-s3-inventory)
+ [需要 MFA](#example-bucket-policies-MFA)
+ [防止用户删除对象](#using-with-s3-actions-related-to-bucket-subresources)

## 向公共匿名用户授予只读权限
<a name="example-bucket-policies-anonymous-user"></a>

可以使用策略设置向公共匿名用户授予访问权限，如果您要将存储桶配置为静态网站，这将非常有用。向公共匿名用户授予访问权限要求您对存储桶禁用“屏蔽公共访问权限”设置。有关更多信息以及如何执行此操作，请参阅[设置访问网站的权限](WebsiteAccessPermissionsReqd.md)。要了解如何出于相同的目的设置更严格的策略，请参阅 AWS 知识中心的[如何授予对 Amazon S3 存储桶中某些对象的公共读取访问权限？](https://repost.aws/knowledge-center/read-access-objects-s3-bucket)。

默认情况下，Amazon S3 阻止对您的账户和存储桶的公有访问权限。如果要使用存储桶托管静态网站，您可以使用以下步骤编辑您的屏蔽公共访问权限设置。

**警告**  
在完成这些步骤之前，请查看[阻止对您的 Amazon S3 存储的公有访问](access-control-block-public-access.md)，来确保您了解并接受支持公共访问权限所涉及的风险。当您关闭屏蔽公共访问权限设置以使您的存储桶变为公有时，Internet 上的任何人都可以访问您的存储桶。我们建议您阻止对存储桶的所有公有访问。

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 请选择已配置为静态网站的存储桶的名称。

1. 选择**权限**。

1. 在**屏蔽公共访问权限（存储桶设置）**下，请选择**编辑**。

1. 清除**阻止*所有*公有访问**，然后选择**保存更改**。  
![\[Amazon S3 控制台，显示屏蔽公共访问权限存储桶设置。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/edit-public-access-clear.png)

   Amazon S3 关闭了存储桶的屏蔽公共访问权限设置。要创建公有静态网站，可能还必须[为您的账户配置屏蔽公共访问权限设置](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/block-public-access-account.html)，然后再添加存储桶策略。如果当前已开启账户的屏蔽公共访问权限设置，您将在**屏蔽公共访问权限（存储桶设置）**下看到一条备注。

## 需要加密
<a name="example-bucket-policies-encryption"></a>

您可以要求使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS），如以下示例所示。

### 要求对写入存储桶的所有对象使用 SSE-KMS
<a name="example-bucket-policies-encryption-1"></a>

以下示例策略要求写入存储桶的每个对象都通过使用 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）进行加密。如果对象未使用 SSE-KMS 进行加密，则请求将被拒绝。

------
#### [ JSON ]

****  

```
{
"Version":"2012-10-17",		 	 	 
"Id": "PutObjPolicy",
"Statement": [{
  "Sid": "DenyObjectsThatAreNotSSEKMS",
  "Principal": "*",
  "Effect": "Deny",
  "Action": "s3:PutObject",
  "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
  "Condition": {
    "Null": {
      "s3:x-amz-server-side-encryption-aws-kms-key-id": "true"
    }
  }
}]
}
```

------

### 要求对写入存储桶的所有对象使用具有特定 AWS KMS key 的 SSE-KMS
<a name="example-bucket-policies-encryption-2"></a>

如果未使用特定的 KMS 密钥 ID 通过 SSE-KMS 加密任何对象，则以下示例策略会拒绝将此类对象写入存储桶。即使使用每请求标头或存储桶默认加密通过 SSE-KMS 加密对象，但如果尚未使用指定的 KMS 密钥加密对象，则无法将其写入存储桶。确保将本示例中使用的 KMS 密钥 ARN 替换为您自己的 KMS 密钥 ARN。

------
#### [ JSON ]

****  

```
{
"Version":"2012-10-17",		 	 	 
"Id": "PutObjPolicy",
"Statement": [{
  "Sid": "DenyObjectsThatAreNotSSEKMSWithSpecificKey",
  "Principal": "*",
  "Effect": "Deny",
  "Action": "s3:PutObject",
  "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
  "Condition": {
    "ArnNotEqualsIfExists": {
      "s3:x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-east-1:111122223333:key/01234567-89ab-cdef-0123-456789abcdef"
    }
  }
}]
}
```

------

## 使用标准 ACL 管理存储桶
<a name="example-bucket-policies-public-access"></a>

### 授予多个账户上传对象或设置对象 ACL 以进行公有访问的权限
<a name="example-bucket-policies-acl-1"></a>

以下示例策略向多个 AWS 账户授予 `s3:PutObject` 和 `s3:PutObjectAcl` 权限。此外，该示例策略还要求针对这些操作的任何请求都必须包含 `public-read` [标准访问控制列表（ACL）](acl-overview.md#canned-acl)。有关更多信息，请参阅[Amazon S3 的策略操作](security_iam_service-with-iam.md#security_iam_service-with-iam-id-based-policies-actions)和[Amazon S3 的策略条件键](security_iam_service-with-iam.md#security_iam_service-with-iam-id-based-policies-conditionkeys)。

**警告**  
`public-read` 标准 ACL 允许世界上的任何人查看您存储桶中的对象。在授予对 Amazon S3 存储桶的匿名访问权限或禁用屏蔽公共访问权限设置时，请小心谨慎。如果您授予匿名访问权限，那么世界上的任何人都可以访问您的存储桶。我们建议您永远不要授予对 Amazon S3 存储桶的匿名访问权限，除非您明确需要，如使用[静态网站托管](WebsiteHosting.md)时。如果您想为静态网站托管启用屏蔽公共访问权限设置，请参阅[教程：在 Amazon S3 上配置静态网站](https://docs.aws.amazon.com/AmazonS3/latest/userguide/HostingWebsiteOnS3Setup.html)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AddPublicReadCannedAcl",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:root",
                    "arn:aws:iam::444455556666:root"
                ]
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": [
                        "public-read"
                    ]
                }
            }
        }
    ]
}
```

------

### 在授予上传对象的跨账户权限的同时，确保存储桶拥有者拥有完全控制权
<a name="example-bucket-policies-acl-2"></a>

以下示例说明如何允许另一个 AWS 账户将对象上传到存储桶，同时确保您完全控制上传的对象。此策略向特定 AWS 账户（*`111122223333`*）授予上传对象的能力，但仅当该账户在上传时包含 `bucket-owner-full-control` 标准 ACL 时才能上传对象。该策略中的 `StringEquals` 条件指定 `s3:x-amz-acl` 条件键以表示标准 ACL 要求。有关更多信息，请参阅 [Amazon S3 的策略条件键](security_iam_service-with-iam.md#security_iam_service-with-iam-id-based-policies-conditionkeys)。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
     {
       "Sid":"PolicyForAllowUploadWithACL",
       "Effect":"Allow",
       "Principal":{"AWS":"111122223333"},
       "Action":"s3:PutObject",
       "Resource":"arn:aws:s3:::amzn-s3-demo-bucket/*",
       "Condition": {
         "StringEquals": {"s3:x-amz-acl":"bucket-owner-full-control"}
       }
     }
   ]
}
```

------

## 使用对象标记管理对象访问权限
<a name="example-bucket-policies-object-tags"></a>

### 允许用户仅读取具有特定标签键和值的对象
<a name="example-bucket-policies-tagging-1"></a>

以下权限策略限制用户只能读取具有 `environment: production` 标签键和值的对象。该策略使用 `s3:ExistingObjectTag` 条件键来指定标签键和值。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Principal":{
            "AWS":"arn:aws:iam::111122223333:role/JohnDoe"
         },
         "Effect":"Allow",
         "Action":[
            "s3:GetObject",
            "s3:GetObjectVersion"
         ],
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket/*",
         "Condition":{
            "StringEquals":{
               "s3:ExistingObjectTag/environment":"production"
            }
         }
      }
   ]
}
```

------

### 限制用户可以添加哪些对象标签键
<a name="example-bucket-policies-tagging-2"></a>

以下示例策略将向用户授予执行 `s3:PutObjectTagging` 操作的权限，这使用户可以将标签添加到现有对象。条件使用 `s3:RequestObjectTagKeys` 条件键指定允许的标签键，例如 `Owner` 或 `CreationDate`。有关更多信息，请参阅《IAM 用户指南》**中的[创建测试多个键值的条件](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_multi-value-conditions.html)。

该策略确保在请求中指定的每个标签键都是授权的标签键。条件中的 `ForAnyValue` 限定符确保请求中必须至少存在指定的值之一。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
  "Statement": [
    {"Principal":{"AWS":[
            "arn:aws:iam::111122223333:role/JohnDoe"
         ]
       },
 "Effect": "Allow",
      "Action": [
        "s3:PutObjectTagging"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/*"
      ],
      "Condition": {"ForAnyValue:StringEquals": {"s3:RequestObjectTagKeys": [
            "Owner",
            "CreationDate"
          ]
        }
      }
    }
  ]
}
```

------

### 在允许用户添加对象标签时需要特定的标签键和值
<a name="example-bucket-policies-tagging-3"></a>

以下示例策略将向用户授予执行 `s3:PutObjectTagging` 操作的权限，这使用户可以将标签添加到现有对象。条件要求用户包含值设置为 `X` 的特定标签键（`Project`)。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
  "Statement": [
    {"Principal":{"AWS":[
       "arn:aws:iam::111122223333:user/JohnDoe"
         ]
       },
      "Effect": "Allow",
      "Action": [
        "s3:PutObjectTagging"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/*"
      ],
      "Condition": {"StringEquals": {"s3:RequestObjectTag/Project": "X"
        }
      }
    }
  ]
}
```

------

### 允许用户仅添加具有特定对象标签键和值的对象
<a name="example-bucket-policies-tagging-4"></a>

以下示例策略向用户授予执行 `s3:PutObject` 操作的权限，以便他们可以向存储桶添加对象。但是，`Condition` 语句限制了上传的对象上允许的标签键和值。在此示例中，用户只可以将具有特定标签键（`Department`）（值设置为 `Finance`）的对象添加到存储桶。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
        "Principal":{
            "AWS":[
                 "arn:aws:iam::111122223333:user/JohnDoe"
         ]
        },
        "Effect": "Allow",
        "Action": [
            "s3:PutObject"
        ],
        "Resource": [
            "arn:aws:s3:::amzn-s3-demo-bucket/*"
        ],
        "Condition": {
            "StringEquals": {
                "s3:RequestObjectTag/Department": "Finance"
            }
        }
    }]
}
```

------

## 使用全局条件键管理对象访问权限
<a name="example-bucket-policies-global-condition-keys"></a>

[全局条件键](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html)是带有 `aws` 前缀的条件键。AWS 服务 可以支持全局条件键或包含服务前缀的服务特定键。您可以使用 JSON 策略的 `Condition` 元素将请求中的键与您在策略中指定的键值进行比较。

### 限制只能访问 Amazon S3 服务器访问日志传输
<a name="example-bucket-policies-global-condition-keys-1"></a>

在下面的示例存储桶策略中，[https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 全局条件键用于比较资源的 [Amazon资源名称（ARN）](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns)，从而使用在策略中指定的 ARN 发出服务对服务请求。`aws:SourceArn` 全局条件键用于防止 Amazon S3 服务在服务之间执行事务时被用作[混淆代理人](https://docs.aws.amazon.com//IAM/latest/UserGuide/confused-deputy.html)。只有 Amazon S3 服务才能将对象添加到 Amazon S3 存储桶。

此示例存储桶策略仅向日志服务主体（`logging.s3.amazonaws.com`）授予 `s3:PutObject` 权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowPutObjectS3ServerAccessLogsPolicy",
            "Principal": {
                "Service": "logging.s3.amazonaws.com"
            },
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket-logs/*",
            "Condition": {
                "StringEquals": {
                "aws:SourceAccount": "111122223333"
                },
                "ArnLike": {
                "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-source-bucket1"
                }
            }
        },
        {
            "Sid": "RestrictToS3ServerAccessLogs",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket-logs/*",
            "Condition": {
                "ForAllValues:StringNotEquals": {
                    "aws:PrincipalServiceNamesList": "logging.s3.amazonaws.com"
                }
            }
        }
    ]
}
```

------

### 仅允许访问您的组织
<a name="example-bucket-policies-global-condition-keys-2"></a>

如果您希望要求访问资源的所有 [IAM 主体](https://docs.aws.amazon.com//IAM/latest/UserGuide/intro-structure.html#intro-structure-principal)都来自组织中的 AWS 账户（包括 AWS Organizations 管理账户），则可以使用 `aws:PrincipalOrgID` 全局条件键。

要授予或限制此类访问权限，请在存储桶策略中定义 `aws:PrincipalOrgID` 条件并将值设置为您的[组织 ID](https://docs.aws.amazon.com//organizations/latest/userguide/orgs_manage_org_details.html)。组织 ID 用于控制对存储桶的访问权限。当您使用 `aws:PrincipalOrgID` 条件时，存储桶策略中的权限也将应用于添加到组织的所有新账户。

以下是一个基于资源的存储桶策略的示例，您可以使用该策略向组织中的特定 IAM 主体授予对存储桶的直接访问权限。通过向您的存储桶策略添加 `aws:PrincipalOrgID` 全局条件键，主体账户现在必须在您的组织中才能访问资源。即使您在授予访问权限时意外指定了错误的账户，[aws:PrincipalOrgID 全局条件键](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalorgid)也可以起到额外保护作用。当在策略中使用该全局键时，此策略防止指定组织之外的所有主体访问 S3 存储桶。只有来自所列组织中账户的主体才能获得对资源的访问权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
        "Sid": "AllowGetObject",
        "Principal": {
            "AWS": "*"
        },
        "Effect": "Allow",
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
        "Condition": {
            "StringEquals": {
                "aws:PrincipalOrgID": ["o-aa111bb222"]
            }
        }
    }]
}
```

------

## 管理基于 HTTP 或 HTTPS 请求的访问权限
<a name="example-bucket-policies-HTTP-HTTPS"></a>

### 仅限 HTTPS 请求访问
<a name="example-bucket-policies-use-case-HTTP-HTTPS-1"></a>

如果您想防止潜在攻击者操纵网络流量，则可以使用 HTTPS（TLS）以仅允许加密连接，同时限制 HTTP 请求访问您的存储桶。要确定请求是 HTTP 还是 HTTPS，请在 S3 存储桶策略中使用 [https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-securetransport](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-securetransport) 全局条件键。`aws:SecureTransport` 条件键检查请求是不是使用 HTTP 发送的。

如果请求返回 `true`，则该请求是通过 HTTPS 发送的。如果请求返回 `false`，则该请求是通过 HTTP 发送的。然后，您可以根据所需的请求方案允许或拒绝对存储桶的访问。

在以下示例中，存储桶策略明确拒绝 HTTP 请求。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
        "Sid": "RestrictToTLSRequestsOnly",
        "Action": "s3:*",
        "Effect": "Deny",
        "Resource": [
            "arn:aws:s3:::amzn-s3-demo-bucket",
            "arn:aws:s3:::amzn-s3-demo-bucket/*"
        ],
        "Condition": {
            "Bool": {
                "aws:SecureTransport": "false"
            }
        },
        "Principal": "*"
    }]
}
```

------

### 仅限特定 HTTP 引用站点访问
<a name="example-bucket-policies-HTTP-HTTPS-2"></a>

假设您拥有一个网站，其域名为 *`www.example.com`* 或 *`example.com`*，并且带有指向存储在名为 `amzn-s3-demo-bucket` 的存储桶中的照片和视频的链接。默认情况下，所有 Amazon S3 资源都是私有的，因此，只有创建资源的 AWS 账户才能访问它们。

要允许从您的网站对这些对象进行读取访问，您可以添加一个存储桶策略，以允许 `s3:GetObject` 权限并附带一个条件，即 `GET` 请求必须源自特定的网页。以下策略通过使用 `StringLike` 条件和 `aws:Referer` 条件键来限制请求。

确保您使用的浏览器在请求中包含 HTTP `referer` 标头。

**警告**  
我们建议您谨慎使用 `aws:Referer` 条件键。包含公共已知的 HTTP 引用站点标头值是非常危险的。未经授权方可能会使用修改的浏览器或自定义浏览器提供他们选择的任何 `aws:Referer` 值。因此，请勿使用 `aws:Referer` 防止未经授权的各方直接进行 AWS 请求。  
提供 `aws:Referer` 条件键只是为了允许客户保护其数字内容（如存储在 Amazon S3 中的内容），以免在未经授权的第三方站点上引用。有关更多信息，请参阅《IAM 用户指南》**中的 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-referer](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-referer)。

## 管理用户对特定文件夹的访问权限
<a name="example-bucket-policies-folders"></a>

### 授予用户对特定文件夹的访问权限
<a name="example-bucket-policies-folders-1"></a>

假设您正在尝试授予用户对特定文件夹的访问权限。如果 IAM 用户和 S3 存储桶属于同一个 AWS 账户，则您可以使用 IAM 策略向用户授予对特定存储桶文件夹的访问权限。使用这种方法，您无需更新存储桶策略即可授予访问权限。您可以将 IAM 策略添加到多个用户可以切换到的 IAM 角色。

如果 IAM 身份和 S3 存储桶属于不同的 AWS 账户，则您必须在 IAM 策略和存储桶策略中授予跨账户访问权限。有关授予跨账户访问权限的信息，请参阅[存储桶拥有者授予跨账户存储桶权限](https://docs.aws.amazon.com//AmazonS3/latest/userguide/example-walkthroughs-managing-access-example2.html)。

以下示例存储桶策略仅授予 `JohnDoe` 对他的文件夹（`home/JohnDoe/`）的完全控制台访问权限。通过创建 `home` 文件夹并向您的用户授予相应的权限，您可以让多个用户共享单个存储桶。该策略由三条 `Allow` 语句组成：
+ `AllowRootAndHomeListingOfCompanyBucket`：允许用户（`JohnDoe`）列出 `amzn-s3-demo-bucket` 存储桶的根级别和 `home` 文件夹中的对象。此语句还允许用户使用控制台根据前缀 `home/` 进行搜索。
+ `AllowListingOfUserFolder`：允许用户（`JohnDoe`）列出 `home/JohnDoe/` 文件夹和任何子文件夹中的所有对象。
+ `AllowAllS3ActionsInUserFolder`：允许用户通过授予 `Read`、`Write` 和 `Delete` 权限来执行所有 Amazon S3 操作。权限仅限于存储桶拥有者的主文件夹。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowRootAndHomeListingOfCompanyBucket",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:user/JohnDoe"
                ]
            },
            "Effect": "Allow",
            "Action": ["s3:ListBucket"],
            "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket"],
            "Condition": {
                "StringEquals": {
                    "s3:prefix": ["", "home/", "home/JohnDoe"],
                    "s3:delimiter": ["/"]
                }
            }
        },
        {
            "Sid": "AllowListingOfUserFolder",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:user/JohnDoe"
                ]
            },
            "Action": ["s3:ListBucket"],
            "Effect": "Allow",
            "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket"],
            "Condition": {
                "StringLike": {
                    "s3:prefix": ["home/JohnDoe/*"]
                }
            }
        },
        {
            "Sid": "AllowAllS3ActionsInUserFolder",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:user/JohnDoe"
                ]
            },
            "Action": ["s3:*"],
            "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket/home/JohnDoe/*"]
        }
    ]
}
```

------

## 管理访问日志的访问权限
<a name="example-bucket-policies-access-logs"></a>

### 授予应用程序负载均衡器访问权限以启用访问日志
<a name="example-bucket-policies-access-logs-1"></a>

在为应用程序负载均衡器启用访问日志时，您必须指定负载均衡器将在其中[存储日志](https://docs.aws.amazon.com//elasticloadbalancing/latest/application/enable-access-logging.html#access-log-create-bucket)的 S3 存储桶的名称。存储桶必须具有[附加的策略](https://docs.aws.amazon.com//elasticloadbalancing/latest/application/enable-access-logging.html#attach-bucket-policy)，用于为弹性负载均衡授予写入存储桶的权限。

在以下示例中，存储桶策略授予弹性负载均衡（ELB）将访问日志写入存储桶的权限：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/prefix/AWSLogs/111122223333/*"
        }
    ]
}
```

------

**注意**  
请务必将 `elb-account-id` 替换为您的 AWS 区域的弹性负载均衡的 AWS 账户 ID。有关弹性负载均衡区域的列表，请参阅《弹性负载均衡用户指南》**中的[将策略附加到您的 Amazon S3 存储桶](https://docs.aws.amazon.com//elasticloadbalancing/latest/classic/enable-access-logs.html#attach-bucket-policy)。

如果您的 AWS 区域未出现在支持的弹性负载均衡区域列表中，请使用以下策略，该策略授予对指定日志传输服务的权限。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
       "Principal": {
         "Service": "logdelivery.elasticloadbalancing.amazonaws.com"
          },
      "Effect": "Allow",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/prefix/AWSLogs/111122223333/*"
    }
  ]
}
```

------

然后，确保通过启用您的[弹性负载均衡访问日志](https://docs.aws.amazon.com//elasticloadbalancing/latest/application/enable-access-logging.html#enable-access-logs)来配置它们。您可以通过创建测试文件来[验证您的存储桶权限](https://docs.aws.amazon.com//elasticloadbalancing/latest/application/enable-access-logging.html#verify-bucket-permissions)。

## 管理对 Amazon CloudFront OAI 的访问
<a name="example-bucket-policies-cloudfront"></a>

### 向 Amazon CloudFront OAI 授予权限
<a name="example-bucket-policies-cloudfront-1"></a>

下面的示例存储桶策略授予 CloudFront 来源访问身份（OAI）权限，以获取（读取）S3 存储桶中的所有对象。您可以使用 CloudFront OAI 以允许用户通过 CloudFront 访问存储桶中的对象，但不能直接通过 Amazon S3 访问。有关更多信息，请参阅《Amazon CloudFront 开发人员指南》**中的[使用来源访问身份限制对 Amazon S3 内容的访问](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html)。

下面的策略使用 OAI 的 ID 作为策略的 `Principal`。有关使用 S3 存储桶策略向 CloudFront OAI 授予访问权限的更多信息，请参阅《Amazon CloudFront 开发人员指南》**中的[从来源访问身份（OAI）迁移到来源访问控制（OAC)](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html#migrate-from-oai-to-oac)。

要使用此示例，请执行以下操作：
+ 将 `EH1HDMB1FH2TC` 替换为 OAI 的 ID。要查找 OAI 的 ID，请参阅 CloudFront 控制台中的[来源访问身份页面](https://console.aws.amazon.com/cloudfront/home?region=us-east-1#oai:)，或者使用 CloudFront API 中的 [https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ListCloudFrontOriginAccessIdentities.html](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ListCloudFrontOriginAccessIdentities.html)。
+ 将 `amzn-s3-demo-bucket` 替换为您的存储桶的名称。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EH1HDMB1FH2TC"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
        }
    ]
}
```

------

## 管理 Amazon S3 Storage Lens 存储统计管理工具的访问权限
<a name="example-bucket-policies-lens"></a>

### 授予 Amazon S3 Storage Lens 存储统计管理工具的权限
<a name="example-bucket-policies-lens-1"></a>

S3 Storage Lens 存储统计管理工具聚合您的指标，并在 Amazon S3 控制台的 **Buckets**（存储桶）页上的 **Account snapshot**（账户快照）部分中显示此信息。S3 Storage Lens 存储统计管理工具还提供了一个交互式控制面板，您可以使用它来可视化见解和趋势，标记异常值，并接收有关优化存储成本和应用数据保护最佳实践的建议。控制面板提供深入分析选项，用于在组织、账户、AWS 区域、存储类、存储桶、前缀或 Storage Lens 组级别生成和可视化见解。您还可以将 CSV 或 Parquet 格式的每日指标报告发送到 S3 通用存储桶，或者将指标直接导出到 AWS 托管的 S3 表存储桶。

S3 Storage Lens 存储统计管理工具可以将聚合的存储使用情况指标导出到 Amazon S3 存储桶中，以便进一步分析。S3 Storage Lens 存储统计管理工具放置其指标导出的存储桶称为*目标存储桶*。在设置 S3 Storage Lens 存储统计管理工具指标导出时，您必须为目标存储桶制定存储桶策略。有关更多信息，请参阅 [使用 Amazon S3 Storage Lens 存储统计管理工具监控您的存储活动和使用情况](storage_lens.md)。

以下示例存储桶策略授予 Amazon S3 向目标存储桶写入对象（`PUT` 请求）的权限。在设置 S3 Storage Lens 存储统计管理工具指标导出时，您可以对目标存储桶使用类似这样的存储桶策略。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "S3StorageLensExamplePolicy",
            "Effect": "Allow",
            "Principal": {
                "Service": "storage-lens.s3.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-destination-bucket/destination-prefix/StorageLens/111122223333/*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control",
                    "aws:SourceAccount": "111122223333",
                    "aws:SourceArn": "arn:aws:s3:region-code:111122223333:storage-lens/storage-lens-dashboard-configuration-id"
                }
            }
        }
    ]
}
```

------

在设置 S3 Storage Lens 存储统计管理工具组织级别的指标导出时，对之前存储桶策略的 `Resource` 语句进行以下修改。

```
1. "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/destination-prefix/StorageLens/your-organization-id/*",
```

## 管理 S3 清单、S3 分析和 S3 清单报告的权限
<a name="example-bucket-policies-s3-inventory"></a>

### 向 S3 清单和 S3 分析功能授予权限
<a name="example-bucket-policies-s3-inventory-1"></a>

S3 清单在存储桶中创建对象列表，而 S3 分析存储类分析导出功能创建分析中使用的数据的输出文件。由清单列出其对象的存储桶称为*源存储桶*。清单文件或分析导出文件将写入到的存储桶称为*目标存储桶*。在设置清单或分析导出时，必须为目标存储桶创建存储桶策略。有关更多信息，请参阅[使用 S3 清单对数据进行编目和分析](storage-inventory.md)和[Amazon S3 分析 – 存储类分析](analytics-storage-class.md)。

以下示例存储桶策略向 Amazon S3 授予将源存储桶的账户中的对象写入（`PUT` 请求）到目标存储桶的权限。您在设置 S3 清单和 S3 分析导出功能时，将对目标存储桶使用像这样的存储桶策略。

------
#### [ JSON ]

****  

```
{  
      "Version":"2012-10-17",		 	 	 
      "Statement": [
        {
            "Sid": "InventoryAndAnalyticsExamplePolicy",
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": [
            "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
            ],
            "Condition": {
                "ArnLike": {
                "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-source-bucket"
                },
                "StringEquals": {
                    "aws:SourceAccount": "111122223333",
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}
```

------

### 控制 S3 清单报告配置的创建
<a name="example-bucket-policies-s3-inventory-2"></a>

[使用 S3 清单对数据进行编目和分析](storage-inventory.md)创建 S3 存储桶中对象的列表，并为每个对象创建元数据。`s3:PutInventoryConfiguration` 权限允许用户创建清单配置（其中包含默认情况下提供的所有可用对象元数据字段）并指定存储清单的目标存储桶。对目标存储桶中的对象具有读取权限的用户可以访问清单报告中提供的所有对象元数据字段。有关 S3 清单中提供的元数据字段的更多信息，请参阅 [Amazon S3 清单列表](storage-inventory.md#storage-inventory-contents)。

要限制用户配置 S3 清单报告，请取消该用户的 `s3:PutInventoryConfiguration` 权限。

S3 清单报告配置中的某些对象元数据字段是可选的，这意味着它们在默认情况下是可用的，但是当您向用户授予 `s3:PutInventoryConfiguration` 权限时，它们可能会受到限制。您可以使用 `s3:InventoryAccessibleOptionalFields` 条件键控制用户能否在报告中包含这些可选元数据字段。有关 S3 清单中可用的可选元数据字段的列表，请参阅《Amazon Simple Storage Service API Reference》**中的 [https://docs.aws.amazon.com//AmazonS3/latest/API/API_PutBucketInventoryConfiguration.html#API_PutBucketInventoryConfiguration_RequestBody](https://docs.aws.amazon.com//AmazonS3/latest/API/API_PutBucketInventoryConfiguration.html#API_PutBucketInventoryConfiguration_RequestBody)。

要向用户授予创建带有特定可选元数据字段的清单配置的权限，请使用 `s3:InventoryAccessibleOptionalFields` 条件键来完善存储桶策略中的条件。

以下策略示例向用户 (`Ana`) 授予有条件地创建清单配置的权限。该策略中的 `ForAllValues:StringEquals` 条件使用 `s3:InventoryAccessibleOptionalFields` 条件键来指定两个允许使用的可选元数据字段，即 `Size` 和 `StorageClass`。因此，在 `Ana` 创建清单配置时，她只可以包含可选元数据字段 `Size` 和 `StorageClass`。

------
#### [ JSON ]

****  

```
{
	"Id": "InventoryConfigPolicy",
	"Version":"2012-10-17",		 	 	 
	"Statement": [{
			"Sid": "AllowInventoryCreationConditionally",
			"Effect": "Allow",			
			"Principal": {
				"AWS": "arn:aws:iam::111122223333:user/Ana"
			},			
			"Action": 
				"s3:PutInventoryConfiguration",
			"Resource": 
				"arn:aws:s3:::DOC-EXAMPLE-SOURCE-BUCKET",
			"Condition": {
				"ForAllValues:StringEquals": {
					"s3:InventoryAccessibleOptionalFields": [
					   "Size",
					   "StorageClass"
					   ]
				  }
				}
			}
	]
}
```

------

要限制用户配置包含特定可选元数据字段的 S3 清单报告，请向源存储桶的存储桶策略中添加明确的 `Deny` 声明。以下存储桶策略示例拒绝用户 `Ana` 在源存储桶 `amzn-s3-demo-source-bucket` 中创建包含可选 `ObjectAccessControlList` 或 `ObjectOwner` 元数据字段的清单配置。用户 `Ana` 仍然可以使用其他可选元数据字段创建清单配置。

```
 1. {
 2. 	"Id": "InventoryConfigSomeFields",
 3. 	"Version": "2012-10-17",		 	 	 
 4. 	"Statement": [{
 5. 			"Sid": "AllowInventoryCreation",
 6. 			"Effect": "Allow",
 7. 			"Principal": {
 8. 				"AWS": "arn:aws:iam::111122223333:user/Ana"
 9. 			},
10. 			"Action": "s3:PutInventoryConfiguration",			
11. 			"Resource": 
12. 				"arn:aws:s3:::amzn-s3-demo-source-bucket",
13. 
14. 		},
15. 		{
16. 			"Sid": "DenyCertainInventoryFieldCreation",
17. 			"Effect": "Deny",
18. 			"Principal": {
19. 				"AWS": "arn:aws:iam::111122223333:user/Ana"
20. 			},
21. 			"Action": "s3:PutInventoryConfiguration",	
22. 			"Resource": 
23. 			  "arn:aws:s3:::amzn-s3-demo-source-bucket",			
24. 			"Condition": {
25. 				"ForAnyValue:StringEquals": {
26. 					"s3:InventoryAccessibleOptionalFields": [
27. 					   "ObjectOwner",
28. 					   "ObjectAccessControlList"
29. 					   ]
30. 				  }
31. 				}
32. 			}
33. 	]
34. }
```

**注意**  
在存储桶策略中使用 `s3:InventoryAccessibleOptionalFields` 条件键不会影响基于现有清单配置的清单报告交付。

**重要**  
我们建议将 `ForAllValues` 与 `Allow` 效果一起使用，或将 `ForAnyValue` 与 `Deny` 效果一起使用，如前面的示例所示。  
请勿将 `ForAllValues` 与 `Deny` 效果一起使用，或将 `ForAnyValue` 与 `Allow` 效果一起使用，因为这些组合可能过于严格，并且会阻止删除清单配置。  
要了解有关 `ForAllValues` 和 `ForAnyValue` 条件集运算符的更多信息，请参阅《IAM 用户指南》**中的[多值上下文键](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-single-vs-multi-valued-context-keys.html#reference_policies_condition-multi-valued-context-keys)。

## 需要 MFA
<a name="example-bucket-policies-MFA"></a>

Amazon S3 支持受 MFA 保护的 API 访问，这是一项可在访问您的 Amazon S3 资源时强制进行多重身份验证（MFA）的特征。多重验证提供了额外的安全级别，可以应用于您的 AWS 环境。MFA 是一项安全特征，要求用户通过提供有效 MFA 代码来证明实际拥有 MFA 设备。有关更多信息，请参阅 [AWS 多重身份验证](https://aws.amazon.com/mfa/)。您可以要求对访问 Amazon S3 资源的任何请求使用 MFA。

要强制实施 MFA 要求，请在存储桶策略中使用 `aws:MultiFactorAuthAge` 条件键。IAM 用户可以使用由 AWS Security Token Service（AWS STS）发布的临时凭证访问 Amazon S3 资源。您可以在 AWS STS 请求时提供 MFA 代码。

当 Amazon S3 收到带多重身份验证的请求时，`aws:MultiFactorAuthAge` 条件键将提供一个数值，指示临时凭证是在多久以前创建的（以秒为单位）。如果请求中提供的临时凭证不是使用 MFA 设备创建的，则此键值为空（缺失）。您可以在存储桶策略中添加一个条件来检查此值，如下面的示例所示。

如果请求未使用 MFA 进行身份验证，此示例策略将拒绝对 `amzn-s3-demo-bucket` 存储桶中的 *`/taxdocuments`* 文件夹执行任何 Amazon S3 操作。要了解有关 MFA 的更多信息，请参阅 *IAM 用户指南*中的[在 AWS 中使用多重身份验证 (MFA)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa.html)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "123",
    "Statement": [
      {
        "Sid": "",
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/taxdocuments/*",
        "Condition": { "Null": { "aws:MultiFactorAuthAge": true }}
      }
    ]
 }
```

------

如果 `aws:MultiFactorAuthAge` 条件键值为空，即指示请求中的临时安全凭证是在没有 MFA 设备的情况下创建的，则 `Condition` 块中的 `Null` 条件的计算结果为 `true`。

下面的存储桶策略是上述存储桶策略的扩展。以下策略包含两个策略语句。一个语句允许将存储桶（`amzn-s3-demo-bucket`）的 `s3:GetObject` 权限授予所有人。另一个语句通过要求 MFA，进一步限制对 `amzn-s3-demo-bucket/taxdocuments` 文件夹的访问。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "123",
    "Statement": [
      {
        "Sid": "DenyInsecureConnections",
        "Effect": "Deny",
        "Principal": {
            "AWS": "arn:aws:iam::111122223333:root"
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/taxdocuments/*",
        "Condition": { "Null": { "aws:MultiFactorAuthAge": true } }
      },
      {
        "Sid": "AllowGetObject",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::111122223333:root"
        },
        "Action": ["s3:GetObject"],
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
      }
    ]
 }
```

------

您可以选择使用数值条件来限制 `aws:MultiFactorAuthAge` 键的有效期。您使用 `aws:MultiFactorAuthAge` 键指定的期限独立于对请求进行身份验证时使用的临时安全凭证的生存期。

例如，除了要求 MFA 身份验证外，下面的存储桶策略还会查看临时会话是在多久以前创建的。如果 `aws:MultiFactorAuthAge` 键值指示临时会话是在一个小时 (3600 秒) 之前创建的，则策略将拒绝任何操作。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "123",
    "Statement": [
      {
        "Sid": "",
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/taxdocuments/*",
        "Condition": {"Null": {"aws:MultiFactorAuthAge": true }}
      },
      {
        "Sid": "",
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/taxdocuments/*",
        "Condition": {"NumericGreaterThan": {"aws:MultiFactorAuthAge": 3600 }}
       },
       {
         "Sid": "",
         "Effect": "Allow",
         "Principal": "*",
         "Action": ["s3:GetObject"],
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
       }
    ]
 }
```

------

## 防止用户删除对象
<a name="using-with-s3-actions-related-to-bucket-subresources"></a>

默认状态下，用户没有权限。但在创建策略时，您可能无意间向用户授予了您并不打算授予的权限。为避免这些权限漏洞，可通过添加显式拒绝编写更严格的访问策略。

要显式阻止用户或账户删除对象，您必须在存储桶策略中添加以下操作：`s3:DeleteObject`、`s3:DeleteObjectVersion` 和 `s3:PutLifecycleConfiguration` 权限。所有三个操作均为必需，因为您可通过显式调用 `DELETE Object` API 操作或配置其生命周期来删除对象（请参阅[管理对象的生命周期](object-lifecycle-mgmt.md)），以便 Amazon S3 能够在对象生命周期已过时将它们移除。

在以下策略示例中，您显式对用户 `MaryMajor` 拒绝 `DELETE Object` 权限。显式 `Deny` 语句始终取代授予的其它任何权限。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "statement1",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:user/MaryMajor"
      },
      "Action": [
        "s3:GetObjectVersion",
        "s3:GetBucketAcl"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket1",
	 	"arn:aws:s3:::amzn-s3-demo-bucket1/*"
      ]
    },
    {
      "Sid": "statement2",
      "Effect": "Deny",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:user/MaryMajor"
      },
      "Action": [
        "s3:DeleteObject",
        "s3:DeleteObjectVersion",
        "s3:PutLifecycleConfiguration"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket1",
	    "arn:aws:s3:::amzn-s3-demo-bucket1/*"
      ]
    }
  ]
}
```

------