

# 在 Athena 中配置对 Amazon S3 存储桶的跨账户存取
<a name="cross-account-permissions"></a>

一个常见的 Amazon Athena 方案是向账户中与存储桶拥有者不同的用户授予访问权限，以便他们可以执行查询。在这种情况下，使用存储桶策略来授予访问权限。

**注意**  
有关从 Athena 跨账户访问 AWS Glue 数据目录的信息，请参阅 [配置 AWS Glue 数据目录的跨账户存取](security-iam-cross-account-glue-catalog-access.md)。

以下示例存储桶策略 (由存储桶所有者创建并应用到存储桶 `s3://amzn-s3-demo-bucket`) 向账户 `123456789123` (它是不同账户) 中的所有用户授予访问权限。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Id": "MyPolicyID",
   "Statement": [
      {
          "Sid": "MyStatementSid",
          "Effect": "Allow",
          "Principal": {
             "AWS": "arn:aws:iam::123456789123:root"
          },
          "Action": [
             "s3:GetBucketLocation",
             "s3:GetObject",
             "s3:ListBucket",
             "s3:ListBucketMultipartUploads",
             "s3:ListMultipartUploadParts",
             "s3:AbortMultipartUpload"
          ],
          "Resource": [
             "arn:aws:s3:::amzn-s3-demo-bucket",
             "arn:aws:s3:::amzn-s3-demo-bucket/*"
          ]
       }
    ]
 }
```

------

要向账户中的特定用户授予访问权限，请将 `Principal` 密钥替换为用户指定的密钥，而不是 `root`。例如，对于用户配置文件 `Dave`，请使用 `arn:aws:iam::123456789123:user/Dave`。

## 对使用自定义 AWS KMS 密钥加密的存储桶配置跨账户访问
<a name="cross-account-permissions-kms"></a>

如果您的 Amazon S3 存储桶使用自定义 AWS Key Management Service (AWS KMS) 密钥加密，则可能需要向其他 Amazon Web Services 账户中的用户授予访问该存储桶的权限。

向账户 B 中的用户授予对账户 A 中 AWS KMS 加密存储桶的访问权限需要以下权限：
+ 账户 A 中的存储桶策略必须授予对账户 B 所担任角色的访问权限。
+ 账户 A 中的 AWS KMS 密钥策略必须授予对账户 B 中用户所担任角色的访问权限。
+ 账户 B 担任的 AWS Identity and Access Management（IAM）角色必须同时授予对账户 A 中存储桶和密钥的访问权限。

以下过程描述如何授予这些权限中的每个权限。

**向账户 b 中的用户授予对账户 a 中存储桶的访问权限**
+ 在账户 A 中，[查看 S3 存储桶策略](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-bucket-policy.html)并确认存在允许从账户 B 的账户 ID 访问的语句。

  例如，以下存储桶策略允许 `s3:GetObject` 访问账户 ID `111122223333`：

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

****  

  ```
  {
    "Id": "ExamplePolicy1",
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "ExampleStmt1",
        "Action": [
          "s3:GetObject"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
        "Principal": {
          "AWS": [
            "111122223333"
          ]
        }
      }
    ]
  }
  ```

------

**从账户 a 中的 AWS KMS 密钥策略向账户 b 中的用户授予访问权限**

1. 在账户 A 的 AWS KMS 密钥策略中，向账户 B 所担任的角色授予执行以下操作的权限：
   +  `kms:Encrypt` 
   +  `kms:Decrypt` 
   +  `kms:ReEncrypt*` 
   +  `kms:GenerateDataKey*` 
   +  `kms:DescribeKey` 

   以下示例仅向一个 IAM 角色授予密钥访问权限。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AllowUseOfTheKey",
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::111122223333:role/role_name"
               },
               "Action": [
                   "kms:Encrypt",
                   "kms:Decrypt",
                   "kms:ReEncrypt*",
                   "kms:GenerateDataKey*",
                   "kms:DescribeKey"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 在账户 A 中，[使用 AWS 管理控制台 策略视图](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to-console-policy-view)查看密钥策略。

1. 在密钥策略中，验证以下语句是否将账户 B 列为主体。

   ```
   "Sid": "Allow use of the key" 
   ```

1. 如果 `"Sid": "Allow use of the key"` 语句不存在，请执行以下步骤：

   1. 切换到[使用控制台默认视图](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to-console-default-view)查看密钥策略。

   1.  将账户 B 的账户 ID 添加为可访问密钥的外部账户。

**从账户 b 担任的 IAM 角色中授予对账户 a 中存储桶和密钥的访问权限**

1. 从账户 B 中，在 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 开启 IAM 控制台。

1. 打开与账户 B 中用户关联的 IAM 角色。

1. 查看应用于 IAM 角色的权限策略列表。

1. 确保应用授予对存储桶的访问权限的策略。

   以下示例语句授予 IAM 角色对存储桶 `amzn-s3-demo-bucket` 执行 `s3:GetObject` 和 `s3:PutObject` 操作的访问权限：

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "ExampleStmt2",
         "Action": [
           "s3:GetObject",
           "s3:PutObject"
         ],
         "Effect": "Allow",
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
       }
     ]
   }
   ```

------

1. 确保应用授予对密钥的访问权限的策略。
**注意**  
如果账户 B 所担任的 IAM 角色已经具有[管理员访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html)，则您无需从用户的 IAM 策略授予对密钥的访问权限。

   以下示例语句授予 IAM 角色使用密钥 `arn:aws:kms:us-west-2:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd` 的权限。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "ExampleStmt3",
         "Action": [
           "kms:Decrypt",
           "kms:DescribeKey",
           "kms:Encrypt",
           "kms:GenerateDataKey",
           "kms:ReEncrypt*"
         ],
         "Effect": "Allow",
         "Resource": "arn:aws:kms:us-west-2:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd"
       }
     ]
   }
   ```

------

## 对存储桶对象配置跨账户访问
<a name="cross-account-permissions-objects"></a>

由存储桶拥有账户（账户 A）以外的账户（账户 C）上载的对象可能需要明确的对象级 ACL，以向查询账户（账户 B）授予读取访问权限。为避免此要求，账户 C 在将对象放入账户 A 的存储桶之前应代入账户 A 中的角色。有关更多信息，请参阅[如何提供对 Amazon S3 存储桶中的对象的跨账户访问权限？](https://aws.amazon.com/premiumsupport/knowledge-center/cross-account-access-s3/)。