

# 控制从 Athena 对 Amazon S3 的访问
<a name="s3-permissions"></a>

您可以使用基于身份的策略、存储桶资源策略、接入点策略或上述内容的任意组合授予对 Amazon S3 位置的访问权限。当参与者与 Athena 交互时，其权限会通过 Athena 传递，以确定 Athena 可以访问的内容。这意味着用户必须具有 Amazon S3 存储桶的访问权限，才能使用 Athena 进行查询。

每当您使用 IAM 策略时，请确保遵循 IAM 最佳实践。有关更多信息，请参阅《[IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)》中的 *IAM 安全最佳实践*。

请注意，对 Amazon S3 的请求来自 Athena 的私有 IPv4 地址，而不是 `aws:SourceIp` 中指定的源 IP。因此，不能使用 `aws:SourceIp` 条件拒绝访问给定 IAM 策略中的 Amazon S3 操作。也无法根据 `aws:SourceVpc` 或 `aws:SourceVpce` 条件键限制或允许对 Amazon S3 资源的访问。

**注意**  
使用 IAM Identity Center 身份验证的 Athena 工作组要求将 S3 访问权限管控配置为使用可信身份传播身份。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的 [S3 Access Grants and directory identities](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-directory-ids.html)。

**Topics**
+ [基于身份的策略](#s3-permissions-identity-based-policies)
+ [存储桶资源策略](#s3-permissions-bucket-resource-policies)
+ [接入点策略](#s3-permissions-aliases)
+ [CalledVia 上下文键](#s3-permissions-calledvia)
+ [其他资源](#s3-permissions-additional-resources)

## 使用基于身份的策略来控制对 Amazon S3 存储桶的访问
<a name="s3-permissions-identity-based-policies"></a>

基于身份的策略附加到 IAM 用户、组或角色。这些策略可让您指定该身份可执行哪些操作（其权限）。可以使用基于身份的策略来控制对 Amazon S3 存储桶的访问。

以下基于身份的策略允许 `Read` 和 `Write` 访问特定 Amazon S3 存储桶中的对象。要使用此策略，请将*斜体占位符文本*替换为您自己的值。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ListObjectsInBucket",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket"
            ]
        },
        {
            "Sid": "AllObjectActions",
            "Effect": "Allow",
            "Action": "s3:*Object",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket/*"
            ]
        }
    ]
}
```

------

## 使用存储桶资源策略控制对 Amazon S3 存储桶的访问
<a name="s3-permissions-bucket-resource-policies"></a>

可以使用 Amazon S3 存储桶策略来保护对存储桶中对象的访问，以便只有具有适当权限的用户才能访问这些对象。有关创建 Amazon S3 策略的指导，请参阅《*Amazon S3 用户指南*》中的[使用 Amazon S3 控制台添加存储桶策略](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-bucket-policy.html)。

以下示例权限策略限制用户读取具有 `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"
                }
            }
        }
    ]
}
```

------

有关更多存储桶策略示例，请参阅《*Amazon S3 用户指南*》中的 [Amazon S3 存储桶策略的示例](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html)。

## 使用 Amazon S3 接入点对存储桶访问进行更精确的控制
<a name="s3-permissions-aliases"></a>

如果您在 Amazon S3 存储桶中拥有共享数据集，则维护单个存储桶策略以管理数百个使用案例的访问权限可能会非常困难。

Amazon S3 存储桶接入点、策略和别名有助于解决此问题。一个存储桶可以有多个接入点，每个接入点都有一个策略，能够以不同方式控制对存储桶的访问。

对于您创建的每个接入点，Amazon S3 都会生成一个代表接入点的别名。由于别名采用 Amazon S3 存储桶名称格式，因此您可以在 Athena 中 `CREATE TABLE` 语句的 `LOCATION` 子句中使用别名。然后，Athena 对存储桶的访问由别名所代表的接入点策略控制。

有关更多信息，请参阅《Amazon S3 用户指南》**中的 [指定 Amazon S3 中的表位置](tables-location-format.md) 和[使用接入点](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points.html)。

## 使用 CalledVia 上下文密钥，以仅允许从 Athena 调用其他服务
<a name="s3-permissions-calledvia"></a>

为了增加安全性，您可以使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia) 全局条件上下文键。`aws:CalledVia` 条件键包含您允许调用其他服务的服务列表。例如，通过为 `aws:CalledVia` 上下文密钥指定 Athena 服务主体名称 (`athena.amazonaws.com`)，您可以仅在调用来自 Athena 时允许对 AWS Lambda 进行 `InvokeFunction` 调用。有关更多信息，请参阅 [使用适用于 Athena 的 CalledVia 上下文密钥](security-iam-athena-calledvia.md)。

## 其他资源
<a name="s3-permissions-additional-resources"></a>

有关如何授予 Amazon S3 访问权限的详细信息和示例，请参阅以下资源：
+ 《Amazon S3 用户指南**》中的 [示例演练：管理访问](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-walkthroughs-managing-access.html)。
+ AWS 知识中心中的[如何提供对 Amazon S3 存储桶中对象的跨账户访问权限？](https://aws.amazon.com/premiumsupport/knowledge-center/cross-account-access-s3/)。
+ [在 Athena 中配置对 Amazon S3 存储桶的跨账户存取](cross-account-permissions.md).