

# S3 表类数据存储服务的安全性
<a name="s3-tables-security-overview"></a>

 Amazon S3 提供了各种安全功能和工具。以下是 S3 表类数据存储服务支持的这些功能和工具的列表。正确应用这些工具有助于确保资源受到保护，且只有目标用户才能访问这些资源。

**基于身份的策略**  
[基于身份的策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)附加到 IAM 用户、组或角色。您可以使用基于身份的策略，来向 IAM 身份授予对表存储桶或表的访问权限。默认情况下，用户和角色不拥有创建和修改表和表存储桶的权限。他们也无法通过 S3 控制台、AWS CLI 或 Amazon S3 REST API 执行任务。您可以在您的账户中创建 IAM 用户、组和角色，并为其附加访问策略。然和，您可以授予对资源的访问权限。要创建和访问表存储桶和表，IAM 管理员必须向 AWS Identity and Access Management（IAM）角色或用户授予必要的权限。有关更多信息，请参阅 [S3 表类数据存储服务的访问管理](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-setting-up.html)。

**基于资源的策略**  
[基于资源的策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)附加到某个资源。您可以为表存储桶和表创建基于资源的策略。您可以使用表存储桶策略来控制表存储桶和命名空间级的 API 访问权限。还可以使用表存储桶策略来控制对存储桶中多个表的表级 API 权限。根据策略定义，附加到存储桶的权限可以应用于存储桶中的所有表或特定表。还可以使用表策略来授予对存储桶中各个表的表级 API 访问权限。

当 S3 表类数据存储服务收到执行表存储桶操作或表操作的请求时，它首先验证请求者是否拥有必要的权限。它对所有相关访问策略、用户策略和基于资源的策略（IAM 用户策略、IAM 角色策略、表存储桶策略和表策略）进行评估，以决定是否对该请求进行授权。通过表存储桶策略和表策略，您可以对资源的访问权限进行个性化设置，以确保只有您已批准的身份才能访问您的资源并对其执行操作。有关更多信息，请参阅 [S3 表类数据存储服务的访问管理](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-setting-up.html)。

**S3 表类数据存储服务的 AWS Organizations 服务控制策略（SCP）。**  
可以在服务控制策略（SCP）中使用 Amazon S3 表类数据存储服务来管理组织中用户的权限。与 IAM 和资源策略类似，所有表和存储桶级操作都作为 `s3tables` 命名空间的一部分在策略中引用。有关更多信息，请参阅《AWS Organizations 用户指南》**中的[服务控制策略（SCP）](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)。

**Topics**
+ [

# 使用加密保护 S3 表数据
](s3-tables-encryption.md)
+ [

# S3 表类数据存储服务的访问管理
](s3-tables-setting-up.md)
+ [

# S3 表类数据存储服务的 VPC 连接
](s3-tables-VPC.md)
+ [

# S3 表类数据存储服务的安全注意事项和限制
](s3-tables-restrictions.md)

# 使用加密保护 S3 表数据
<a name="s3-tables-encryption"></a>

# 在表存储桶中使用具有 AWS KMS 密钥的服务器端加密（SSE-KMS）
<a name="s3-tables-kms-encryption"></a>

**Topics**
+ [

## SSE-KMS 存储桶如何用于表和表存储桶
](#kms-tables-how)
+ [

# 对表和表存储桶强制使用 SSE-KMS 并确定其范围
](tables-require-kms.md)
+ [

## 监控和审计表和表存储桶的 SSE-KMS 加密
](#kms-tables-audit)
+ [

# S3 表类数据存储服务 SSE-KMS 加密的权限要求
](s3-tables-kms-permissions.md)
+ [

# 在表存储桶中指定具有 AWS KMS 密钥的服务器端加密（SSE-KMS）
](s3-tables-kms-specify.md)

表存储桶具有默认加密配置，该配置通过使用具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）来自动加密表。此加密适用于 S3 表存储桶中的所有表，而您无需支付任何费用。

如果您需要对加密密钥进行更多控制，例如管理密钥轮换和访问策略授予，则可以将表存储桶配置为使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）。AWS KMS 中的安全控制可帮助您满足与加密相关的合规性要求。有关 SSE-KMS 的更多信息，请参阅 [使用具有 AWS KMS 密钥的服务器端加密（SSE-KMS）](UsingKMSEncryption.md)。

## SSE-KMS 存储桶如何用于表和表存储桶
<a name="kms-tables-how"></a>

表存储桶中的 SSE-KMS 与通用存储桶中的 SSE-KMS 在以下几个方面有所不同：
+ 您可以为表存储桶和各个表指定加密设置。
+ 您只能将客户自主管理型密钥与 SSE-KMS 结合使用。不支持 AWS 托管式密钥。
+ 您必须向某些角色和 AWS 服务主体授予访问 AWS KMS 密钥的权限。有关更多信息，请参阅 [S3 表类数据存储服务 SSE-KMS 加密的权限要求](s3-tables-kms-permissions.md)。这包括向以下主体授予访问权限：
  + S3 维护主体：用于对加密的表执行表维护
  + S3 表类数据存储服务集成角色：用于在 AWS 分析服务中处理加密的表
  + 客户端访问角色：用于从 Apache Iceberg 客户端直接访问加密的表
  + S3 元数据主体：用于更新加密的 S3 元数据表
+ 加密的表使用表级别密钥，此类密钥可最大限度地减少向 AWS KMS 发出的请求数量，从而提高处理 SSE-KMS 加密表的成本效益。

**表存储桶的 SSE-KMS 加密**  
创建表存储桶时，可以选择 SSE-KMS 作为默认加密类型，并选择将用于加密的特定 KMS 密钥。在该存储桶中创建的任何表都将自动从其表存储桶继承这些加密设置。您可以随时使用 AWS CLI、S3 API 或 AWS SDK 来修改或移除表存储桶上的默认加密设置。当您修改表存储桶上的加密设置时，这些设置仅适用于在该存储桶中创建的新表。而不更改先前存在的表的加密设置。有关更多信息，请参阅 [为表存储桶指定加密](s3-tables-kms-specify.md#specify-kms-table-bucket)。

**表的 SSE-KMS 加密**  
您还可以选择使用不同的 KMS 密钥来加密单个表，而不管存储桶的默认加密配置如何。要为单个表设置加密，必须在创建表时指定所需的加密密钥。如果要更改现有表的加密，则需要使用所需密钥创建一个表，并将数据从旧表复制到新表。有关更多信息，请参阅 [为表指定加密](s3-tables-kms-specify.md#specify-kms-table)。

使用 AWS KMS 加密时，S3 表类数据存储服务会自动创建唯一的表级别数据密钥，用于加密与每个表关联的新对象。这些密钥在有限的时段内使用，最大限度地减少了在加密操作期间对额外 AWS KMS 请求的需求，并降低了加密成本。这类似于 [SSE-KMS 的 S3 存储桶密钥](bucket-key.md#bucket-key-overview)。

# 对表和表存储桶强制使用 SSE-KMS 并确定其范围
<a name="tables-require-kms"></a>

您可以使用 S3 表类数据存储服务基于资源的策略、KMS 密钥策略、基于 IAM 身份的策略或这些策略的任意组合，来强制对 S3 表和表存储桶使用 SSE-KMS。有关表的身份和资源策略的更多信息，请参阅 [S3 表类数据存储服务的访问管理](s3-tables-setting-up.md)。有关编写密钥策略的信息，请参阅《AWS Key Management Service Developer Guide》**中的 [Key policies](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)。以下示例说明如何使用策略来强制执行 SSE-KMS。

## 使用表存储桶策略强制对所有表使用 SSE-KMS
<a name="w2aac20c35c15b3c11b5b1"></a>

这是表存储桶策略的示例，该策略禁止用户在特定的表存储桶中创建表，除非他们使用特定 AWS KMS 密钥对表进行加密。要使用此策略，请将*用户输入占位符*替换为您自己的信息：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "EnforceKMSEncryption",
      "Effect": "Deny",
      "Principal": "*",
      "Action": [
        "s3tables:CreateTable"
      ],
      "Resource": [
        "arn:aws:s3tables:us-west-2:111122223333:bucket/example-table-bucket/*"
      ],
      "Condition": {
        "StringNotEquals": {
          "s3tables:sseAlgorithm": "aws:kms",
          "s3tables:kmsKeyArn": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
        }
      }
    }
  ]
}
```

------

## 要求用户将 SSE-KMS 加密与 IAM 策略结合使用
<a name="w2aac20c35c15b3c11b7b1"></a>

此 IAM 身份策略要求用户在创建或配置 S3 表类数据存储服务资源时使用特定的 AWS KMS 密钥进行加密。要使用此策略，请将*用户输入占位符*替换为您自己的信息：

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "RequireKMSKeyOnTables",
      "Action": [
          "s3tables:CreateTableBucket",
          "s3tables:PutTableBucketEncryption",
          "s3tables:CreateTable"
      ]
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
            "s3tables:sseAlgorithm": "aws:kms",
            "s3tables:kmsKeyArn": "<key_arn>"
        }
      }
    }
  ]
}
```

## 使用 KMS 密钥策略将密钥的使用限制为特定的表存储桶
<a name="w2aac20c35c15b3c11b9b1"></a>

此示例 KMS 密钥策略仅让特定用户将密钥用于特定表存储桶中的加密操作。这种类型的策略对于在跨账户场景中限制对密钥的访问非常有用。要使用此策略，请将*用户输入占位符*替换为您自己的信息：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id": "Id",
  "Statement": [
    {
      "Sid": "AllowPermissionsToKMS",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
      },
      "Action": [
        "kms:GenerateDataKey",
        "kms:Decrypt"
      ],
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "kms:EncryptionContext:aws:s3:arn": "<table-bucket-arn>/*"
        }
      }
    }
  ]
}
```

------

## 监控和审计表和表存储桶的 SSE-KMS 加密
<a name="kms-tables-audit"></a>

要审计为 SSE-KMS 加密数据使用 AWS KMS 密钥的情况，您可以使用 AWS CloudTrail 日志。您可以深入了解自己的[加密操作](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#cryptographic-operations)，例如 `GenerateDataKey` 和 `Decrypt`。CloudTrail 支持多种[属性值](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_LookupEvents.html)来筛选您的搜索，包括事件名称、用户名和事件源。

可以使用 CloudTrail 事件跟踪 Amazon S3 表和表存储桶的加密配置请求。CloudTrail 日志中使用以下 API 事件名称：
+ `s3tables:PutTableBucketEncryption`
+ `s3tables:GetTableBucketEncryption`
+ `s3tables:DeleteTableBucketEncryption`
+ `s3tables:GetTableEncryption`
+ `s3tables:CreateTable`
+ `s3tables:CreateTableBucket`

**注意**  
表存储桶不支持 EventBridge。

# S3 表类数据存储服务 SSE-KMS 加密的权限要求
<a name="s3-tables-kms-permissions"></a>

当您对 S3 表存储桶中的表使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）时，您需要为账户中的不同身份授予权限。您的访问身份和 S3 表类数据存储服务维护主体至少需要具有访问您的密钥的权限，所需的其它权限取决于您的应用场景。

**所需权限**   
要访问使用 KMS 密钥加密的表，您需要对该密钥具有以下权限：  
+ `kms:GenerateDataKey`
+ `kms:Decrypt`
要对表使用 SSE-KMS，Amazon S3 表类数据存储服务维护服务主体 (`maintenance.s3tables.amazonaws.com`) 需要对密钥具有 `kms:GenerateDataKey` 和 `kms:Decrypt` 权限。

**其他权限**  
根据您的应用场景，需要以下附加权限：  
+ **AWS 分析服务集成的权限**：如果您在 AWS 分析服务中使用由 SSE-KMS 加密的表，则集成角色需要具有使用 KMS 密钥的权限。
+ **直接访问的权限**：如果您通过诸如 Amazon S3 表类数据存储服务 Iceberg REST 端点或适用于 Apache Iceberg 的 Amazon S3 表类数据存储服务目录之类的方法直接使用由 SSE-KMS 加密的表，则需要向客户端使用的 IAM 角色授予访问您的密钥的权限。
+ **S3 元数据表的权限**：如果您对 S3 元数据表使用 SSE-KMS 加密，则需要向 S3 元数据服务主体 (`metadata.s3.amazonaws.com`) 提供对 KMS 密钥的访问权限。这可让 S3 元数据更新加密的表，这样它们就能够反映您的最新数据更改。

**注意**  
对于跨账户 KMS 密钥，您的 IAM 角色在密钥策略中同时需要密钥访问权限和显式授权。有关 KMS 密钥的跨账户权限的更多信息，请参阅《AWS Key Management Service Service Developer Guide》**中的 [Allowing external AWS accounts to use a KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying-external-accounts.html#cross-account-console)。

**Topics**
+ [

## 向 S3 表类数据存储服务维护服务主体授予对 KMS 密钥的权限
](#tables-kms-maintenance-permissions)
+ [

## 向 IAM 主体授予在集成的 AWS 分析服务中使用加密表的权限
](#tables-kms-integration-permissions)
+ [

## 向 IAM 主体授予直接使用加密表的权限
](#tables-kms-direct-permissions)
+ [

## 向 S3 元数据服务主体授予使用您的 KMS 密钥的权限
](#tables-kms-metadata-permissions)

## 向 S3 表类数据存储服务维护服务主体授予对 KMS 密钥的权限
<a name="tables-kms-maintenance-permissions"></a>

需要此权限才能创建通过 SSE-KMS 加密的表，并支持对加密的表进行自动表维护，例如压缩、快照管理和未引用文件移除。

**注意**  
每当您发出请求来创建通过 SSE-KMS 加密的表时，S3 表类数据存储服务都会进行检查，以确保 `maintenance.s3tables.amazonaws.com` 主体有权访问您的 KMS 密钥。要执行此检查，需要在表存储桶中临时创建一个零字节对象，而[未引用文件移除](s3-table-buckets-maintenance.md#s3-table-bucket-maintenance-unreferenced)维护操作将自动移除该对象。如果您为加密指定的 KMS 密钥没有维护访问权限，则 createTable 操作将失败。

要授予对通过 SSE-KMS 加密的表的维护访问权限，您可以使用以下示例密钥策略。在此策略中，向 `maintenance.s3tables.amazonaws.com` 服务主体授予使用特定 KMS 密钥对特定表存储桶中的表进行加密和解密的权限。要使用此策略，请将*用户输入占位符*替换为您自己的信息：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "EnableKeyUsage",
            "Effect": "Allow",
            "Principal": {
                "Service": "maintenance.s3tables.amazonaws.com"            
            },
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-id",
            "Condition": {
                "StringLike": {
                    "kms:EncryptionContext:aws:s3:arn":"<table-or-table-bucket-arn>/*"
                }
            }
        }
    ]
}
```

------

## 向 IAM 主体授予在集成的 AWS 分析服务中使用加密表的权限
<a name="tables-kms-integration-permissions"></a>

要在 AWS 分析服务中使用 S3 表，可以将表存储桶与 Amazon SageMaker 智能湖仓集成。这种集成支持 AWS 分析服务自动发现和访问表数据。有关集成的更多信息，请参阅[将 Amazon S3 表类数据存储服务与 AWS 分析服务集成](s3-tables-integrating-aws.md)。

当您在这些服务中使用通过 SSE-KMS 加密的表时，您使用的角色需要拥有使用 AWS KMS 密钥进行加密操作的权限。您可以将这些权限应用于在集成期间创建的 `S3TablesRoleForLakeFormation` 角色或您自己的 IAM 角色。

以下内联 IAM 策略示例可用于向 `S3TablesRoleForLakeFormation` 服务角色授予使用您账户中的特定 KMS 密钥进行加密操作的权限。要使用此策略，请将*输入占位符值*替换为您自己的信息。

```
{
  "Sid": "AllowTableRoleAccess",
  "Effect": "Allow",
  "Principal": {
	"AWS": "arn:aws:iam::111122223333:role/service-role/S3TablesRoleForLakeFormation"
  },
  "Action": [
      "kms:GenerateDataKey", 
      "kms:Decrypt"
  ],
  "Resource": "<kms-key-arn>"
}
```

## 向 IAM 主体授予直接使用加密表的权限
<a name="tables-kms-direct-permissions"></a>

当您通过第三方或直接访问方法处理加密表时，必须向您使用的角色授予对 KMS 密钥的访问权限。以下示例说明如何通过 IAM 策略或 KMS 密钥策略授予访问权限。

------
#### [ IAM policy ]

将此内联策略附加到您的 IAM 角色，以支持访问 KMS 密钥。要使用此策略，请将*输入占位符值*替换为您自己的 KMS 密钥 arn。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowKMSKeyUsage",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
        }
    ]
}
```

------

------
#### [ KMS key policy ]

将此内联策略附加到 KMS 密钥，以让指定的 AWS KMS 角色使用该密钥。要使用此策略，请将*输入占位符值*替换为您的 IAM 角色。

```
{
    "Sid": "Allow use of the key",
    "Effect": "Allow",
    "Principal": {
        "AWS": [
            "arn:aws:iam::<catalog-account-id>:role/<role-name>"
        ]
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey",
    ],
    "Resource": "*"
}
```

------

## 向 S3 元数据服务主体授予使用您的 KMS 密钥的权限
<a name="tables-kms-metadata-permissions"></a>

要支持 Amazon S3 更新通过 SSE-KMS 加密的元数据表并对这些元数据表执行维护，您可以使用以下示例密钥策略。在此策略中，您可以让 `metadata.s3.amazonaws.com` 和 `maintenance.s3tables.amazonaws.com` 服务主体使用特定密钥对特定表存储桶中的表进行加密和解密。要使用此策略，请将*用户输入占位符*替换为您自己的信息：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "EnableKeyUsage",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "maintenance.s3tables.amazonaws.com",
                    "metadata.s3.amazonaws.com"
                ]           
            },
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "Condition": {
                "StringLike": {
                    "kms:EncryptionContext:aws:s3:arn":"<table-or-table-bucket-arn>/*"
                }
            }
        }
    ]
}
```

------

# 在表存储桶中指定具有 AWS KMS 密钥的服务器端加密（SSE-KMS）
<a name="s3-tables-kms-specify"></a>

默认情况下，所有 Amazon S3 表存储桶都配置了加密，所有在表存储桶中创建的新表都会自动静态加密。具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）是每个表存储桶的默认加密配置。如果您要指定不同的加密类型，可以使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）。

 可以在 `CreateTableBucket` 或 `CreateTable` 请求中指定 SSE-KMS 加密，也可以在 `PutTableBucketEncryption` 请求中设置表存储桶中的默认加密配置。

**重要**  
要支持对通过 SSE-KMS 加密的表和表存储桶进行自动维护，您必须向 maintenance.s3tables.amazonaws.com 服务主体授予使用 KMS 密钥的权限。有关更多信息，请参阅 [S3 表类数据存储服务 SSE-KMS 加密的权限要求](s3-tables-kms-permissions.md)。

## 为表存储桶指定加密
<a name="specify-kms-table-bucket"></a>

在创建新的表存储桶时，您可以指定 SSE-KMS 作为默认加密类型，有关示例，请参阅[创建表存储桶](s3-tables-buckets-create.md)。创建表存储桶后，您可以使用 REST API 操作、AWS SDK 和 AWS Command Line Interface（AWS CLI）来指定将 SSE-KMS 用作默认加密设置。

**注意**  
 当您将 SSE-KMS 指定为默认加密类型时，用于加密的密钥必须支持访问 S3 表类数据存储服务维护服务主体。如果维护服务主体没有访问权限，您将无法在该表存储桶中创建表。有关更多信息，请参阅 [向 S3 表类数据存储服务维护服务主体授予对 KMS 密钥的权限](s3-tables-kms-permissions.md#tables-kms-maintenance-permissions)。

### 使用 AWS CLI
<a name="w2aac20c35c15b3c17b9b9b1"></a>

要使用以下示例 AWS CLI 命令，请将*用户输入占位符*替换为您自己的信息。

```
aws s3tables put-table-bucket-encryption \
    --table-bucket-arn arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-table-bucket; \
    --encryption-configuration '{
        "sseAlgorithm": "aws:kms",
        "kmsKeyArn": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
    }' \
    --region us-east-1
```

您可以使用 [DeleteTableBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3TableBuckets_DeleteTableBucketEncryption.html) API 操作移除表存储桶的默认加密设置。移除加密设置后，在表存储桶中创建的新表将使用默认的 SSE-S3 加密。

## 为表指定加密
<a name="specify-kms-table"></a>

在使用查询引擎、REST API 操作、AWS SDK 和 AWS Command Line Interface（AWS CLI）创建新表时，可以对该表应用 SSE-KMS 加密。您在创建表时指定的加密设置优先于表存储桶的默认加密设置。

**注意**  
对表使用 SSE-KMS 加密时，用于加密的密钥必须支持 S3 表类数据存储服务维护服务主体访问该表。如果维护服务主体没有访问权限，您将无法创建表。有关更多信息，请参阅 [向 S3 表类数据存储服务维护服务主体授予对 KMS 密钥的权限](s3-tables-kms-permissions.md#tables-kms-maintenance-permissions)。

****所需的权限****

创建加密表需要以下权限
+ `s3tables:CreateTable`
+ `s3tables:PutTableEncryption`

## 使用 AWS CLI
<a name="w2aac20c35c15b3c17c13b1"></a>

以下 AWS CLI 示例使用基本架构创建一个新表，并使用客户自主管理型 AWS KMS 密钥对其进行加密。要使用该命令，请将*用户输入占位符* 替换为您自己的信息。

```
aws s3tables create-table \
  --table-bucket-arn "arn:aws:s3tables:Region:ownerAccountId:bucket/amzn-s3-demo-table-bucket" \
  --namespace "mydataset" \
  --name "orders" \
  --format "ICEBERG" \
  --encryption-configuration '{
    "sseAlgorithm": "aws:kms",
    "kmsKeyArn": "arn:aws:kms:Region:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
  }' \
  --metadata '{
    "iceberg": {
      "schema": {
        "fields": [
          {
            "name": "order_id",
            "type": "string",
            "required": true
          },
          {
            "name": "order_date",
            "type": "timestamp",
            "required": true
          },
          {
            "name": "total_amount",
            "type": "decimal(10,2)",
            "required": true
          }
        ]
      }
    }
  }'
```

数据保护指在数据传输（数据发往和离开 Amazon S3 时）和处于静态（数据存储在 Amazon S3 数据中心的磁盘上时）期间保护数据。S3 表类数据存储服务始终通过 HTTPS 使用传输层安全性（1.2 及更高版本）来保护传输中数据。为保护 S3 表存储桶中的静态数据，您具有以下选项：

**具有 Amazon S3 托管密钥的服务器端加密（SSE-S3）**  
默认情况下，所有 Amazon S3 表存储桶都配置了加密。服务器端加密的默认选项是使用 Amazon S3 托管式密钥（SSE-S3）。这种加密对您来说是免费的，并且适用于 S3 表存储桶中的所有表，除非您指定了另一种加密形式。每个对象都使用唯一的密钥来进行加密。作为额外的保护措施，SSE-S3 使用定期轮换的根密钥加密密钥本身。SSE-S3 使用可用的最强数据块密码之一 [即 256 位高级加密标准（AES-256）] 来加密您的数据。

**具有 AWS KMS 密钥的服务器端加密（SSE-KMS）**  
可以选择将表存储桶或表配置为使用具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）。AWS KMS 中的安全控制可帮助您满足与加密相关的合规性要求。SSE-KMS 可让您通过执行以下操作来更好地控制加密密钥：  
+ 创建、查看、编辑、监控、启用或禁用、轮换以及安排删除 KMS 密钥。
+ 定义控制如何使用和谁可以使用 KMS 密钥的策略。
+ 在 AWS CloudTrail 中跟踪密钥使用情况，以验证 KMS 密钥是否得到正确使用。
S3 表类数据存储服务支持在 SSE-KMS 中使用客户自主管理型密钥来加密表。不支持 AWS 托管式密钥。有关对 S3 表和表存储桶使用 SSE-KMS 的更多信息，请参阅[在表存储桶中使用具有 AWS KMS 密钥的服务器端加密（SSE-KMS）](s3-tables-kms-encryption.md)。

# S3 表类数据存储服务的访问管理
<a name="s3-tables-setting-up"></a>

在 S3 表类数据存储服务中，资源包括表存储桶及其包含的表。默认情况下，创建资源的 AWS 账户的根用户（资源拥有者）和该账户中具有必要权限的 AWS Identity and Access Management（IAM）用户可以访问他们创建的资源。资源拥有者指定还有谁可以访问该资源以及支持他们对该资源执行哪些操作。Amazon S3 具有各种访问管理工具，您可以使用这些工具向其他人授予对您的 S3 资源的访问权限。如果已将表与 AWS Amazon SageMaker 智能湖仓集成，则还可以使用 Lake Formation 管理对表和命名空间的精细访问。以下主题概述了 S3 表类数据存储服务的资源、IAM 操作和条件键。它们还提供了 S3 表类数据存储服务的基于资源和基于身份的策略的示例。

**Topics**
+ [

## 资源
](#s3-tables-resources)
+ [

## S3 表类数据存储服务的操作
](#s3-tables-actions)
+ [

## S3 表类数据存储服务的条件键
](#s3-tables-conditionkeys)
+ [

# S3 表类数据存储服务的基于 IAM 身份的策略
](s3-tables-identity-based-policies.md)
+ [

# S3 表类数据存储服务的基于资源的策略
](s3-tables-resource-based-policies.md)
+ [

# 适用于 S3 表类数据存储服务的 AWS 托管式策略
](s3-tables-security-iam-awsmanpol.md)
+ [

# 使用 SQL 语义授予访问权限
](s3-tables-sql.md)
+ [

# 使用 Lake Formation 管理对表或数据库的访问权限
](grant-permissions-tables.md)

## 资源
<a name="s3-tables-resources"></a>

S3 表类数据存储服务资源包括表存储桶及其包含的表。
+ 表存储桶：表存储桶专为表而设计，与通用 S3 存储桶中自行管理的表相比，可提供更高的每秒事务数（TPS）和更好的查询吞吐量。表存储桶具有与 Amazon S3 通用存储桶相同的耐久性、可用性、可扩展性和性能特征。
+ 表 - 表存储桶中的表以 Apache Iceberg 格式存储。您可以在支持 Iceberg 的查询引擎中使用标准 SQL 查询这些表。

表和表存储桶的 Amazon 资源名称（ARN）包含 `s3tables` 命名空间、AWS 区域、AWS 账户 ID 和存储桶名称。要访问表和表存储桶并对其执行操作，必须使用以下 ARN 格式：
+ 表格 ARN 格式：

  `arn:aws:s3tables:us-west-2:111122223333:bucket/amzn-s3-demo-bucket/table/demo-tableID`

## S3 表类数据存储服务的操作
<a name="s3-tables-actions"></a>

在基于身份的策略或基于资源的策略中，您可以定义对于特定 IAM 主体支持或拒绝哪些 S3 表类数据存储服务操作。表操作对应于存储桶和表级 API 操作。所有操作都是唯一 IAM 命名空间的一部分：`s3tables`。

当您在策略中使用一项操作时，通常会允许或拒绝使用具有相同名称的 API 操作。但在某些情况下，单个操作可控制对多个 API 操作的访问。例如，`s3tables:GetTableData` 操作包括对于 `GetObject`、`ListParts` 和 `ListMultiparts` API 操作的权限。

以下是表存储桶支持的操作。您可以在 IAM 策略或资源策略的 `Action` 元素中指定以下操作。


| Action | 说明 | 访问级别 | 跨账户访问 | 
| --- | --- | --- | --- | 
| s3tables:CreateTableBucket | 授予创建表存储桶的权限 | Write | 否 | 
| s3tables:GetTableBucket | 授予检索表存储桶 ARN、表存储桶名称和创建日期的权限。 | Write | 是 | 
| s3tables:ListTableBuckets | 授予列出此账户中所有表存储桶的权限 | Read | 否 | 
| s3tables:CreateNamespace | 授予在表存储桶中创建命名空间的权限 | Write | 是 | 
| s3tables:GetNamespace | 授予检索命名空间详细信息的权限 | Read | 是 | 
| s3tables:ListNamespaces | 授予列出表存储桶上所有命名空间的权限。 | Read | 是 | 
| s3tables:DeleteNamespace | 授予删除表存储桶中命名空间的权限 | Write | 是 | 
| s3tables:DeleteTableBucket | 授予删除存储桶的权限  | Write | 是  | 
| s3tables:PutTableBucketPolicy | 授予添加或替换存储桶策略的权限 | Permissions Management | 否 | 
| s3tables:GetTableBucketPolicy | 授予检索存储桶策略的权限 | Read | 否 | 
| s3tables:DeleteTableBucketPolicy | 授予删除存储桶策略的权限 | Permissions Management | 否 | 
| s3tables:GetTableBucketMaintenanceConfiguration | 授予检索表存储桶的维护配置的权限 | Read | 是  | 
| s3tables:PutTableBucketMaintenanceConfiguration | 授予添加或替换表存储桶的维护配置的权限 | Write | 是 | 
| s3tables:PutTableBucketEncryption | 授予添加或替换表存储桶的加密配置的权限 | Write | 否 | 
| s3tables:GetTableBucketEncryption | 授予检索表存储桶的加密配置的权限 | Read | 否 | 
| s3tables:DeleteTableBucketEncryption | 授予删除表存储桶的加密配置的权限 | Write | 否 | 

表支持以下操作：


| Action | 说明 | 访问级别 | 跨账户访问 | 
| --- | --- | --- | --- | 
| s3tables:GetTableMaintenanceConfiguration | 授予检索表的维护配置的权限 | Read | 是 | 
| s3tables:PutTableMaintenanceConfiguration |  授予添加或替换表的维护配置的权限 | Write | 是 | 
| s3tables:PutTablePolicy | 授予添加或替换表策略的权限 | Permissions Management | 否 | 
| s3tables:GetTablePolicy | 授予检索表策略的权限 | Read | 否 | 
| s3tables:DeleteTablePolicy | 授予删除表策略的权限 | Permissions management | 否 | 
| s3tables:CreateTable | 授予在表存储桶中创建表的权限 | Write | 是 | 
| s3tables:GetTable | 授予检索表信息的权限 | Read | 是 | 
| s3tables:GetTableMetadataLocation | 授予检索表根指针（元数据文件）的权限 | Read | 是  | 
| s3tables:ListTables | 授予列出表存储桶中的所有表的权限 | Read | 是  | 
| s3tables:RenameTable | 授予更改表名称的权限 | Write | 是  | 
| s3tables:UpdateTableMetadataLocation | 授予更新表根指针（元数据文件）的权限 | Write | 是  | 
| s3tables:GetTableData | 授予读取存储在表存储桶中的表元数据和数据对象的权限 | Read | 是 | 
| s3tables:PutTableData | 授予写入存储在表存储桶中的表元数据和数据对象的权限 | Write | 是 | 
| s3tables:GetTableEncryption  | 授予检索表的加密设置的权限 | Write | 否 | 
| s3tables:PutTableEncryption  | 授予将加密添加到表的权限 | Write | 否 | 
| s3tables:DeleteTable | 授予从表存储桶中删除表的权限 | Write | 是 | 

为了执行表级读取和写入操作，S3 表类数据存储服务支持如 `GetObject` 和 `PutObject` 等 Amazon S3 API 操作。下表提供了对象级操作的列表。在授予对表的读写权限时，您可以使用以下操作。


| Action | S3 对象 API | 
| --- | --- | 
| s3tables:GetTableData | GetObject, ListParts, HeadObject | 
| s3tables:PutTableData | PutObject, CreateMultipartUpload, CompleteMultipartUpload,  UploadPart, AbortMultipartUpload | 

例如，如果用户拥有 `GetTableData` 权限，则他们可以读取与该表关联的所有文件，例如其元数据文件、清单、清单列表文件和 parquet 数据文件。

## S3 表类数据存储服务的条件键
<a name="s3-tables-conditionkeys"></a>

S3 表类数据存储服务支持 [AWS 全局条件上下文条件键](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_condition-keys.html)。

此外，S3 表类数据存储服务定义以下可以在访问策略中使用的条件键。


| 条件键 | 说明 | 类型 | 
| --- | --- | --- | 
|  s3tables:tableName |  按表存储桶中表的名称筛选访问权限。您可以使用 `s3tables:tableName` 条件键来编写 IAM 或表存储桶策略，以限制用户或应用程序仅可访问符合此名称条件的表。  请务必注意，如果您使用 `s3tables:tableName` 条件键来控制访问权限，则表名称的更改可能会影响这些策略。 示例值："s3tables:tableName":"department\$1" | String | 
|  s3tables:namespace |  按在表存储桶中创建的命名空间筛选访问权限。 您可以使用 `s3tables:namespace` 条件键编写 IAM、表或表存储桶策略，以限制用户或应用程序对作为特定命名空间一部分的表的访问权限。*示例值：*`"s3tables:namespace":"hr" ` 请务必注意，如果您使用 `s3tables:namespace` 条件键来控制访问权限，那么命名空间的更改可能会影响这些策略。  | String | 
|  s3tables:SSEAlgorithm |  按用于加密表的服务器端加密算法筛选访问权限。 您可以使用 `s3tables:SSEAlgorithm` 条件键编写 IAM、表或表存储桶策略，以限制用户或应用程序只能访问使用特定加密类型加密的表。*示例值：*`"s3tables:SSEAlgorithm":"aws:kms" ` 请务必注意，如果您使用 `s3tables:SSEAlgorithm` 条件键来控制访问权限，那么加密的更改可能会影响这些策略。  | String | 
|  s3tables:KMSKeyArn |  按用于加密表的密钥的 AWS KMS 密钥 ARN 筛选访问权限 您可以使用 `s3tables:KMSKeyArn` 条件键来编写 IAM、表或表存储桶策略，以限制用户或应用程序只能访问使用特定 KMS 密钥加密的表。 请务必注意，如果您使用 `s3tables:KMSKeyArn` 条件键来控制访问权限，则更改 KMS 密钥可能会影响这些策略。  | ARN | 

# S3 表类数据存储服务的基于 IAM 身份的策略
<a name="s3-tables-identity-based-policies"></a>

默认情况下，用户和角色不拥有创建或修改表和表存储桶的权限。他们也无法通过 s3 控制台、AWS Command Line Interface（AWS CLI）或 Amazon S3 REST API 执行任务。要创建和访问表存储桶和表，AWS Identity and Access Management（IAM）管理员必须向 IAM 角色或用户授予必要的权限。要了解如何使用这些示例 JSON 策略文档创建基于 IAM 身份的策略，请参阅 *IAM 用户指南*中的 [创建 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)。

以下主题包括基于 IAM 身份的策略示例。要使用以下示例策略，请将*用户输入占位符* 替换为您自己的信息。

**Topics**
+ [

## 示例 1：支持创建和使用表存储桶的访问权限
](#example-1-s3-tables-identity-based-policies)
+ [

## 示例 2：支持在表存储桶中创建和使用表的访问权限
](#example-2-s3-tables-identity-based-policies)

## 示例 1：支持创建和使用表存储桶的访问权限
<a name="example-1-s3-tables-identity-based-policies"></a>

**.**

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowBucketActions",
            "Effect": "Allow",
            "Action": [
                "s3tables:CreateTableBucket",
                "s3tables:PutTableBucketPolicy",
                "s3tables:GetTableBucketPolicy",
                "s3tables:ListTableBuckets",
                "s3tables:GetTableBucket"
            ],
            "Resource": "arn:aws:s3tables:us-east-1:111122223333:bucket/*"
        }
    ]
}
```

------

## 示例 2：支持在表存储桶中创建和使用表的访问权限
<a name="example-2-s3-tables-identity-based-policies"></a>

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowBucketActions",
            "Effect": "Allow",
            "Action": [
                "s3tables:GetTableBucket",
                "s3tables:ListTables",
                "s3tables:CreateTable",
                "s3tables:PutTableData",
                "s3tables:GetTableData",
                "s3tables:GetTable",
                "s3tables:GetTableMetadataLocation",
                "s3tables:UpdateTableMetadataLocation",
                "s3tables:GetNamespace",
                "s3tables:CreateNamespace",
                "s3tables:ListNamespaces"
            ],
            "Resource": [
                "arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-bucket",
                "arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-bucket/table/*"
            ]
        }
    ]
}
```

------

# S3 表类数据存储服务的基于资源的策略
<a name="s3-tables-resource-based-policies"></a>

S3 表类数据存储服务提供了基于资源的策略，用于管理对表存储桶和表的访问权限：表存储桶策略和表策略。可以使用表存储桶策略在表存储桶、命名空间或表级授予 API 访问权限。附加到表存储桶的权限可以应用于存储桶中的所有表，也可以应用于存储桶中的特定表，具体取决于策略定义。可以使用表策略在表级授予权限。

当 S3 表类数据存储服务收到请求时，它首先验证请求者是否拥有必要的权限。它对所有相关访问策略、用户策略和基于资源的策略（IAM 用户策略、IAM 角色策略、表存储桶策略和表策略）进行评估，以决定是否对该请求进行授权。例如，如果表存储桶策略授予用户对存储桶中的表执行所有操作（包括 `DeleteTable`）的权限，但单个表的表策略拒绝所有用户执行 `DeleteTable` 操作，则该用户无法删除该表。

以下主题包括表和表存储桶策略的示例。要使用这些策略，请将*用户输入占位符* 替换为您自己的信息。

**注意**  
每个授予修改表的权限的策略都应包括供 `GetTableMetadataLocation` 访问表根文件的权限。有关更多信息，请参阅 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3TableBuckets_GetTableMetadataLocation.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3TableBuckets_GetTableMetadataLocation.html)。
每次对表执行写入或删除活动时，都要在访问策略中包含对 `UpdateTableMetadataLocation` 的权限。
我们建议使用表存储桶策略来管理对存储桶级操作的访问权限，并使用表策略来管理对表级操作的访问权限。如果您想在多个表中定义相同的权限集，那么我们建议使用表存储桶策略。

**Topics**
+ [

## 示例 1：表存储桶策略支持对账户中的存储桶执行 `PutBucketMaintenanceConfiguration` 的访问权限
](#table-bucket-policy-1)
+ [

## 示例 2：支持对存储在 `hr` 命名空间中的表进行读取（SELECT）访问的表存储桶策略
](#table-bucket-policy-2)
+ [

## 示例 3：支持用户删除表的表策略
](#table-bucket-policy-3)

## 示例 1：表存储桶策略支持对账户中的存储桶执行 `PutBucketMaintenanceConfiguration` 的访问权限
<a name="table-bucket-policy-1"></a>

以下示例表存储桶策略通过支持访问 `PutBucketMaintenanceConfiguration`，可让 IAM `data steward` 删除账户中所有存储桶的未引用对象。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/datasteward"
            },
            "Action": [
                "s3tables:PutTableBucketMaintenanceConfiguration"
            ],
            "Resource": "arn:aws:s3tables:us-east-1:111122223333:bucket/*"
        }
    ]
}
```

------

## 示例 2：支持对存储在 `hr` 命名空间中的表进行读取（SELECT）访问的表存储桶策略
<a name="table-bucket-policy-2"></a>

以下示例表存储桶策略支持 Jane（来自 AWS 账户 ID `123456789012` 的用户）访问存储在表存储桶的 `hr` 命名空间中的表。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/Jane"
            },
            "Action": [
                "s3tables:GetTableData",
                "s3tables:GetTableMetadataLocation"
            ],
            "Resource": "arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-table-bucket/table/*",
            "Condition": {
                "StringLike": {
                    "s3tables:namespace": "hr"
                }
            }
        }
    ]
}
```

------

## 示例 3：支持用户删除表的表策略
<a name="table-bucket-policy-3"></a>

以下示例表策略支持 IAM 角色 `data steward` 删除表。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "DeleteTable",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/datasteward"
            },
            "Action": [
                "s3tables:DeleteTable",
                "s3tables:UpdateTableMetadataLocation",
                "s3tables:PutTableData",
                "s3tables:GetTableMetadataLocation"
            ],
            "Resource": "arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-bucket/table/tableUUID"
        }
    ]
}
```

------

# 适用于 S3 表类数据存储服务的 AWS 托管式策略
<a name="s3-tables-security-iam-awsmanpol"></a>

AWS 托管式策略是由 AWS 创建和管理的独立策略。AWS 托管式策略旨在为许多常见使用案例提供权限，以便您可以开始为用户、组和角色分配权限。

请记住，AWS 托管式策略可能不会为您的特定使用案例授予最低权限，因为它们可供所有 AWS 客户使用。我们建议通过定义特定于使用案例的[客户管理型策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)来进一步减少权限。

您无法更改 AWS 托管式策略中定义的权限。如果 AWS 更新在 AWS 托管式策略中定义的权限，则更新会影响该策略所附加到的所有主体身份（用户、组和角色）。当新的 AWS 服务 启动或新的 API 操作可用于现有服务时，AWS 最有可能更新 AWS 托管式策略。

有关更多信息，请参阅《*IAM 用户指南*》中的 [AWS 托管式策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。

## AWS 托管式策略：AmazonS3TablesFullAccess
<a name="s3-tables-security-iam-awsmanpol-amazons3tablesfullaccess"></a>

您可以将 `AmazonS3TablesFullAccess` 策略附加到 IAM 身份。此策略授予支持完全访问 Amazon S3 表类数据存储服务的权限。有关此策略的更多信息，请参阅“[https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonS3TablesFullAccess.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonS3TablesFullAccess.html)”。

## AWS 托管式策略：AmazonS3TablesReadOnlyAccess
<a name="s3-tables-security-iam-awsmanpol-amazons3readonlyaccess"></a>

您可以将 `AmazonS3TablesReadOnlyAccess` 策略附加到 IAM 身份。此策略授予支持对 Amazon S3 表类数据存储服务进行只读访问的权限。有关此策略的更多信息，请参阅“[https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonS3TablesReadOnlyAccess.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonS3TablesReadOnlyAccess.html)”。

## AWS 托管式策略：AmazonS3TablesLakeFormationServiceRole
<a name="s3-tables-security-iam-awsmanpol-amazons3tableslakeformationservicerole"></a>

您可以将 `AmazonS3TablesLakeFormationServiceRole` 策略附加到 IAM 身份。此策略授予支持 AWS Lake Formation 服务角色访问 S3 表类数据存储服务的权限。AWS KMS 权限用于支持 Lake Formation 访问加密的表。有关此策略的更多信息，请参阅“[https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonS3TablesLakeFormationServiceRole.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonS3TablesLakeFormationServiceRole.html)”。

## Amazon S3 表类数据存储服务对 AWS 托管式策略的更新
<a name="s3-tables-security-iam-awsmanpol-updates"></a>

查看有关自 Amazon S3 表类数据存储服务开始跟踪更改以来，对 S3 表类数据存储服务的 AWS 托管式策略的更新的详细信息。


| 更改 | 描述 | 日期 | 
| --- | --- | --- | 
|  Amazon S3 表类数据存储服务更新了 `AmazonS3TablesFullAccess`。  |  S3 表类数据存储服务更新了名为 `AmazonS3TablesFullAccess` 的 AWS 托管策略。此更新将授予向 S3 表类数据存储服务复制服务传递角色的权限。  |  2025 年 12 月 2 日  | 
|  Amazon S3 表类数据存储服务添加了 `AmazonS3TablesLakeFormationServiceRole`。  |  S3 表类数据存储服务添加了一个名为 `AmazonS3TablesLakeFormationServiceRole` 的新 AWS 托管式策略。此策略授予支持 Lake Formation 服务角色访问 S3 表类数据存储服务的权限。  | 2025 年 5 月 19 日 | 
|  Amazon S3 表类数据存储服务添加了 `AmazonS3TablesFullAccess`。  |  S3 表类数据存储服务添加了一个名为 `AmazonS3TablesFullAccess` 的新 AWS 托管式策略。此策略授予支持完全访问 Amazon S3 表类数据存储服务的权限。  | 2024 年 12 月 3 日 | 
|  Amazon S3 表类数据存储服务添加了 `AmazonS3TablesReadOnlyAccess`。  |  S3 表类数据存储服务添加了一个名为 `AmazonS3TablesReadOnlyAccess` 的新 AWS 托管式策略。此策略授予支持对 Amazon S3 表类数据存储服务进行只读访问的权限。  | 2024 年 12 月 3 日 | 
|  Amazon S3 表类数据存储服务开始了跟踪更改。  |  Amazon S3 表类数据存储服务为其 AWS 托管式策略开始了跟踪更改。  | 2024 年 12 月 3 日 | 

# 使用 SQL 语义授予访问权限
<a name="s3-tables-sql"></a>

可以通过在表和表存储桶策略中使用 SQL 语义来授予对表的权限。可以使用的 SQL 语义的示例为 `CREATE`、`INSERT`、`DELETE`、`UPDATE` 和 `ALTER`。下表提供了与 SQL 语义关联的 API 操作的列表，您可以使用这些操作向用户授予权限。

S3 表类数据存储服务部分支持使用 SQL 语义的权限。例如，`CreateTable` API 仅在表存储桶中创建一个空表。您需要额外的权限（例如 `UpdateTableMetadata`、`PutTableData` 和 `GetTableMetadataLocation`），才能设置表架构。这些额外权限还意味着您还授予用户在表中插入行的权限。如果您希望纯粹基于 SQL 语义来管理访问权限，那么我们建议您使用 [AWS Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html) 或任何与 S3 表类数据存储服务集成的第三方解决方案。


| 表级活动 | IAM 操作 | 
| --- | --- | 
| SELECT | s3tables:GetTableData, s3tables:GetTableMetadataLocation | 
| CREATE | s3tables:CreateTable, s3tables:UpdateTableMetadataLocation, s3tables:PutTableData, s3tables:GetTableMetadataLocation,  | 
| INSERT | s3tables:UpdateTableMetadataLocation, s3tables:PutTableData, s3tables:GetTableMetadataLocation | 
| UPDATE | s3tables:UpdateTableMetadataLocation, s3tables:PutTableData, s3tables:GetTableMetadataLocation | 
| ALTER,RENAME | s3tables:UpdateTableMetadataLocation, s3tables:PutTableData, s3tables:GetTableMetadataLocation, s3tables:RenameTable  | 
| DELETE,DROP | s3tables:DeleteTable, s3tables:UpdateTableMetadataLocation, s3tables:PutTableData, s3tables:GetTableMetadataLocation  | 

**注意**  
从表存储桶中删除表需要 `s3tables:DeleteTable` 权限。此权限可让您永久移除表及其所有关联数据和元数据。请谨慎使用此权限，因为删除操作无法撤消。

# 使用 Lake Formation 管理对表或数据库的访问权限
<a name="grant-permissions-tables"></a>

在表存储桶与 AWS 分析服务集成后，Lake Formation 将管理对表的访问，并要求向每个 IAM 主体（用户或角色）授权对分析服务执行操作。Lake Formation 使用其自己的权限模型（Lake Formation 权限），该模型可以对数据目录资源进行精细的访问控制。

有关更多信息，请参阅《AWS Lake Formation Developer Guide》**中的 [Overview of Lake Formation permissions](https://docs.aws.amazon.com//lake-formation/latest/dg/lf-permissions-overview.html)。

AWS Lake Formation 中有两种主要类型的权限：

1. 元数据访问权限控制着在数据目录中创建、读取、更新和删除元数据数据库和表的能力。

1. 基础数据访问权限控制着对数据目录资源指向的基础 Amazon S3 位置读取和写入数据的能力。

Lake Formation 结合使用自己的权限模型和 IAM 权限模型，来控制对数据目录资源和基础数据的访问权限：
+ 为了使访问数据目录资源或基础数据的请求取得成功，请求必须通过由 IAM 和 Lake Formation 进行的权限检查。
+ IAM 权限控制对 Lake Formation 和 AWS Glue API 以及资源的访问权限，而 Lake Formation 权限控制对数据目录资源、Amazon S3 位置和基础数据的访问权限。

Lake Formation 权限仅适用于授予这些权限的区域，并且主体必须由数据湖管理员或其它具有必要权限的主体授权，才能获得 Lake Formation 权限。

**注意**  
如果您是执行表存储桶集成的用户，则您已经拥有对表的 Lake Formation 权限。如果您是唯一将访问表的主体，则可以跳过此步骤。您只需向其它 IAM 主体授予对表的 Lake Formation 权限即可。这可让其它主体在运行查询时访问该表。有关更多信息，请参阅 [授予对表或数据库的 Lake Formation 权限](#grant-lf-table)。

## 授予对表或数据库的 Lake Formation 权限
<a name="grant-lf-table"></a>

您可以通过 Lake Formation 控制台或 AWS CLI，向主体授予对表存储桶中表或数据库的 Lake Formation 权限。

**注意**  
当您将对数据目录资源的 Lake Formation 权限授予外部账户或直接授予其他账户中的 IAM 主体时，Lake Formation 会使用 AWS Resource Access Manager (AWS RAM) 服务共享该资源。如果被授权者账户与授予者账户在同一个组织中，则被授权者立即可以使用共享资源。如果被授权者账户不在同一个组织中，则 AWS RAM 会向被授权者账户发送邀请，以便其接受或拒绝资源授权。然后，要使共享资源可用，被授权者账户中的数据湖管理员必须使用 AWS RAM 控制台或 AWS CLI 接受邀请。有关跨账户数据共享的更多信息，请参阅《AWS Lake Formation Developer Guide》**中的 [Cross-account data sharing in Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/cross-account-permissions.html)。

------
#### [ Console ]

1. 打开 AWS Lake Formation 控制台（网址为 [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)），并以数据湖管理员身份登录。有关如何创建数据湖管理员的更多信息，请参阅《AWS Lake Formation Developer Guide》**中的 [Create a data lake administrator](https://docs.aws.amazon.com/lake-formation/latest/dg/initial-lf-config.html#create-data-lake-admin)。

1. 在导航窗格中，选择**数据权限**，然后选择**授予**。

1. 在**授予权限**页面的**主体**下，执行以下操作之一：
   + 对于 Amazon Athena 或 Amazon Redshift，选择 **IAM 用户和角色**，然后选择您用于查询的 IAM 主体。
   + 对于 Amazon Data Firehose，选择 **IAM 用户和角色**，然后选择您创建的服务角色以流式传输到表中。
   + 对于 Quick，选择 **SAML 用户和组**，然后输入 Quick 管理员用户的 Amazon 资源名称（ARN）。
   + 要访问 AWS Glue Iceberg REST 端点，请选择 **IAM 用户和角色**，然后选择您为客户端创建的 IAM 角色。有关更多信息，请参阅 [为客户端创建 IAM 角色](s3-tables-integrating-glue-endpoint.md#glue-endpoint-create-iam-role)。

1. 在 **LF 标签或目录资源**下，选择**命名 Data Catalog 资源**。

1. 对于**目录**，请选择您在集成表存储桶时创建的子目录，例如 `account-id:s3tablescatalog/amzn-s3-demo-bucket`。

1. 对于**数据库**，选择您创建的 S3 表存储桶命名空间。

1. （可选）对于**表**，请选择您在表存储桶中创建的 S3 表。
**注意**  
如果您要在 Athena 查询编辑器中创建新表，请不要选择表。

1. 请执行以下操作之一：
   + 如果您在之前的步骤中指定了表，请为**表权限**选择 **Super**。
   + 如果您未在之前的步骤中指定表，请转到**数据库权限**。对于跨账户数据共享，您不能选择 **Super** 来向另一个主体授予对数据库的所有权限。而是应选择更精细的权限，例如**描述**。

1. 选择**授权**。

------
#### [ CLI ]

1. 务必要以数据湖管理员身份运行以下 AWS CLI 命令。有关更多信息，请参阅《AWS Lake Formation Developer Guide》**中的 [Create a data lake administrator](https://docs.aws.amazon.com//lake-formation/latest/dg/initial-lf-config.html#create-data-lake-admin)。

1. 运行以下命令，向 IAM 主体授予对 S3 表存储桶中表的 Lake Formation 权限以访问该表。要使用此示例，请将 *`user input placeholders`* 替换为您自己的信息。

   ```
   aws lakeformation grant-permissions \
   --region us-east-1 \
   --cli-input-json \
   '{
       "Principal": {
           "DataLakePrincipalIdentifier": "user or role ARN, for example, arn:aws:iam::account-id:role/example-role"
       },
       "Resource": {
           "Table": {
               "CatalogId": "account-id:s3tablescatalog/amzn-s3-demo-bucket",
               "DatabaseName": "S3 table bucket namespace, for example, test_namespace",
               "Name": "S3 table bucket table name, for example test_table"
           }
       },
       "Permissions": [
           "ALL"
       ]
   }'
   ```

------

# S3 表类数据存储服务的 VPC 连接
<a name="s3-tables-VPC"></a>

S3 表类数据存储服务中的所有表均采用 Apache Iceberg 格式，并由两种类型的 S3 对象组成。这两种类型的对象是存储数据的数据文件，以及跟踪有关不同时间点的数据文件信息的元数据文件。所有表存储桶、命名空间和表操作（例如 `CreateNamespace`、`CreateTable` 等）均通过 S3 表类数据存储服务端点 (`s3tables.region.amazonaws.com`) 路由，而读取或写入数据和元数据文件的所有对象级操作都将继续通过 S3 服务端点 (`s3.region.amazonaws.com`) 路由。

为访问 S3 表类数据存储服务，Amazon S3 通过使用 AWS PrivateLink 支持两种类型的 VPC 端点：网关端点和接口端点。网关端点是您在路由表中指定的网关，用于通过 AWS 网络从 VPC 访问 S3。接口端点通过私有 IP 地址，使用 VPC 对等连接或 AWS Transit Gateway 将请求从您的 VPC 内、本地或其它 AWS 区域中的 VPC 路由到 Amazon S3，从而扩展网关端点的功能。

要从 VPC 访问 S3 表类数据存储服务，我们建议创建两个 VPC 端点（一个用于 S3，另一个用于 S3 表类数据存储服务）。可以创建网关或接口端点来将文件（对象）级操作路由到 S3，并创建接口端点来将存储桶和表级操作路由到 S3 表。可以使用 S3 为文件级请求创建和使用 VPC 端点。有关更多信息，请参阅《AWS PrivateLink 用户指南》**中的 [Gateway endpoints](https://docs.aws.amazon.com/vpc/latest/privatelink/gateway-endpoints.html)。

要了解有关使用 AWS PrivateLink 为 S3 表类数据存储服务创建和使用端点的更多信息，请参阅以下主题。要创建 VPC 接口端点，请参阅《AWS PrivateLink Guide》**中的 [Create a VPC endpoint](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws)。

**Topics**
+ [

## 为 S3 表类数据存储服务创建 VPC 端点
](#s3-tables-endpoints)
+ [

## 使用 AWS CLI 通过端点访问表存储桶和表
](#s3-tables-endpoints-cli-sdks)
+ [

## 使用查询引擎时配置 VPC 网络
](#s3-tables-query-engine)
+ [

## 使用双堆栈端点访问表和表存储桶
](#s3-tables-dual-stack-endpoints)
+ [

## 在 VPC 网络中限制对 S3 表类数据存储服务的访问权限
](#s3-tables-VPC-policy)

## 为 S3 表类数据存储服务创建 VPC 端点
<a name="s3-tables-endpoints"></a>

当您创建 VPC 端点时，S3 表类数据存储服务会生成两种类型的特定于端点的 DNS 名称：区域和可用区。
+ 区域 DNS 名称采用以下格式：`VPCendpointID.s3tables.AWSregion.vpce.amazonaws.com`。例如，对于 VPC 端点 ID `vpce-1a2b3c4d`，生成的 DNS 名称将类似于 `vpce-1a2b3c4d-5e6f.s3tables.us-east-1.vpce.amazonaws.com` 
+ 可用区 DNS 名称采用以下格式：`VPCendpointID-AvailabilityZone.s3tables.AWSregion.vpce.amazonaws.com`。例如，对于 VPC 端点 ID `vpce-1a2b3c4d-5e6f.`，生成的 DNS 名称将类似于 `vpce-1a2b3c4d-5e6f-us-east-1a.s3tables.us-east-1.vpce.amazonaws.com` 

   可用区 DNS 名称包括您的可用区。如果您的架构隔离了可用区，则可以使用可用区 DNS 名称。可以从 S3 公有 DNS 域解析端点特定的 S3 DNS 名称。

还可以使用私有 DNS 选项来简化通过 VPC 端点路由 S3 流量的过程，并协助您充分利用应用程序可用的最低成本网络路径。私有 DNS 将 S3 表类数据存储服务的公有端点（例如 `s3tables.region.amazonaws.com`）映射到 VPC 中的私有 IP。可以使用私有 DNS 选项来路由区域 S3 流量，而无需更新 S3 客户端以使用接口端点的端点特定的 DNS 名称。

## 使用 AWS CLI 通过端点访问表存储桶和表
<a name="s3-tables-endpoints-cli-sdks"></a>

可以使用 AWS Command Line Interface（AWS CLI）通过接口端点访问表存储桶和表。使用 AWS CLI，`aws s3` 命令通过 Amazon S3 端点路由流量。`aws s3tables` AWS CLI 命令使用 Amazon S3 表类数据存储服务端点。

`s3tables` VPC 端点的示例为 `vpce-0123456afghjipljw-nmopsqea.s3tables.region.vpce.amazonaws.com`

`s3tables` VPC 端点不包含存储桶名称。可以使用 `aws s3tables` AWS CLI 命令访问 `s3tables` VPC 端点。

`s3` VPC 端点的示例为 `amzn-s3-demo-bucket.vpce-0123456afghjipljw-nmopsqea.s3.region.vpce.amazonaws.com`

可以使用 `aws s3` AWS CLI 命令访问 `s3` VPC 端点。

### 使用 AWS CLI
<a name="set-s3tables-vpc-cli"></a>

要使用 AWS CLI 通过接口端点访问表存储桶和表，请使用 `-region` 和 `--endpoint-url` 参数。要执行表存储桶和表级操作，请使用 S3 表类数据存储服务端点 URL。要执行对象级操作，请使用 Amazon S3 端点 URL。

在以下示例中，请将*用户输入占位符* 替换为您自己的信息。

**示例 1：使用端点 URL 列出账户中的表存储桶**

```
aws s3tables list-table-buckets --endpoint https://vpce-0123456afghjipljb-aac.s3tables.us-east-1.vpce.amazonaws.com —region us-east-1
```

**示例 2：使用端点 URL 列出存储桶中的表**

```
aws s3tables list-tables --table-bucket-arn arn:aws:s3tables:us-east-1:123456789301:bucket/amzn-s3-demo-bucket --endpoint https://vpce-0123456afghjipljb-aac.s3tables.us-east-1.vpce.amazonaws.com --region us-east-1
```

## 使用查询引擎时配置 VPC 网络
<a name="s3-tables-query-engine"></a>

使用查询引擎时，请使用以下步骤配置 VPC 网络。

1. 要开始使用，您可以创建或更新 VPC。有关更多信息，请参阅[创建 VPC](https://docs.aws.amazon.com//vpc/latest/userguide/create-vpc.html#create-vpc-and-other-resources)。

1.  对于路由到 S3 表类数据存储服务的表和表存储桶级操作，请创建一个新的接口端点。有关更多信息，请参阅[使用接口 VPC 端点访问 AWS 服务](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws)。

1.  对于路由到 Amazon S3 的所有对象级操作，请创建网关端点或接口端点。有关网关端点的更多信息，请参阅 [Create a gateway endpoint](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-s3.html#create-gateway-endpoint-s3)。

1.  接下来，配置数据资源并启动 Amazon EMR 集群。有关更多信息，请参阅 [Getting started with Amazon EMR](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-gs.html)。

1. 然后，可以通过从 VPC 端点中选择 DNS 名称，来提交带有额外配置的 Spark 应用程序。例如 `spark.sql.catalog.ice_catalog.s3tables.endpoint` 和 `https://interface-endpoint.s3tables.us-east-1.vpce.amazonaws.com`。有关更多信息，请参阅 [Submit work to your Amazon EMR cluster](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-gs.html#emr-getting-started-manage)。

## 使用双堆栈端点访问表和表存储桶
<a name="s3-tables-dual-stack-endpoints"></a>

S3 表类数据存储服务支持将双堆栈连接用于 AWS PrivateLink。除了 IPv4 协议之外，双堆栈端点还支持您使用互联网协议版本 6（IPv6）访问 S3 表存储桶，具体取决于网络支持的协议版本。您可以使用以下命名约定通过双堆栈端点访问 S3 存储桶：

```
s3tables.<region>.api.aws
```

在尝试在 VPC 中通过 IPv6 访问 S3 表和表存储桶之前，您应该了解以下事项：
+ 用于访问表的客户端和您的 S3 客户端都必须启用了双堆栈。
+ 默认情况下，未为 VPC 安全组启用 IPv6 入站。要支持 IPv6 访问，您需要添加一条新规则，以支持 HTTPS（TCP 端口 443）访问您的安全组。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/changing-security-group.html#add-remove-security-group-rules](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/changing-security-group.html#add-remove-security-group-rules)。
+ 如果您的 VPC 未分配 IPv6 CIDR，则需要手动将 IPv6 CIDR 数据块添加到 VPC。有关更多信息，请参阅《AWS PrivateLink 用户指南》**中的[https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6-add.html](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6-add.html)。
+ 如果您使用 IP 地址筛选 IAM 策略，则必须对这些策略进行更新才能处理 IPv6 地址。有关使用 IAM 管理访问权限的更多信息，请参阅 [Amazon S3 的身份和访问管理](https://docs.aws.amazon.com/AmazonS3/latest/userguide/security-iam.html)。

要创建将双堆栈端点用于 S3 表类数据存储服务的新 VPC 端点，请使用示例 CLI 命令：

```
aws ec2 create-vpc-endpoint \
  --vpc-id vpc-id \
  --service-name com.amazonaws.aws-region.s3tables \
  --subnet-ids subnet-1 subnet-2 \
  --vpc-endpoint-type Interface \
  --ip-address-type dualstack \
  --dns-options "DnsRecordIpType=dualstack" \
  --security-group-ids sg-id \
  --region aws-region
```

有关创建 VPC 端点的更多信息，请参阅《VPC User Guide》中的 [https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html)。

如果您的网络支持 IPv6，并且您想更新您的 VPC 以启用 IPv6，则可以使用以下 CLI 命令：

```
aws ec2 modify-vpc-endpoint \
  --vpc-endpoint-id vpce-id \
  --ip-address-type dualstack \
  --dns-options "DnsRecordIpType=dualstack" \
  --region aws-region
```

## 在 VPC 网络中限制对 S3 表类数据存储服务的访问权限
<a name="s3-tables-VPC-policy"></a>

与基于资源的策略类似，可以向 VPC 端点附加端点策略，来控制对表和表存储桶的访问权限。在以下示例中，接口端点策略限制为仅可访问特定的表存储桶。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "Policy141511512309",
    "Statement": [
        {
            "Sid": "Access-to-specific-bucket-only",
            "Principal": "*",
            "Action": "s3tables:*",
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-bucket",
                "arn:aws:s3tables:us-east-1:111122223333:bucket/amzn-s3-demo-bucket/*"
            ]
        }
    ]
}
```

------

# S3 表类数据存储服务的安全注意事项和限制
<a name="s3-tables-restrictions"></a>

以下列表描述了 S3 表类数据存储服务不支持或限制哪些安全和访问控制特性和功能。
+ 不支持公有访问策略。用户无法修改存储桶或表策略来支持公有访问。
+ 不支持用于访问与表关联的对象的预签名 URL。
+ 不支持通过 HTTP 发出的请求。对于通过 HTTP 发出的任何请求，Amazon S3 都会自动以 HTTP 重定向作为响应，从而将请求升级到 HTTPS。
+ 使用 REST API 向接入点发出请求时，必须使用 AWS 签名版本 4。
+ 通过互联网协议版本 6（IPv6）发出的请求仅适用于通过表存储端点执行对象级操作，而不适用于表级和存储桶级操作。
+ 表存储桶和表访问策略的大小限制为 20 KB。