

# 配置使用接入点的 IAM 策略
<a name="access-points-policies"></a>

Amazon S3 接入点支持 AWS Identity and Access Management（IAM）资源策略，这些策略允许您按资源、用户或其他条件控制接入点的使用。要使应用程序或用户能够通过接入点访问对象，接入点和底层存储桶或 Amazon FSx 文件系统必须支持该请求。

**重要**  
您在接入点策略中包括的限制仅适用于通过该接入点发出的请求。将接入点附加到存储桶不会改变底层资源的行为。所有未通过接入点对存储桶进行的现有操作将继续像以前一样运行。

当您使用 IAM 资源策略时，确保在保存策略之前解决来自 AWS Identity and Access Management Access Analyzer 的安全警告、错误、一般警告和建议。IAM Access Analyzer 将根据 IAM [策略语法](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_grammar.html)和[最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)运行策略检查，以验证您的策略。这些检查项生成调查结果并提供建议，可帮助您编写可操作且符合安全最佳实践的策略。

要了解有关使用 IAM Access Analyzer 验证策略的更多信息，请参阅《IAM 用户指南》**中的 [IAM Access Analyzer 策略验证](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)。要查看 IAM Access Analyzer 返回的警告、错误和建议的列表，请参阅 [IAM Access Analyzer 策略检查引用](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-reference-policy-checks.html)。

## 接入点的策略示例
<a name="access-points-policy-examples"></a>

以下示例演示如何创建 IAM 策略来控制通过接入点发出的请求。

**注意**  
在接入点策略中授予的权限仅在底层存储桶也允许相同的访问时才有效。您可以通过两种方式实现这一点：  
**（推荐）**将存储桶的访问控制委派给接入点，如[将访问控制委派到接入点](#access-points-delegating-control)中所述。
将接入点策略中包含的权限添加到底层存储桶的策略中。示例 1 接入点策略示例说明了如何修改底层存储桶策略以允许必要的访问。

**Example 1 – 接入点策略授予**  
以下接入点策略通过账户 *`123456789012`* 中的接入点 *`my-access-point`* 向账户 `123456789012` 中的 IAM 用户 `Jane` 授予对具有前缀 `Jane/` 的 `GET` 和 `PUT` 对象的权限。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
    {
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::123456789012:user/Jane"
        },
        "Action": ["s3:GetObject", "s3:PutObject"],
        "Resource": "arn:aws:s3:us-west-2:123456789012:accesspoint/my-access-point/object/Jane/*"
    }]
}
```

**注意**  
要使接入点策略有效地向 *`Jane`* 授予访问权限，底层存储桶也必须对 *`Jane`* 允许相同的访问权限。可以将存储桶的访问控制委派到接入点，如[将访问控制委派到接入点](#access-points-delegating-control)中所述。或者，您也可以将以下策略添加到底层存储桶中，以便向 Jane 授予必要的权限。请注意，接入点策略和存储桶策略的 `Resource` 条目不同。  

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
    {
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::123456789012:user/Jane"
        },
        "Action": ["s3:GetObject", "s3:PutObject"],
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/Jane/*"
    }]    
}
```

**Example 2 – 带标签条件的接入点策略**  
以下接入点策略通过账户 *`123456789012`* 中的接入点 *`my-access-point`* 向账户 *`123456789012`* 中的 IAM 用户 *`Mateo`* 授予对 `GET` 对象的权限，这些权限具有值设为 *`finance`* 的标签键 *`data`*。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
    {
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::123456789012:user/Mateo"
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:us-west-2:123456789012:accesspoint/my-access-point/object/*",
        "Condition": {
            "StringEquals": {
                "s3:ExistingObjectTag/data": "finance"
            }
        }
    }]
}
```

**Example 3 – 允许查看存储桶列示内容的接入点策略**  
以下接入点策略通过账户 *`123456789012`* 中的接入点 *`my-access-point`* 授予账户 *`123456789012`* 中的 IAM 用户 `Arnav` 查看底层存储桶中包含的对象的权限。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
    {
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::123456789012:user/Arnav"
        },
        "Action": "s3:ListBucket",
        "Resource": "arn:aws:s3:us-west-2:123456789012:accesspoint/my-access-point"
    }]
}
```

**Example 4 – 服务控制策略**  
以下服务控制策略要求使用虚拟私有云（VPC）网络起源创建所有新的接入点。实施此策略时，组织中的用户无法创建可从 Internet 访问的新接入点。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
    {
        "Effect": "Deny",
        "Action": "s3:CreateAccessPoint",
        "Resource": "*",
        "Condition": {
            "StringNotEquals": {
                "s3:AccessPointNetworkOrigin": "VPC"
            }
        }
    }]
}
```

**Example 5 – 将 S3 操作限制为 VPC 网络起源的存储桶策略**  
以下存储桶策略限制为只能通过具有 VPC 网络起源的接入点来访问存储桶 `amzn-s3-demo-bucket` 的所有 S3 对象操作。  
在使用类似于此示例所示语句的语句之前，请确保您不需要使用接入点不支持的特征，例如跨区域复制。  
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:BypassGovernanceRetention",
                "s3:DeleteObject",
                "s3:DeleteObjectTagging",
                "s3:DeleteObjectVersion",
                "s3:DeleteObjectVersionTagging",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:GetObjectLegalHold",
                "s3:GetObjectRetention",
                "s3:GetObjectTagging",
                "s3:GetObjectVersion",
                "s3:GetObjectVersionAcl",
                "s3:GetObjectVersionTagging",
                "s3:ListMultipartUploadParts",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:PutObjectLegalHold",
                "s3:PutObjectRetention",
                "s3:PutObjectTagging",
                "s3:PutObjectVersionAcl",
                "s3:PutObjectVersionTagging",
                "s3:RestoreObject"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Condition": {
                "StringNotEquals": {
                    "s3:AccessPointNetworkOrigin": "VPC"
                }
            }
        }
    ]
}
```

## 条件键
<a name="access-points-condition-keys"></a>

S3 接入点具有条件键，这些键可在 IAM 策略中用来控制对资源的访问。以下条件键仅代表 IAM 策略的一部分。有关完整策略示例，请参阅[接入点的策略示例](#access-points-policy-examples)、[将访问控制委派到接入点](#access-points-delegating-control)和[授予跨账户接入点的权限](#access-points-cross-account)。

**`s3:DataAccessPointArn`**  
此示例显示一个您可以用来匹配接入点 ARN 的字符串。以下示例匹配区域 *`us-west-2`* 中 AWS 账户 *`123456789012`* 的所有接入点：  

```
"Condition" : {
    "StringLike": {
        "s3:DataAccessPointArn": "arn:aws:s3:us-west-2:123456789012:accesspoint/*"
    }
}
```

**`s3:DataAccessPointAccount`**  
此示例显示一个字符串运算符，您可以使用它匹配接入点拥有者的账户 ID。以下示例匹配 AWS 账户 *`123456789012`* 拥有的所有接入点。  

```
"Condition" : {
    "StringEquals": {
        "s3:DataAccessPointAccount": "123456789012"
    }
}
```

**`s3:AccessPointNetworkOrigin`**  
此示例显示一个字符串运算符，您可以使用它来匹配网络起源（`Internet` 或 `VPC`）。以下示例仅匹配起源为 VPC 的接入点。  

```
"Condition" : {
    "StringEquals": {
        "s3:AccessPointNetworkOrigin": "VPC"
    }
}
```

有关在 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)。

## 将访问控制委派到接入点
<a name="access-points-delegating-control"></a>

您可以将存储桶的访问控制委托给存储桶的接入点。以下示例存储桶策略允许对存储桶拥有者账户所拥有的所有接入点进行完全访问。因此，对此存储桶的所有访问都由附加到其接入点的策略控制。我们建议您以这种方式为所有不需要直接访问存储桶的使用案例配置存储桶。

**Example 6 – 将访问控制委派给接入点的存储桶策略**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement" : [
    {
        "Effect": "Allow",
        "Principal" : { "AWS": "*" },
        "Action" : "*",
        "Resource" : [ "arn:aws:s3:::amzn-s3-demo-bucket", "arn:aws:s3:::amzn-s3-demo-bucket/*"],
        "Condition": {
            "StringEquals" : { "s3:DataAccessPointAccount" : "111122223333" }
        }
    }]
}
```

## 授予跨账户接入点的权限
<a name="access-points-cross-account"></a>

要为另一个账户拥有的存储桶创建接入点，您必须首先通过指定存储桶名称和账户拥有者 ID 来创建接入点。然后，存储桶拥有者必须更新存储桶策略以授权来自接入点的请求。创建接入点与创建 DNS CNAME 类似，因为接入点不提供对存储桶内容的访问权限。所有存储桶访问权限均由存储桶策略控制。以下示例存储桶策略允许从受信任 AWS 账户拥有的接入点对存储桶进行 `GET` 和 `LIST` 请求。

将 *Bucket ARN* 替换为桶的 ARN。

**Example 7 – 将权限委托给其他 AWS 账户的存储桶策略**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement" : [
    {
        "Effect": "Allow",
        "Principal" : { "AWS": "*" },
        "Action" : ["s3:GetObject","s3:ListBucket"],
        "Resource" : ["arn:aws:s3:::amzn-s3-demo-bucket", "arn:aws:s3:::amzn-s3-demo-bucket/*"],
        "Condition": {
            "StringEquals" : { "s3:DataAccessPointAccount" : "Access point owner's account ID" }
        }
    }]
}
```
跨账户接入点仅适用于附加到 S3 存储桶的接入点。您不能将接入点附加到 Amazon FSx 文件系统上由其它 AWS 账户拥有的卷。