分析加密 Amazon S3 对象 - Amazon Macie

分析加密 Amazon S3 对象

当您为您的 AWS 账户 启用 Amazon Macie 时,Macie 会创建一个服务相关角色,该角色授予 Macie 代表您调用 Amazon Simple Storage Service (Amazon S3) 和其他 AWS 服务 所需的权限。服务相关角色简化了设置 AWS 服务 的过程,因为您不必手动添加服务代表您完成操作所需的权限。要了解这类角色,请参阅《AWS Identity and Access Management 用户指南》中的 IAM 角色

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

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

Amazon S3 对象的加密选项

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

具有 Amazon S3 托管式密钥的服务器端加密(SSE-S3)

如果对象是使用具有 Amazon S3 托管密钥(SSE-S3)的服务器端加密,Macie 可以解密此对象。

若要了解此类加密,请参阅《Amazon Simple Storage Service 用户指南》中的使用具有 Amazon S3 托管密钥的服务器端加密

使用 AWS KMS keys(DSSE-KMS and SSE-KMS)进行服务器端加密

如果对象是使用双层服务器端加密或带 AWS 托管 AWS KMS key(DSSE-KMS 或 SSE-KMS)的服务器端加密,则 Macie 可以解密此对象。

如果对象是使用双层服务器端加密或带客户托管 AWS KMS key(DSSE-KMS 或 SSE-KMS)的服务器端加密,则只有在允许 Macie 使用密钥的情况下,Macie 才能解密对象。这种对象的加密方式为:AWS KMS中完全托管的 KMS 密钥;以及外部密钥存储中的 KMS 密钥。如果不允许 Macie 使用适当的 KMS 密钥,则 Macie 只能存储和报告此对象的元数据。

要了解这些类型的加密,请参阅《Amazon Simple Storage Service 用户指南》中的使用 AWS KMS keys 的双层服务器端加密使用 AWS KMS keys 的服务器端加密

提示

您可以自动生成一份关于 Macie 需要访问的所有客户托管AWS KMS keys的列表,以分析您账户的 S3 存储桶中的对象。为此,请运行 AWS KMS 权限分析器脚本,该脚本可从 GitHub 的 Amazon Macie Scripts 存储库获取。该脚本还可以生成关于 AWS Command Line Interface (AWS CLI) 命令的附加脚本。您可以选择运行这些命令来更新指定 KMS 密钥的必要配置设置和策略。

使用客户提供的密钥进行服务器端加密 (SSE-C)

如果对象的加密方式为客户提供密钥 (SSE-C) 的服务器端加密,则 Macie 无法解密此对象。Macie 只能存储和报告对象元数据。

要了解此类加密,请参阅Amazon Simple Storage Service 用户指南使用客户提供密钥的服务器端加密

客户端加密

如果对象的加密方式为客户端加密,则 Macie 无法解密此对象。Macie 只能存储和报告对象元数据。例如,Macie 可以报告对象的大小,以及与该对象关联的标签。

要在 Amazon S3 环境中了解此类加密,请参阅《Amazon Simple Storage Service 用户指南》中的使用客户端加密保护数据

您可以在 Macie 中 筛选存储桶清单,以确定哪些 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)。

允许 Amazon Macie 使用客户自主管理型 AWS KMS key

如果 Amazon S3 对象是使用双层服务器端加密或带客户托管 AWS KMS key(DSSE-KMS 或 SSE-KMS)的服务器端加密,则只有在允许 Amazon Macie 使用密钥的情况下,Amazon Macie 才能解密对象。此访问权限的提供方式,取决于拥有密钥的账户是否还拥有存储对象的 S3 存储桶:

  • 如果该 AWS KMS key和该存储桶由同一账户拥有,则必须该账户的用户必须更新该密钥的策略。

  • 如果该 AWS KMS key由一个账户拥有,而该存储桶由另一个账户拥有,则拥有密钥的账户的用户必须允许对该密钥进行跨账户存取。

本主题介绍如何执行这些任务,并提供了两种场景示例。要详细了解有关允许访问客户托管 AWS KMS keys 的信息,请参阅《AWS Key Management Service 开发人员指南》中的 KMS 密钥访问和权限

允许同一个账户访问客户托管密钥

如果该 AWS KMS key和该 S3 存储桶由同一账户拥有,则该账户的用户必须在密钥的策略中添加一条语句。该附加语句必须允许该 Macie 服务相关角色使用该密钥来解密数据。有关更新密钥政策的详细信息,请参阅《AWS Key Management Service 开发人员指南》 中的更改密钥政策

在以下语句中:

  • Principal 元素必须为拥有 AWS KMS key和 S3 存储桶的账户指定 Macie 服务相关角色的 Amazon 资源名称(ARN)。

    如果账户位于选择加入型 AWS 区域中,则 ARN 还必须包含该区域的相应区域代码。例如,如果账户位于中东(巴林)地区,其区域代码为 me-south-1Principal 元素必须指定arn:aws:iam::123456789012:role/aws-service-role/macie.me-south-1.amazonaws.com/AWSServiceRoleForAmazonMacie,其中 123456789012 是该账户的账户 ID。有关当前已开放 Macie 服务的所有区域的列表,请参阅《AWS 一般参考》中的 Amazon Macie 端点和限额

  • 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 格式。这意味着您还必须在语句前后添加逗号,具体取决于您在策略中添加语句的位置。

允许跨账户访问客户托管密钥

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

有关更新密钥政策的详细信息,请参阅《AWS Key Management Service 开发人员指南》 中的更改密钥政策。要了解有关授权的信息,请参阅《AWS Key Management Service 开发人员指南》中的AWS KMS授权

第 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 条件运算符kms:GranteePrincipal 条件密钥来筛选策略语句所指定操作的访问权限。在此例中,存储桶所有者只能为指定 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 端点和限额

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

第 2 步:创建授权

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

若要创建授权,存储桶拥有者可以使用 AWS Key Management Service API 的 CreateGrant 操作。存储桶拥有者创建授权时,应为所需参数指定以下值:

  • 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 应为 arn:aws:iam::111122223333:role/aws-service-role/macie.me-south-1.amazonaws.com/AWSServiceRoleForAmazonMacie,其中 111122223333 是存储桶所有者账户的账户 ID。

  • Operations:AWS KMS 解密操作(Decrypt)。这是解密使用该 KMS 密钥进行加密的对象时必须允许 Macie 执行的唯一 AWS KMS 操作。

要使用 AWS Command Line Interface(AWS CLI)为客户自主管理型的 KMS 密钥创建授权,请运行 create-grant 命令。下面的示例演示如何操作。该示例针对 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 也是唯一授权标识符。