

# Amazon S3 基于身份的策略示例
<a name="example-policies-s3"></a>

本节介绍用于控制对 Amazon S3 的访问权限的几个基于 AWS Identity and Access Management（IAM）身份的策略示例。有关*存储桶策略*（基于资源的策略）的示例，请参阅 [Amazon S3 的存储桶策略](bucket-policies.md)。有关 IAM 策略语言的信息，请参阅[Amazon S3 中的策略和权限](access-policy-language-overview.md)。

如果以编程方式使用以下示例策略，它们将正常工作。不过，要在 Amazon S3 控制台中使用这些策略，您必须授予控制台所需的额外权限。有关使用策略（例如与 Amazon S3 控制台一起使用的策略）的信息，请参阅 [使用用户策略控制对存储桶的访问](walkthrough1.md)。

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

**Topics**
+ [允许 IAM 用户访问某个存储桶](#iam-policy-ex0)
+ [允许每个 IAM 用户访问存储桶中的文件夹](#iam-policy-ex1)
+ [允许组在 Amazon S3 中拥有共享的文件夹](#iam-policy-ex2)
+ [允许所有用户读取存储桶的某个部分中的对象](#iam-policy-ex3)
+ [允许合作伙伴将文件放置到存储桶的特定部分中](#iam-policy-ex4)
+ [限制对特定 AWS 账户中 Amazon S3 存储桶的访问](#iam-policy-ex6)
+ [限制企业单位内对 Amazon S3 存储桶的访问](#iam-policy-ex7)
+ [限制对企业内 Amazon S3 存储桶的访问](#iam-policy-ex8)
+ [为 AWS 账户授予检索 PublicAccessBlock 配置的权限](#using-with-s3-actions-related-to-accountss)
+ [将存储桶的创建限制在一个区域](#condition-key-bucket-ops-1)

## 允许 IAM 用户访问某个存储桶
<a name="iam-policy-ex0"></a>

在本例中，您想要向您 AWS 账户中的一位 IAM 用户授予访问其中一个存储桶 *amzn-s3-demo-bucket1* 的权限，并使该用户能够添加、更新和删除对象。

除了授予该用户 `s3:PutObject`、`s3:GetObject` 和 `s3:DeleteObject` 权限外，此策略还授予 `s3:ListAllMyBuckets`、`s3:GetBucketLocation` 和 `s3:ListBucket` 权限。这些是控制台所需的其他权限。此外，`s3:PutObjectAcl` 和 `s3:GetObjectAcl` 操作需要能够在控制台中复制、剪切和粘贴对象。有关向用户授予权限并使用控制台测试这些权限的示例演练，请参阅 [使用用户策略控制对存储桶的访问](walkthrough1.md)。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action": "s3:ListAllMyBuckets",
         "Resource":"*"
      },
      {
         "Effect":"Allow",
         "Action":["s3:ListBucket","s3:GetBucketLocation"],
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1"
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:PutObject",
            "s3:PutObjectAcl",
            "s3:GetObject",
            "s3:GetObjectAcl",
            "s3:DeleteObject"
         ],
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/*"
      }
   ]
}
```

------

## 允许每个 IAM 用户访问存储桶中的文件夹
<a name="iam-policy-ex1"></a>

在本示例中，您需要两个 IAM 用户（Mary 和 Carlos）具有访问存储桶 *amzn-s3-demo-bucket1* 的权限，以便他们可以添加、更新和删除对象。但是，您想要限制每个用户对存储桶中单个前缀（文件夹）的访问权限。您可以使用与其用户名匹配的名称创建文件夹。

```
amzn-s3-demo-bucket1
   Mary/
   Carlos/
```

要授予每个用户仅可以访问其文件夹的权限，您可以为每个用户编写策略，然后分别附加它。例如，您可以将以下策略附加到用户 Mary，以允许她对 `amzn-s3-demo-bucket1/Mary` 文件夹拥有特定的 Amazon S3 权限。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:GetObjectVersion",
            "s3:DeleteObject",
            "s3:DeleteObjectVersion"
         ],
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/Mary/*"
      }
   ]
}
```

------

然后，您可以将类似策略附加到用户 Carlos，同时在 `Resource` 值中指定文件夹 `Carlos`。

您可以编写一个使用策略变量的策略，然后将该策略附加到一个组，而不是将策略附加到单个用户。首先，您必须创建一个组，并将 Mary 和 Carlos 添加到该组中。以下示例策略允许在 `amzn-s3-demo-bucket1/${aws:username}` 文件夹中具有一组 Amazon S3 权限。评估策略后，策略变量 `${aws:username}` 将替换为请求者的用户名。例如，如果 Mary 发送了一个请求以放置对象，只有当 Mary 将对象上传到 `amzn-s3-demo-bucket1/Mary` 文件夹后，才允许该操作。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:PutObject",
            "s3:GetObject",
            "s3:GetObjectVersion",
            "s3:DeleteObject",
            "s3:DeleteObjectVersion"
         ],
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/${aws:username}/*"
      }
   ]
}
```

------

**注意**  
当使用策略变量时，您必须在策略中明确指定版本 `2012-10-17`。IAM 策略语言的默认版本 2008-10-17 不支持策略变量。

 如果需要在 Amazon S3 控制台上测试之前的策略，控制台需要其他权限，如以下策略所示。有关控制台如何使用这些权限的信息，请参阅 [使用用户策略控制对存储桶的访问](walkthrough1.md)。

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

****  

```
{
 "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowGroupToSeeBucketListInTheConsole",
      "Action": [ 
      	"s3:ListAllMyBuckets", 
      	"s3:GetBucketLocation" 
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::*"  
    },
    {
      "Sid": "AllowRootLevelListingOfTheBucket",
      "Action": "s3:ListBucket",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1",
      "Condition": { 
            "StringEquals": {
                    "s3:prefix": [""], "s3:delimiter": ["/"]
                           }
                 }
    },
    {
      "Sid": "AllowListBucketOfASpecificUserPrefix",
      "Action": "s3:ListBucket",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1",
      "Condition": {  "StringLike": {"s3:prefix": ["${aws:username}/*"] }
       }
    },
      {
     "Sid": "AllowUserSpecificActionsOnlyInTheSpecificUserPrefix",
         "Effect": "Allow",
         "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:GetObjectVersion",
            "s3:DeleteObject",
            "s3:DeleteObjectVersion"
         ],
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/${aws:username}/*"
      }
  ]
}
```

------

**注意**  
在 2012-10-17 版本的策略中，策略变量以 `$` 开始。如果您的对象键（对象名称）包括 `$`，则语法中的此更改可能会产生冲突。  
为避免此冲突，请通过使用 `${$}` 指定 `$` 字符。例如，要在策略中包括对象键 `my$file`，请将其指定为 `my${$}file`。

尽管 IAM 用户名称是友好、用户可读的标识符，但是它们无需全局唯一。例如，如果用户 Carlos 离开了企业，而另一个 Carlos 加入进来，则新 Carlos 可以访问原 Carlos 的信息。

您可以基于 IAM 用户 ID 创建文件夹，而不是使用用户名。每个 IAM 用户 ID 都是唯一的。在这种情况下，您必须修改之前的策略，以使用 `${aws:userid}` 策略变量。有关用户标识符的更多信息，请参阅 *IAM 用户指南*中的 [IAM 标识符](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html)。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:GetObjectVersion",
            "s3:DeleteObject",
            "s3:DeleteObjectVersion"
         ],
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/home/${aws:userid}/*"
      }
   ]
}
```

------

### 允许非 IAM 用户（移动应用程序用户）访问存储桶中的文件夹
<a name="non-iam-mobile-app-user-access"></a>

假设您要开发一个移动应用程序，一个将用户数据存储在 S3 存储桶中的游戏。对于每个应用用户，您都需要在您的存储桶中创建一个文件夹。您还需要限制每个用户对其自己的文件夹的访问权限。但是，在有人下载您的应用程序并开始玩此游戏之前，您不能创建文件夹，因为您没有用户 ID。

这种情况下，您可以要求用户使用公共身份提供商 (如 Login with Amazon、Facebook、或 Google) 登录到您的应用程序。在用户通过某个提供商登录到您的应用程序后，他们具有一个用户 ID，可用于在运行时创建用户特定的文件夹。

然后，您可以使用 AWS Security Token Service 中的 Web 联合身份验证将来自身份提供商的信息与您的应用相集成，为每个用户获取临时安全凭证。然后，您可以创建 IAM 策略，以便允许该应用访问存储桶和执行操作，如创建用户特定文件夹和上传数据。有关 Web 身份联合验证的更多信息，请参阅《IAM 用户指南》**中的[关于 Web 身份联合验证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html)。

## 允许组在 Amazon S3 中拥有共享的文件夹
<a name="iam-policy-ex2"></a>

将以下策略附加到组将授予该组中的每个人访问 Amazon S3 中的以下文件夹的权限：`amzn-s3-demo-bucket1/share/marketing`。组成员仅允许访问策略中显示的特定 Amazon S3 权限，仅适用于指定文件夹中的对象。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:PutObject",
            "s3:GetObject",
            "s3:GetObjectVersion",
            "s3:DeleteObject",
            "s3:DeleteObjectVersion"
         ],
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/share/marketing/*"
      }
   ]
}
```

------

## 允许所有用户读取存储桶的某个部分中的对象
<a name="iam-policy-ex3"></a>

在该示例中，您创建一个名为 `AllUsers` 的组，其中包含 AWS 账户拥有的所有 IAM 用户。然后，您将附加向该组提供对 `GetObject` 和 `GetObjectVersion` 的访问权限的策略，但仅适用于 `amzn-s3-demo-bucket1/readonly` 文件夹中的对象。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetObject",
            "s3:GetObjectVersion"
         ],
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/readonly/*"
      }
   ]
}
```

------

## 允许合作伙伴将文件放置到存储桶的特定部分中
<a name="iam-policy-ex4"></a>

在本示例中，您将创建代表合作伙伴公司的名为 `AnyCompany` 的组。您将为需要访问权限的合作伙伴公司中的特定人员或应用程序创建 IAM 用户，然后将该用户放入组中。

然后，您附加策略，此策略向组提供对存储桶中以下文件夹的 `PutObject` 访问权限：

`amzn-s3-demo-bucket1/uploads/anycompany` 

您需要阻止 `AnyCompany` 组对存储桶执行任何其他操作，因此添加了一条语句，除了对 AWS 账户中的任何 Amazon S3 资源执行 `PutObject` 外，该语句显式拒绝执行任何其他 Amazon S3 操作的权限。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":"s3:PutObject",
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/uploads/anycompany/*"
      },
      {
         "Effect":"Deny",
         "Action":"s3:*",
         "NotResource":"arn:aws:s3:::amzn-s3-demo-bucket1/uploads/anycompany/*"
      }
   ]
}
```

------

## 限制对特定 AWS 账户中 Amazon S3 存储桶的访问
<a name="iam-policy-ex6"></a>

如果您想确保您的 Amazon S3 主体只能访问受信任 AWS 账户中的资源，您可以限制访问权限。例如，[基于身份的 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)使用 `Deny` 影响来阻止对 Amazon S3 操作的访问，除非正在访问的 Amazon S3 资源在账户 `222222222222` 中。为了防止 AWS 账户中的 IAM 主体访问账户外的 Amazon S3 对象，请附加以下 IAM 策略：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DenyS3AccessOutsideMyBoundary",
      "Effect": "Deny",
      "Action": [
        "s3:*"
      ],
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:ResourceAccount": [
            "222222222222"
          ]
        }
      }
    }
  ]
}
```

------

**注意**  
此策略不会取代现有的 IAM 访问控制，因为它不授予任何访问权限。相反，无论通过其他 IAM 策略授予什么权限，此策略都可以作为其他 IAM 权限的额外防护机制。

请确保将策略中的账户 ID `222222222222` 替换为您自己的 AWS 账户。要在仍保持此限制的同时将策略应用于多个账户，请将账户 ID 替换为 `aws:PrincipalAccount` 条件键。该条件要求主体和资源必须在同一账户中。

## 限制企业单位内对 Amazon S3 存储桶的访问
<a name="iam-policy-ex7"></a>

如果在 AWS Organizations 中设置了[企业单位（OU）](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_ous.html)，则可能需要将 Amazon S3 存储桶访问限制为企业的特定部分。在本示例中，我们将使用 `aws:ResourceOrgPaths` 键以限制 Amazon S3 存储桶对企业中 OU 的访问。在本例中，[OU ID](https://docs.aws.amazon.com/organizations/latest/APIReference/API_OrganizationalUnit.html) 为 `ou-acroot-exampleou`。确保用自己的 OU ID 替换自己的策略中的此值。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
     {
       "Sid": "AllowS3AccessOutsideMyBoundary",
       "Effect": "Allow",
       "Action": [
         "s3:*"
       ],
       "Resource": "*",
       "Condition": {
         "ForAllValues:StringLike": {
           "aws:ResourceOrgPaths": [
             "o-acorg/r-acroot/ou-acroot-exampleou/"
           ] 
         }
       }
     }
   ]
 }
```

------

**注意**  
该策略不授予任何访问权限。相反，此策略充当其他 IAM 权限的后盾，阻止主体访问 OU 定义边界之外的 Amazon S3 对象。

该策略拒绝对 Amazon S3 操作的访问，除非正在访问的 Amazon S3 对象位于您企业的 `ou-acroot-exampleou` OU 中。[IAM 策略条件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)要求 `aws:ResourceOrgPaths`（多值条件键）包含列出的任何 OU 路径。该策略使用 `ForAllValues:StringNotLike` 运算符将 `aws:ResourceOrgPaths` 的值与列出的 OU 进行比较，而不进行区分大小写的匹配。

## 限制对企业内 Amazon S3 存储桶的访问
<a name="iam-policy-ex8"></a>

要限制对组织内 Amazon S3 对象的访问，请将 IAM 策略附加到组织的根，并将其应用于组织中的所有账户。如果要求您的 IAM 主体遵守此规则，请使用[服务控制策略 (SCP)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)。如果您选择使用 SCP，请确保先全面[测试 SCP](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html#scp-warning-testing-effect)，然后将策略附加到企业的根。

在以下示例策略中，将拒绝对 Amazon S3 操作的访问，除非正在访问的 Amazon S3 对象与访问该对象的 IAM 主体位于同一企业中：

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
     {
       "Sid": "DenyS3AccessOutsideMyBoundary",
       "Effect": "Deny",
       "Action": [
         "s3:*"
       ],
       "Resource": "arn:aws:s3:::*/*",
       "Condition": {
         "StringNotEquals": {
           "aws:ResourceOrgID": "${aws:PrincipalOrgID}"
         }
       }
     }
   ]
 }
```

------

**注意**  
该策略不授予任何访问权限。相反，此策略充当其他 IAM 权限的后盾，阻止主体访问企业外部的任何 Amazon S3 对象。此策略还适用于在策略生效后创建的 Amazon S3 资源。

本例中的 [IAM 策略条件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)要求 `aws:ResourceOrgID` 和 `aws:PrincipalOrgID` 彼此相等。有了这一要求，提出请求的主体和正在访问的资源必须位于同一企业中。

## 为 AWS 账户授予检索 PublicAccessBlock 配置的权限
<a name="using-with-s3-actions-related-to-accountss"></a>

以下基于身份的策略示例向用户授予 `s3:GetAccountPublicAccessBlock` 权限。对于这些权限，请将 `Resource` 值设置为 `"*"`。有关资源 ARN 的更多信息，请参阅[Amazon S3 的策略资源](security_iam_service-with-iam.md#security_iam_service-with-iam-id-based-policies-resources)。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"statement1",
         "Effect":"Allow",
         "Action":[
            "s3:GetAccountPublicAccessBlock" 
         ],
         "Resource":[
            "*"
         ]
       }
    ]
}
```

------

## 将存储桶的创建限制在一个区域
<a name="condition-key-bucket-ops-1"></a>

假定 AWS 账户管理员想要授予其用户（Dave）仅在南美洲（圣保罗）区域创建存储桶的权限。账户管理员可附加以下用户策略，授予附带条件的 `s3:CreateBucket` 权限，如下所示。`Condition` 块中的键值对指定 `s3:LocationConstraint` 键，并将 `sa-east-1` 区域作为值。

**注意**  
在该示例中，存储桶拥有者为其用户之一授予权限，因此可以使用存储桶策略或用户策略。此示例显示了用户策略。

有关 Amazon S3 区域的列表，请参阅《AWS 一般参考》**中的[区域和端点](https://docs.aws.amazon.com/general/latest/gr/s3.html)。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Sid": "statement1",
         "Effect": "Allow",
         "Action": "s3:CreateBucket",
         "Resource": "arn:aws:s3:::*",
         "Condition": {
             "StringLike": {
                 "s3:LocationConstraint": "sa-east-1"
             }
         }
       }
    ]
}
```

------

**添加显式拒绝**  
前面的策略限制用户只能在 `sa-east-1` 区域中创建存储桶。但是，别的策略可能授予此用户在其他区域中创建存储桶的权限。例如，如果用户属于某个组，该组可能附加了一个策略，以允许该组中的所有用户在另一个区域中创建存储桶。要确保此用户不会获得在其它任何区域创建存储桶的权限，可在上述策略中添加一个显式拒绝语句。

`Deny` 语句使用 `StringNotLike` 条件。也即，如果位置约束不是 `sa-east-1`，则创建存储桶的请求将被拒绝。显式拒绝不允许用户在其它任何区域创建存储桶，无论该用户获得了哪种其它权限。以下策略包含显式拒绝语句。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"statement1",
         "Effect":"Allow",
         "Action": "s3:CreateBucket",
         "Resource": "arn:aws:s3:::*",
         "Condition": {
             "StringLike": {
                 "s3:LocationConstraint": "sa-east-1"
             }
         }
       },
      {
         "Sid":"statement2",
         "Effect":"Deny",
         "Action": "s3:CreateBucket",
         "Resource": "arn:aws:s3:::*",
         "Condition": {
             "StringNotLike": {
                 "s3:LocationConstraint": "sa-east-1"
             }
         }
       }
    ]
}
```

------

**使用 AWS CLI 测试策略**  
可使用以下 `create-bucket` AWS CLI 命令测试此策略。此示例使用 `bucketconfig.txt` 文件来指定位置约束。记下 Windows 文件路径。您需要更新相应的存储桶名称和路径。必须使用 `--profile` 参数提供用户凭证。有关设置和使用 AWS CLI 的更多信息，请参阅《Amazon S3 API 参考》**中的 [Developing with Amazon S3 using the AWS CLI](https://docs.aws.amazon.com/AmazonS3/latest/API/setup-aws-cli.html)。

```
aws s3api create-bucket --bucket examplebucket --profile AccountADave --create-bucket-configuration file://c:/Users/someUser/bucketconfig.txt
```

`bucketconfig.txt` 文件指定一些配置，如下所示。

```
{"LocationConstraint": "sa-east-1"}
```