

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 分析加密 Amazon S3 对象
<a name="discovery-supported-encryption-types"></a>

当你为你启用 Amazon Macie 时 AWS 账户，Macie 会创建一个[服务相关角色，该角色](service-linked-roles.md)授予 Macie 代表你调用亚马逊简单存储服务 (Amazon S3) 和其他服务所需的权限。 AWS 服务 服务相关角色简化了设置的过程， AWS 服务 因为您不必手动添加服务权限即可代表您完成操作。要了解这类角色，请参阅《AWS Identity and Access Management 用户指南》**中的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。

Macie 服务相关角色的权限策略 (`AWSServiceRoleForAmazonMacie`) 允许 Macie 执行操作，包括检索有关 S3 存储桶和对象的信息，以及检索和分析 S3 存储桶内的对象。如果您的账户是组织的 Macie 管理员账户，则该策略还允许 Macie 代表您对组织中的成员账户执行此操作。

如果 S3 对象已加密，则 Macie 服务相关角色的权限策略通常会向 Macie 授权解密该对象。但是，这取决于其使用的加密类型。还可能取决于是否允许 Macie 使用适当的加密密钥。

**Topics**
+ [S3 对象加密选项](#discovery-supported-encryption-types-matrix)
+ [允许 Macie 使用客户管理的服务器 AWS KMS key](#discovery-supported-encryption-cmk-configuration)

## Amazon S3 对象的加密选项
<a name="discovery-supported-encryption-types-matrix"></a>

Amazon S3 支持多种 S3 对象的加密选项。对于其中的大多数选项，Amazon Macie 都可以使用账户的 Macie 服务关联角色解密对象。但是，这取决于用于对象的加密类型。

**具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）**  
如果对象是使用具有 Amazon S3 托管密钥（SSE-S3）的服务器端加密，Macie 可以解密此对象。  
若要了解此类加密，请参阅*《Amazon Simple Storage Service 用户指南》*中的[使用具有 Amazon S3 托管密钥的服务器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingServerSideEncryption.html)。

**使用 AWS KMS keys （DSSE-KMS 和 SSE-KMS）进行服务器端加密**  
如果使用双层服务器端加密或使用 AWS 托管 AWS KMS key （DSSE-KMS 或 SSE-KMS）进行服务器端加密对对象进行加密，Macie 可以解密该对象。  
[如果使用双层服务器端加密或由客户管理的服务器端加密 AWS KMS key （DSSE-KMS 或 SSE-KMS）对对象进行加密，则只有在您允许 Macie 使用密钥的情况下，Macie 才能解密该对象。](#discovery-supported-encryption-cmk-configuration)对于使用完全在内部管理的 KMS 密钥 AWS KMS 和在外部密钥存储中管理的 KMS 密钥加密的对象，情况就是这样。如果不允许 Macie 使用适当的 KMS 密钥，则 Macie 只能存储和报告此对象的元数据。  
要了解这些类型的加密，请参阅*《Amazon Simple Storage Service 用户指南》*中的[使用 AWS KMS keys的双层服务器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingDSSEncryption.html)和[使用 AWS KMS keys的服务器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)。  
您可以自动生成一份列表，列出 Macie 需要访问的所有客户托管 AWS KMS keys 的列表，以便为您的账户分析 S3 存储桶中的对象。为此，请运行 AWS KMS 权限分析器脚本，该脚本可从上的 [Amazon Macie 脚本](https://github.com/aws-samples/amazon-macie-scripts)存储库中获得。 GitHub该脚本还可以生成 AWS Command Line Interface (AWS CLI) 命令的附加脚本。您可以选择运行这些命令来更新指定 KMS 密钥的必要配置设置和策略。

**使用客户提供的密钥进行服务器端加密 (SSE-C)**  
如果对象的加密方式为客户提供密钥 (SSE-C) 的服务器端加密，则 Macie 无法解密此对象。Macie 只能存储和报告对象元数据。  
要了解此类加密，请参阅*Amazon Simple Storage Service 用户指南*的[使用客户提供密钥的服务器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerSideEncryptionCustomerKeys.html)。

**客户端加密**  
如果对象的加密方式为客户端加密，则 Macie 无法解密此对象。Macie 只能存储和报告对象元数据。例如，Macie 可以报告对象的大小，以及与该对象关联的标签。  
要在 Amazon S3 环境中了解此类加密，请参阅*《Amazon Simple Storage Service 用户指南》*中的[使用客户端加密保护数据](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html)。

您可以在 Macie 中 [筛选存储桶清单](monitoring-s3-inventory-filter.md)，以确定哪些 S3 存储桶存储了使用特定加密类型的对象。您还可通过存储新对象时的默认设置，确定哪些存储桶使用特定类型的服务器端加密。下表提供了筛选条件示例，您可以将其应用于存储桶清单以查找此信息。


| 若要显示存储桶…… | 应用此筛选条件…… | 
| --- | --- | 
| 存储了使用 SSE-C 加密的对象 | 加密对象计数为客户提供的和从 = 1 | 
| 存储了使用 DSSE-KMS 或 SSE-KMS 加密的对象 | 加密对象计数为 AWS KMS 托管和从 = 1 | 
| 存储了使用 SSE-S3 加密的对象 | 加密对象计数为 Amazon S3 托管和从 = 1 | 
| 存储了使用客户端加密（或未加密）的对象 | 加密对象计数为未加密和从 = 1 | 
| 默认情况下使用 DSSE-KMS 加密新对象 | 默认加密 = aws:kms:dsse | 
| 默认情况下使用 SSE-KMS 加密新对象 | 默认加密 = aws:kms | 
| 默认情况下使用 SSE-S3 加密新对象 | 默认加密 = AES256 | 

如果将存储桶配置为默认使用 DSSE-KMS 或 SSE-KMS 加密对新对象进行加密，则您还可以确定使用哪个。 AWS KMS key 为此，请在 **S3 存储桶**页面上选择存储桶。在存储桶详细信息面板的**服务器端加密**下，参阅 **AWS KMS key** 字段。此字段显示密钥的 Amazon 资源名称（ARN）或唯一标识符（密钥 ID）。

## 允许 Macie 使用客户管理的服务器 AWS KMS key
<a name="discovery-supported-encryption-cmk-configuration"></a>

如果 Amazon S3 对象使用双层服务器端加密或由客户托管 AWS KMS key （DSSE-KMS 或 SSE-KMS）进行服务器端加密，则只有在允许其使用密钥的情况下，Amazon Macie 才能解密该对象。此访问权限的提供方式，取决于拥有密钥的账户是否还拥有存储对象的 S3 存储桶：
+ 如果同一个账户拥有 AWS KMS key 和存储桶，则该账户的用户必须更新密钥的策略。
+ 如果一个账户拥有存储桶， AWS KMS key 而另一个账户拥有该存储桶，则拥有该密钥的账户的用户必须允许跨账户访问该密钥。

本主题介绍如何执行这些任务，并提供了两种场景示例。要详细了解如何允许访问客户托管 AWS KMS keys，请参阅*《AWS Key Management Service 开发人员指南》*中的 [KMS 密钥访问和权限](https://docs.aws.amazon.com/kms/latest/developerguide/control-access.html)。

### 允许同一个账户访问客户托管密钥
<a name="discovery-supported-encryption-cmk-configuration-1account"></a>

如果同一个账户同时拥有 AWS KMS key 和 S3 存储桶，则该账户的用户必须在密钥策略中添加声明。该附加语句必须允许该 Macie 服务相关角色使用该密钥来解密数据。有关更新密钥政策的详细信息，请参阅 *AWS Key Management Service 开发者指南* 中的[更改密钥政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html)。

在以下语句中：
+ 该`Principal`元素必须为拥有 AWS KMS key 和 S3 存储桶的账户指定 Macie 服务相关角色的 Amazon 资源名称 (ARN)。

  如果账户处于选择加入状态 AWS 区域，则 ARN 还必须包含该地区的相应区域代码。例如，如果账户位于中东（巴林）地区，其区域*代码*为 me-south-1，则元素`arn:aws:iam::123456789012:role/aws-service-role/macie.me-south-1.amazonaws.com/AWSServiceRoleForAmazonMacie`必须指定 `Principal`*123456789012*，其中是该账户的账户 ID。有关当前已开放 Macie 服务的所有区域的列表，请参阅《AWS 一般参考》中的 [Amazon Macie 端点和限额](https://docs.aws.amazon.com/general/latest/gr/macie.html)**。
+ 数 `Action` 数组必须指定 `kms:Decrypt` 操作。这是解密使用密钥加密的 S3 对象时必须允许 Macie 执行的唯一 AWS KMS 操作。

以下为添加到 AWS KMS key策略的语句示例。

```
{
    "Sid": "Allow the Macie service-linked role to use the key",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/aws-service-role/macie.amazonaws.com/AWSServiceRoleForAmazonMacie"
    },
    "Action": [
        "kms:Decrypt"
    ],
    "Resource": "*"
}
```

在上述示例中：
+ `Principal` 元素的 `AWS` 字段指定账户的 Macie 服务相关角色 (`AWSServiceRoleForAmazonMacie`) 的 ARN。它允许 Macie 服务相关角色执行策略声明中指定的操作。 *123456789012*是账户 ID 的示例。请将该值替换拥有该 KMS 密钥和 S3 存储桶的账户的 ID。
+ `Action` 数组指定了允许该 Macie 服务相关角色使用该 KMS 密钥执行的操作，即解密使用该密钥加密的加密文字。

将此语句添加到密钥政策的位置，取决于该策略当前包含的结构和元素。当添加语句时，请确保语法有效。JSON 格式的密钥策略。这意味着您还必须在语句前后添加逗号，具体取决于您在策略中添加语句的位置。

### 允许跨账户存取客户托管密钥
<a name="discovery-supported-encryption-cmk-configuration-xaccount"></a>

如果一个账户拥有 AWS KMS key （*密钥所有者*），而另一个账户拥有 S3 存储桶（存储*桶所有者*），则密钥所有者必须向存储桶拥有者提供对 KMS 密钥的跨账户访问权限。为此，密钥拥有者首先要确保密钥策略允许存储桶拥有者使用密钥，并为密钥创建授权。然后，存储桶拥有者为此密钥创建授权。*授权*是一种策略分析工具，如果由授权指定的条件得到满足，则允许 AWS 主体将 KMS 密钥用于加密操作中。在此例中，该授权将相关权限委派给存储桶所有者账户的 Macie 服务相关角色。

有关更新密钥政策的详细信息，请参阅 *AWS Key Management Service 开发者指南* 中的[更改密钥政策](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html)。要了解有关授权的信息，请参阅*AWS Key Management Service 开发者指南*中的[AWS KMS授权](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)。

**第 1 步：更新密钥政策**  
在密钥政策中，密钥所有者应确保该策略包含两个语句：
+ 第一条语句允许存储桶拥有者使用密钥解密数据。
+ 第二条语句允许存储桶所有者为其账户的 Macie 服务相关角色创建授权。

在第一条语句中，`Principal` 元素必须指定存储桶拥有者账户的 ARN。数 `Action` 数组必须指定 `kms:Decrypt` 操作。这是解密使用密钥加密的对象时必须允许 Macie 执行的唯一 AWS KMS 操作。以下为在 AWS KMS key策略中使用此语句的示例。

```
{
    "Sid": "Allow account 111122223333 to use the key",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
    },
    "Action": [
        "kms:Decrypt"
    ],
    "Resource": "*"
}
```

在上述示例中：
+ `Principal`元素中的`AWS`字段指定存储桶拥有者账户 () *111122223333* 的 ARN。它允许存储桶拥有者执行策略声明中指定的操作。 *111122223333*是账户 ID 的示例。请将该值替换存储桶所有者账户的账户 ID。
+ `Action` 数组指定了允许该存储桶所有者使用该 KMS 密钥执行的操作，即解密使用该密钥加密的加密文字。

密钥政策中的第二条语句，允许存储桶拥有者为其账户的 Macie 服务相关角色创建授权。在此语句中，`Principal` 元素必须指定存储桶拥有者账户的 ARN。数 `Action` 数组必须指定 `kms:CreateGrant` 操作。`Condition` 元素可以筛选对语句中指定 `kms:CreateGrant` 操作的访问权限。以下为在 AWS KMS key策略中使用此语句的示例。

```
{
    "Sid": "Allow account 111122223333 to create a grant",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
    },
    "Action": [
        "kms:CreateGrant"
    ],
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "kms:GranteePrincipal": "arn:aws:iam::111122223333:role/aws-service-role/macie.amazonaws.com/AWSServiceRoleForAmazonMacie"
        }
    }
}
```

在上述示例中：
+ `Principal`元素中的`AWS`字段指定存储桶拥有者账户 () *111122223333* 的 ARN。它允许存储桶拥有者执行策略声明中指定的操作。 *111122223333*是账户 ID 的示例。请将该值替换存储桶所有者账户的账户 ID。
+ 该 `Action` 数组指定存储桶拥有者可对 KMS 密钥执行的操作 — 创建密钥授权。
+ `Condition` 元素使用 `StringEquals` [条件运算符](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)和 `kms:GranteePrincipal` [条件密钥](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awskeymanagementservice.html#awskeymanagementservice-policy-keys)来筛选策略语句所指定操作的访问权限。在此例中，存储桶所有者只能为指定 `GranteePrincipal`（即其账户的 Macie 服务相关角色的 ARN）创建授权。在该 ARN 中，*111122223333*有一个示例账户 ID。请将该值替换存储桶所有者账户的账户 ID。

  如果存储桶拥有者的账户处于选择加入状态 AWS 区域，还需要在 Macie 服务相关角色的 ARN 中加入相应的区域代码。例如，如果账户位于中东（巴林）地区，且该地区代码为 *me-south-1*，则将 ARN 中的 `macie.amazonaws.com` 替换为 `macie.me-south-1.amazonaws.com`。有关当前已开放 Macie 服务的所有区域的列表，请参阅《AWS 一般参考》中的 [Amazon Macie 端点和限额](https://docs.aws.amazon.com/general/latest/gr/macie.html)**。

密钥拥有者将这些语句添加到密钥政策的位置，取决于策略当前包含的结构和元素。当密钥所有者添加语句时，应确保语法有效。密钥策略使用 JSON 格式。这意味着密钥所有者还必须在语句之前或之后添加逗号，具体取决于在策略中添加语句的位置。

**第 2 步：创建授权**  
在密钥拥有者根据需要更新密钥政策后，存储桶拥有者必须为密钥创建授权。该授权将他们（即存储桶拥有者）账户的相关权限委托至 Macie 服务相关角色。在存储桶拥有者创建授权前，他们应验证是否允许为自己的账户执行 `kms:CreateGrant` 操作。此操作使其能够向现有的客户自主管理型 AWS KMS key添加授权。

要创建授权，存储桶拥有者可以使用 AWS Key Management Service API 的[CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html)操作。存储桶拥有者创建授权时，应为所需参数指定以下值：
+ `KeyId` – KMS 密钥的 ARN。对于跨账户存取 KMS 密钥，该值必须是 ARN。它不能是密钥 ID。
+ `GranteePrincipal`：其账户的 Macie 服务相关角色（`AWSServiceRoleForAmazonMacie`）的 ARN。此值应为`arn:aws:iam::111122223333:role/aws-service-role/macie.amazonaws.com/AWSServiceRoleForAmazonMacie`，其中*111122223333*是存储桶拥有者账户的账户 ID。

  如果账户位于选择加入型区域中，则 ARN 还必须包相应的区域代码。例如，如果他们的账户位于中东（巴林）地区，其区域*代码*为 me-south-1，则 `arn:aws:iam::111122223333:role/aws-service-role/macie.me-south-1.amazonaws.com/AWSServiceRoleForAmazonMacie` ARN *111122223333* 应为，其中是存储桶拥有者账户的账户 ID。
+ `Operations`— AWS KMS 解密操作 () `Decrypt`。这是解密使用 KMS 密钥加密的对象时必须允许 Macie 执行的唯一 AWS KMS 操作。

要使用 AWS Command Line Interface (AWS CLI) 为客户托管的 KMS 密钥创建授权，请运行 [create-gran](https://docs.aws.amazon.com/cli/latest/reference/kms/create-grant.html) t 命令。下面的示例演示如何操作。该示例针对 Microsoft Windows 进行格式化，并使用脱字号 (^) 行继续符来提高可读性。

```
C:\> aws kms create-grant ^
--key-id arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab ^
--grantee-principal arn:aws:iam::111122223333:role/aws-service-role/macie.amazonaws.com/AWSServiceRoleForAmazonMacie ^
--operations "Decrypt"
```

其中：
+ `key-id` 指定要应用授权的 KMS 密钥的 ARN。
+ `grantee-principal` 指定了允许执行该授权所指定操作的账户的 Macie 服务相关角色 ARN。该值应与密钥政策中第二个语句的 `kms:GranteePrincipal` 条件指定的 ARN 一致。
+ `operations` 指定了授权允许指定主体执行的操作，即解密使用该 KMS 密钥加密的加密文字。

如果命令成功运行，则您将收到类似于以下内容的输出：

```
{
    "GrantToken": "<grant token>",
    "GrantId": "1a2b3c4d2f5e69f440bae30eaec9570bb1fb7358824f9ddfa1aa5a0dab1a59b2"
}
```

其中 `GrantToken`，代表已创建授权的唯一、非秘密的、长度可变的 base64 编码字符串，`GrantId` 也是唯一授权标识符。