View a markdown version of this page

AWS 安全代理的客户托管密钥 - AWS 安全代理

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

AWS 安全代理的客户托管密钥

默认情况下, AWS 安全客户端使用 AWS托管的加密密钥对所有静态数据进行加密。您可以选择使用密 AWS 钥管理服务 (AWS KMS) 中的客户托管密钥来加密您的数据,从而完全控制保护资源的加密密钥。

AWS 安全代理支持资源级客户托管密钥。在创建顶级资源(例如代理空间或集成)时,可以指定 KMS 密钥来加密属于该资源及其子资源的所有数据。例如,在创建代理空间时指定客户托管密钥会加密与该代理空间关联的所有数据,包括代理空间配置、渗透测试配置、作业和执行详细信息、安全发现、发现的端点和屏幕截图。您还可以提供已使用您自己的客户托管密钥加密的 AWS 资源,例如 S3 存储桶、 CloudWatch 日志日志组或 Secrets Manager 密钥。有关所需的 KMS 权限,请参阅所需的 KMS 权限

客户托管密钥的工作原理

AWS 安全代理使用 AWS KMS 分层密钥环使用客户管理的密钥对您的数据进行加密。当您在资源创建期间指定 KMS 密钥时,该服务会创建一个受您的 KMS 密钥保护的分支密钥并将其存储在 Amazon DynamoDB-based 密钥存储中。对于每个加密操作,分层密钥环都会从活动分支密钥中派生一个唯一的包装密钥,该密钥会加密每个请求的唯一数据加密密钥。

分层密钥环具有以下优点:

  • Per-resource 加密范围 — 每个顶级资源都有自己的分支密钥,因此不同资源的数据使用不同的密钥进行加密。

  • 自动密钥轮换- AWS 安全客户端定期轮换分支密钥。轮换后,新数据将使用新的分支密钥版本进行加密,而旧版本则保留以解密先前加密的数据。

加密上下文

AWS 安全代理使用您的 KMS 密钥在所有加密操作中使用加密上下文。加密上下文是一组非秘密密钥值对,为加密操作提供额外的经过身份验证的数据。

加密上下文密钥遵循以下格式aws:securityagent:_<resource-type>_,其中 <resource-type> 是要加密的资源类型(例如,agent-spaceintegration)。该值是资源的亚马逊资源名称 (ARN)。

注意

对于集成,加密上下文密钥包含aws-crypto-ec:前缀,由此产生了格式aws-crypto-ec:aws:securityagent:integration

您可以使用加密上下文将 KMS 密钥策略的范围缩小到特定的资源类型。有关更多信息,请参阅 所需的 KMS 权限

Default encryption (默认加密)

当您在未指定客户托管密钥的情况下创建资源时, AWS 安全代理会使用底层存储服务(Amazon DynamoDB 和 Amazon S3)提供的 AWS托管加密密钥对资源进行加密。默认加密不需要其他配置。

应用程序的默认 KMS 密钥

您可以在应用程序级别设置默认 KMS 密钥。配置默认 KMS 密钥后,如果您在资源创建期间未明确指定 KMS 密钥,则 AWS 安全客户端会将其用作新代理空间和集成的备用密钥。

要设置默认 KMS 密钥,请在使用 AWS CLI 或 SDK 创建或更新应用程序时指定defaultKmsKeyId参数。在应用程序安装过程中,控制台会提示您指定默认 KMS 密钥。

当您在资源创建期间明确指定 KMS 密钥时,该密钥优先于应用程序级别的默认密钥。

先决条件

在配置客户托管密钥之前,请完成以下先决条件:

  • 在 KMS 中创建对称加密 KMS 密 AWS 钥。密钥必须满足以下要求:

  • 配置 KMS 密钥策略和 IAM 策略以授予 AWS 安全代理所需的权限。有关更多信息,请参阅 所需的 KMS 权限

所需的 KMS 权限

AWS 在两种情况下,安全代理需要 KMS 权限:

  • 加密 AWS 安全代理中的数据-当您为代理空间或集成指定客户托管密钥时,该服务需要使用该密钥对您的数据进行加密操作的权限。

  • 使用 CMK-encrypted AWS 资源-当您提供使用客户托管密钥加密的 AWS 资源(例如 S3 存储桶、 CloudWatch 日志日志组或 Secrets Manager 密钥)时,服务需要权限才能使用这些密钥来访问加密的资源。

AWS 安全代理使用不同的身份访问您的 KMS 密钥,具体取决于操作:

  • AWS 管理控制台操作-管理员在管理控制台中创建或 AWS 管理资源(例如,创建代理空间或更新应用程序)时,该服务使用管理员角色调用 AWS KMS。

  • Web 应用程序操作 — 当 IAM Identity Center 用户通过 AWS 安全代理 Web 应用程序访问数据(例如,查看渗透测试结果或开始渗透测试)时,该服务使用在 AWS 安全代理设置期间创建的应用程序角色来调用 AWS KMS。

  • 访问客户提供的资源-当服务在渗透测试期间访问客户提供的 AWS 资源(例如 S3 存储桶、 CloudWatch 日志日志组和 Secrets Manager 密钥)时,它将使用渗透测试服务角色调用 KMS。 AWS

  • 异步工作流程-对于在任何用户会话之外运行的后台操作(例如,渗透测试执行、代码审查处理和分支密钥轮换),该服务使用自己的服务主体 (securityagent.amazonaws.com) 代表您调用 AWS KMS。

以下各节描述了每个身份所需的权限。

密钥策略

您的 KMS 密钥策略必须授予 AWS 安全代理使用该密钥进行加密操作的权限。所需的密钥策略声明取决于您计划加密的资源类型以及您向服务提供的 CMK-encrypted AWS 资源。

代理空间的关键政策

以下密钥策略向 AWS 安全客户端授予加密和解密 Agent Space 数据所需的权限,包括渗透测试结果和屏幕截图。

替换策略中的以下占位符值:

  • 111122223333 — 您的 AWS 账户 ID

  • MyRole — 用于在控制台中管理 AWS 安全代理的 IAM 角色

  • MyApplicationRole — 安装 AWS 安全客户端期间创建的应用程序角色

  • us-east-1 — 您使用 AWS 安全代理的 AWS 区域

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowKeyMetadataValidationForApplicationAndAgentSpaces", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/MyRole" }, "Action": [ "kms:DescribeKey" ], "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "securityagent.us-east-1.amazonaws.com" } } }, { "Sid": "AllowUseOfHierarchicalKeyringForAgentSpaces", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/MyRole" }, "Action": [ "kms:GenerateDataKeyWithoutPlaintext", "kms:ReEncryptTo", "kms:ReEncryptFrom", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringLike": { "kms:EncryptionContext:aws:securityagent:agent-space": "arn:aws:securityagent:us-east-1:111122223333:agent-space/*" }, "StringEquals": { "kms:ViaService": "securityagent.us-east-1.amazonaws.com" } } }, { "Sid": "AllowSynchronousDataAccessForAgentSpaces", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/MyApplicationRole" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringLike": { "kms:EncryptionContext:aws:securityagent:agent-space": "arn:aws:securityagent:us-east-1:111122223333:agent-space/*" }, "StringEquals": { "kms:ViaService": "securityagent.us-east-1.amazonaws.com" } } }, { "Sid": "AllowAsynchronousDataAccessForAgentSpaces", "Effect": "Allow", "Principal": { "Service": "securityagent.amazonaws.com" }, "Action": [ "kms:GenerateDataKeyWithoutPlaintext", "kms:Decrypt", "kms:ReEncryptTo", "kms:ReEncryptFrom" ], "Resource": "*", "Condition": { "StringLike": { "kms:EncryptionContext:aws:securityagent:agent-space": "arn:aws:securityagent:us-east-1:111122223333:agent-space/*" }, "ArnLike": { "aws:SourceArn": "arn:aws:securityagent:us-east-1:111122223333:agent-space/*" } } }, { "Sid": "AllowAsynchronousDataAccessForCodeRemediation", "Effect": "Allow", "Principal": { "Service": "securityagent.amazonaws.com" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*" } ] }
重要

要轮换分支密钥,您的 KMS 密钥策略必须向 AWS 安全代理服务委托人 (securityagent.amazonaws.com) 授予kms:GenerateDataKeyWithoutPlaintextkms:ReEncryptTo、和kms:ReEncryptFrom权限,否则分支密钥轮换将失败。有关所需权限的更多信息,请参阅轮换分支密钥

集成的关键政策

以下密钥策略向 AWS 安全代理授予加密和解密集成数据(包括代码审查结果)所需的权限。

替换策略中的以下占位符值:

  • 111122223333 — 您的 AWS 账户 ID

  • MyRole — 用于在控制台中管理 AWS 安全代理的 IAM 角色

  • us-east-1 — 您使用 AWS 安全代理的 AWS 区域

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowKeyAccessValidationForIntegrations", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/MyRole" }, "Action": [ "kms:GenerateDataKeyWithoutPlaintext", "kms:Decrypt", "kms:Encrypt", "kms:ReEncryptTo", "kms:ReEncryptFrom" ], "Resource": "*", "Condition": { "StringLike": { "kms:EncryptionContext:aws-crypto-ec:aws:securityagent:integration": "arn:aws:securityagent:us-east-1:111122223333:integration/*" }, "StringEquals": { "kms:ViaService": "securityagent.us-east-1.amazonaws.com" } } }, { "Sid": "AllowKeyMetadataValidationForIntegrations", "Effect": "Allow", "Principal": { "Service": "securityagent.amazonaws.com" }, "Action": "kms:DescribeKey", "Resource": "*" }, { "Sid": "AllowAsynchronousDataAccessForIntegrations", "Effect": "Allow", "Principal": { "Service": "securityagent.amazonaws.com" }, "Action": [ "kms:GenerateDataKeyWithoutPlaintext", "kms:Decrypt", "kms:Encrypt", "kms:ReEncryptTo", "kms:ReEncryptFrom" ], "Resource": "*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:securityagent:us-east-1:111122223333:integration/*" }, "StringLike": { "kms:EncryptionContext:aws-crypto-ec:aws:securityagent:integration": "arn:aws:securityagent:us-east-1:111122223333:integration/*" } } } ] }
注意

如果您想对多种资源类型使用相同的 KMS 密钥,则可以将代理空间、集成和安全需求包密钥策略声明合并到单个密钥策略中。

安全需求包的关键策略

以下密钥策略向 AWS 安全代理授予加密和解密安全需求包数据所需的权限。安全要求包不使用 Web 应用程序角色。该策略使用两种访问路径:

  • 同步路径 — 当您调用 API 时,该服务使用您转发的凭据代表您调用 AWS KMS(通过kms:ViaService条件)。

  • 异步路径-对于可以使用包的异步操作,该服务使用自己的服务主体直接调用 AWS KMS。

替换策略中的以下值:

  • 111122223333 — 您的 AWS 账户 ID

  • MyRole — 用于调用安全需求包操作的 IAM 角色

  • us-east-1 — 您使用 AWS 安全代理的 AWS 区域

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowKeyMetadataValidation", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/MyRole" }, "Action": [ "kms:DescribeKey" ], "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "securityagent.us-east-1.amazonaws.com" } } }, { "Sid": "AllowUseOfHierarchicalKeyringForSecurityPacks", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/MyRole" }, "Action": [ "kms:GenerateDataKeyWithoutPlaintext", "kms:ReEncryptTo", "kms:ReEncryptFrom", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "securityagent.us-east-1.amazonaws.com" }, "StringLike": { "kms:EncryptionContext:aws:securityagent:security-requirement-pack": "arn:aws:securityagent:us-east-1:111122223333:security-requirement-pack/*" } } }, { "Sid": "AllowAsynchronousDataAccessForSecurityPacks", "Effect": "Allow", "Principal": { "Service": "securityagent.amazonaws.com" }, "Action": [ "kms:GenerateDataKeyWithoutPlaintext", "kms:Decrypt", "kms:ReEncryptTo", "kms:ReEncryptFrom" ], "Resource": "*", "Condition": { "StringLike": { "kms:EncryptionContext:aws:securityagent:security-requirement-pack": "arn:aws:securityagent:us-east-1:111122223333:security-requirement-pack/*" }, "ArnLike": { "aws:SourceArn": "arn:aws:securityagent:us-east-1:111122223333:security-requirement-pack/*" } } } ] }

该政策包含三个声明:

  • AllowKeyMetadataValidation— 授予kms:DescribeKey权限,以便 AWS 安全代理可以验证您的客户托管密钥是否存在、已启用,并在资源创建期间指定 CMK 时使用对称加密。使用kms:ViaService条件来确保呼叫通过服务发出。

  • AllowUseOfHierarchicalKeyringForSecurityPacks— 授权kms:GenerateDataKeyWithoutPlaintext(创建新的分支密钥)、kms:ReEncryptTokms:ReEncryptFrom(轮换现有分支密钥)和kms:Decrypt(检索现有分支密钥),用于分层密钥环操作。这些操作使用您通过同步路径转发的凭证,并根据加密上下文条件限制在安全需求包资源范围内。

  • AllowAsynchronousDataAccessForSecurityPacks— 在没有可用的呼叫者凭据时 kms:GenerateDataKeyWithoutPlaintext kms:Decryptkms:ReEncryptTokms:ReEncryptFrom向 AWS 安全代理服务主体授予、、和用于异步操作的权限。

与 Agent Spaces 密钥策略不同,安全要求包策略不包括 Web 应用程序角色主体。使用您的管理员角色通过 AWS 管理控制台访问安全需求包,而不是通过 AWS 安全客户端 Web 应用程序进行访问。所有同步操作都使用单调用者角色(通过kms:ViaService)。

注意

如果您对代理空间和安全要求包使用相同的 KMS 密钥,则可以将这两个部分中的密钥策略声明合并为一个密钥策略。

的关键政策 CMK-encrypted AWS 资源

如果您向 AWS 安全代理提供使用客户托管密钥加密的 AWS 资源,则必须更新每个资源的 KMS 密钥上的密钥策略以授予必要的权限。这适用于以下资源:

  • S3 存储桶 — 如果您提供来自使用客户托管密钥 (SSE-KMS) 加密的 S3 存储桶的学习资源,则密钥策略必须允许渗透测试服务角色解密对象。

  • Secr@@ ets Manager 密钥 — 如果您的渗透测试凭据存储在使用客户托管密钥加密的 Secrets Manager 密钥中,则密钥策略必须允许渗透测试服务角色解密这些机密。如果 Web 应用程序代表您创建密钥,则密钥策略还必须允许应用程序角色对这些密钥进行加密。

  • CloudWatch 日志日志组-如果用于存储渗透测试执行 CloudWatch 日志的日志组使用客户托管密钥加密,则密钥策略必须允许 CloudWatch 日志通过服务角色验证 KMS 密钥,并允许 CloudWatch 日志服务主体执行加密操作。

重要

AWS 安全客户端还可以代表你创建 CloudWatch 日志日志组和 Secrets Manager 密钥。配置 KMS 密钥策略时,还要为这些服务创建的资源添加相应的语句。

以下关键政策声明授予 CMK-encrypted 资源所需的权限。仅包含适用于您的配置的语句。如果资源使用您为代理空间指定的 KMS 密钥,请将这些语句添加到该密钥的策略中。如果资源使用不同的 KMS 密钥,请改为将这些语句添加到该密钥的策略中。

替换策略中的以下占位符值:

  • 111122223333 — 您的 AWS 账户 ID

  • MyApplicationRole — 安装 AWS 安全客户端期间创建的应用程序角色

  • MyPenTestServiceRole — 渗透测试服务角色

  • us-east-1 — 您使用 AWS 安全代理的 AWS 区域

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowKmsKeyAccessForCreatingSecrets", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/MyApplicationRole" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "aws:ResourceAccount": "111122223333" }, "StringLike": { "kms:ViaService": "secretsmanager.*.amazonaws.com", "kms:EncryptionContext:SecretARN": "arn:aws:secretsmanager:us-east-1:111122223333:secret:*" } } }, { "Sid": "AllowKmsKeyDecryptionForS3Objects", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/MyPenTestServiceRole" }, "Action": [ "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "aws:ResourceAccount": "111122223333" }, "StringLike": { "kms:ViaService": "s3.*.amazonaws.com", "kms:EncryptionContext:aws:s3:arn": "arn:aws:s3:::YOUR-BUCKET-NAME*" } } }, { "Sid": "AllowKmsKeyDecryptionForSecretsManagerSecrets", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/MyPenTestServiceRole" }, "Action": [ "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "aws:ResourceAccount": "111122223333" }, "StringLike": { "kms:ViaService": "secretsmanager.*.amazonaws.com", "kms:EncryptionContext:SecretARN": "arn:aws:secretsmanager:us-east-1:111122223333:secret:YOUR-SECRET-NAME*" } } }, { "Sid": "AllowKmsKeyValidationForCloudWatchLogsLogGroups", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/MyPenTestServiceRole" }, "Action": [ "kms:DescribeKey" ], "Resource": "*", "Condition": { "StringEquals": { "aws:ResourceAccount": "111122223333" }, "StringLike": { "kms:ViaService": "logs.*.amazonaws.com" } } }, { "Sid": "AllowKmsKeyAccessForCloudWatchLogsLogGroups", "Effect": "Allow", "Principal": { "Service": "logs.us-east-1.amazonaws.com" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*", "Condition": { "StringEquals": { "aws:ResourceAccount": "111122223333" }, "StringLike": { "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:us-east-1:111122223333:log-group:YOUR-LOG-GROUP-NAME*" } } } ] }
注意
  • 只有当您提供使用客户托管密钥加密的 S3 存储桶中的学习资源时,才需要提供该AllowKmsKeyDecryptionForS3Objects声明。有关为 S3 SSE-KMS 进行配置的更多信息,请参阅使用保护数据 SSE-KMS

  • 只有当您的渗透测试凭证存储在使用客户托管密钥加密的 Secrets Manager 密钥中时,才需要该AllowKmsKeyDecryptionForSecretsManagerSecrets声明。在渗透测试期间,服务角色需要访问权限才能解密密密钥。有关机密加密的更多信息,请参阅 Secrets Manager 中的密钥加密和解密

  • AllowKmsKeyValidationForCloudWatchLogsLogGroups语句授予服务角色,kms:DescribeKey这样 CloudWatch Logs 就可以在将 KMS 密钥与日志组关联时通过服务角色对其进行验证。

  • 如果 Web 应用程序使用客户托管密钥代表您创建 Secrets Manager 密钥,则必须提供该AllowKmsKeyAccessForCreatingSecrets声明。应用程序角色需要kms:GenerateDataKeykms:Decrypt使用您的 KMS 密钥对密钥进行加密。

  • AllowKmsKeyAccessForCloudWatchLogsLogGroups语句向 CloudWatch 日志服务主体 (logs.us-east-1.amazonaws.com) 授予加密和解密日志数据所需的权限。如果您未提供现有日志组,但 AWS 安全客户端代表您创建了日志组,则也需要此语句。有关更多信息,请参阅使用 AWS KMS 加密 CloudWatch 日志中的日志数据

  • 如果多个资源共享同一 KMS 密钥,则可以将这些语句合并为一个密钥策略。

管理员角色

管理员角色(用于在控制台中管理 AWS 安全代理的 IAM 角色)不需要其他 IAM 策略。

应用程序角色

除了 KMS 密钥策略外,还要将以下 IAM 策略附加到 AWS 安全代理设置期间指定的应用程序角色。此策略授予角色使用客户托管密钥加密和解密代理空间数据以及在 Secrets Manager AWS 中创建密钥的权限。

替换策略中的以下占位符值:

  • 111122223333 — 您的 AWS 账户 ID

  • us-east-1 — 您使用 AWS 安全代理的 AWS 区域

  • 中的 KMS 密钥 ARN Resource — 您的 KMS 密钥的 ARN

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowSynchronousDataAccessForAgentSpaces", "Effect": "Allow", "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": [ "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890cd" ], "Condition": { "StringEquals": { "aws:ResourceAccount": "111122223333", "kms:ViaService": "securityagent.us-east-1.amazonaws.com" }, "StringLike": { "kms:EncryptionContext:aws:securityagent:agent-space": "arn:aws:securityagent:us-east-1:111122223333:agent-space/*" } } }, { "Sid": "AllowKmsKeyAccessForCreatingSecrets", "Effect": "Allow", "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": [ "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890cd" ], "Condition": { "StringEquals": { "aws:ResourceAccount": "111122223333" }, "StringLike": { "kms:ViaService": "secretsmanager.*.amazonaws.com", "kms:EncryptionContext:SecretARN": "arn:aws:secretsmanager:us-east-1:111122223333:secret:*" } } } ] }
注意

应用程序角色是您在设置 AWS 安全代理期间指定或控制台创建的 IAM 角色。Web 应用程序扮演此角色来检索渗透测试执行日志并代表您创建 Secrets Manager 密钥。

  • 如果您为渗透测试配置身份验证资源并选择直接输入凭据而不是指定现有密钥,则必须使用该AllowKmsKeyAccessForCreatingSecrets语句。Web 应用程序代表您创建密钥,并且该应用程序角色需要此语句中的权限才能使用为您的 Agent Space 指定的客户托管密钥对密钥进行加密。更新此语句中的 Resource ARN,使其与用于代理空间的 KMS 密钥相匹配。

服务角色

在渗透测试期间, AWS 安全客户端扮演渗透测试服务角色来访问您的 AWS 资源。如果其中任何资源使用客户托管密钥加密,则必须向服务角色授予使用相应的 KMS 密钥的权限。这适用于以下资源:

  • S3 存储桶 — 如果您从使用客户托管密钥加密的 S3 存储桶中提供学习资源(例如 API 文档、威胁模型或源代码),则服务角色需要权限才能解密该存储桶中的对象。有关为 S3 SSE-KMS 进行配置的更多信息,请参阅使用保护数据 SSE-KMS

  • Secr@@ ets Manager 密钥 — 如果您的渗透测试凭据存储在使用客户托管密钥加密的 Secrets Manager 密钥中,则服务角色需要解密这些密钥的权限。有关机密加密的更多信息,请参阅 Secrets Manager 中的密钥加密和解密

  • CloudWatch 日志日志组-如果用于存储渗透测试执行日志的日志组使用客户托管密钥(包括 AWS 安全代理代表您创建的日志组)进行加密,则服务角色需要kms:DescribeKey权限才能验证密钥。 CloudWatch CloudWatch 日志服务主体负责处理日志数据的实际加密和解密,这些权限是通过密钥策略授予的(请参阅密钥策略)。有关加密日志数据的更多信息,请参阅使用 AWS KMS 加密日志中的 CloudWatch 日志数据

重要

如果您使用不同于为代理空间指定的 KMS 密钥来加密这些资源,则必须为每个 KMS 密钥授予服务角色权限,以保护该服务角色在渗透测试期间访问的资源。

将以下 IAM 策略附加到渗透测试服务角色。仅包含适用于您的配置的语句。

替换策略中的以下占位符值:

  • 111122223333 — 您的 AWS 账户 ID

  • us-east-1 — 您使用 AWS 安全代理的 AWS 区域

  • 中的 KMS 密钥 ARN Resource — 用于加密每个资源的客户托管密钥的 ARN

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowKmsAccessForEncryptedS3Buckets", "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": [ "arn:aws:kms:us-east-1:111122223333:key/EXAMPLE-S3-KEY-ID" ], "Condition": { "StringEquals": { "aws:ResourceAccount": "111122223333" }, "StringLike": { "kms:ViaService": "s3.*.amazonaws.com", "kms:EncryptionContext:aws:s3:arn": "arn:aws:s3:::YOUR-BUCKET-NAME*" } } }, { "Sid": "AllowKmsAccessForEncryptedSecrets", "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": [ "arn:aws:kms:us-east-1:111122223333:key/EXAMPLE-SECRETS-KEY-ID" ], "Condition": { "StringEquals": { "aws:ResourceAccount": "111122223333" }, "StringLike": { "kms:ViaService": "secretsmanager.*.amazonaws.com", "kms:EncryptionContext:SecretARN": "arn:aws:secretsmanager:us-east-1:111122223333:secret:YOUR-SECRET-NAME*" } } }, { "Sid": "AllowKmsKeyValidationForCloudWatchLogsLogGroups", "Effect": "Allow", "Action": [ "kms:DescribeKey" ], "Resource": [ "arn:aws:kms:us-east-1:111122223333:key/EXAMPLE-CLOUDWATCH-LOGS-KEY-ID" ], "Condition": { "StringEquals": { "aws:ResourceAccount": "111122223333" }, "StringLike": { "kms:ViaService": "logs.*.amazonaws.com" } } } ] }
注意
  • 只有当您提供使用客户托管密钥加密的 S3 存储桶中的学习资源时,才需要提供该AllowKmsAccessForEncryptedS3Buckets声明。更新 Resource ARN 以匹配用于加密您的 S3 存储桶的 KMS 密钥,然后更新该kms:EncryptionContext:aws:s3:arn值以匹配您的存储桶名称。

  • 只有当您的渗透测试凭证存储在使用客户托管密钥加密的 Secrets Manager 密钥中时,才需要该AllowKmsAccessForEncryptedSecrets声明。更新 Resource ARN 以匹配用于加密您的密钥的 KMS 密钥,并更新该kms:EncryptionContext:SecretARN值以匹配您的密钥名称。

  • 仅当您的 CloudWatch 日志日志组使用客户托管密钥(包括 AWS 安全客户端代表您创建的日志组)加密时,才需要该AllowKmsKeyValidationForCloudWatchLogsLogGroups声明。更新 Resource ARN 以匹配用于加密您的日志组的 KMS 密钥。

  • 如果多个资源共享同一 KMS 密钥,则可以合并语句并在字段中列出共享密钥 ARN 一次。Resource

使用客户托管密钥创建资源

在设置 AWS 安全代理或创建单个资源时,您可以指定客户管理的密钥。KMS 密钥对属于该资源及其子资源的所有数据进行加密。

在安装过程中设置默认 KMS 密钥(控制台)

您可以在初始 AWS 安全客户端设置期间配置默认 KMS 密钥。除非您指定其他密钥,否则此密钥将用作新 Agent Spaces 和集成的默认密钥。

  1. 设置 AWS 安全代理页面上,展开加密-可选部分。

  2. 选择 “自定义加密设置(高级)”。

  3. 对于选择 AWS KMS 密钥,请从您的账户中选择 KMS 密钥,或输入 KMS 密钥 ARN。

  4. 完成其余的设置步骤,然后选择设置 AWS 安全代理

AWS 安全代理会验证 KMS 密钥以确认其存在、是否已启用,并使用对称加密。如果验证失败,安装程序将无法继续进行,并且您会收到一条错误消息。

使用客户托管密钥创建座席空间(控制台)

  1. 在 AWS 安全客户端控制台中,导航到 “代理空间” 页面。

  2. 选择创建代理空间

  3. 输入代理空间的名称和可选描述。

  4. 展开 Advanced(高级)部分。

  5. 在 “数据加密” 下,选择以下选项之一:

    • 使用应用程序默认密钥-使用在安装 AWS 安全客户端期间配置的默认 KMS 密钥。如果配置了默认密钥,则默认情况下会选择此选项。

    • 使用其他密钥-为此代理空间指定不同的 KMS 密钥。选择 “自定义加密设置(高级)”,然后在 “选择 AWS KMS 密钥” 中,从您的账户中选择 KMS 密钥或输入 ARN。

  6. 选择创建

使用客户托管密钥(控制台)创建集成

  1. 在 AWS 安全客户端控制台中,导航到 “集成” 页面。

  2. 选择 “添加集成”,然后选择您的提供商(例如 GitHub)。

  3. 完成步骤 1:安装并授权提供商应用程序。

  4. 步骤 2:注册详细信息中,输入注册名称并配置提供商设置。

  5. 在 “数据加密” 部分中,选择 “自定义加密设置(高级)”。

  6. 对于选择 AWS KMS 密钥,请从您的账户中选择 KMS 密钥,或输入 KMS 密钥 ARN。

  7. 选择连接

使用客户托管密钥创建资源 (AWS (CLI 或 SDK)

要使用 AWS CLI 或 SDK 指定客户托管密钥,请执行以下操作:

  • 在调用CreateApplication为应用程序设置默认 KMS 密钥时,请包含defaultKmsKeyId参数。在没有显式 KMS 密钥的情况下创建代理空间或集成时,此密钥用作备用密钥。

  • 在调用CreateAgentSpace或加密CreateIntegration特定资源时包括kmsKeyId参数。这优先于应用程序级别的默认值。

有关参数的详细信息,请参阅《AWS 安全客户端 API 参考》。

如果您未指定 KMS 密钥,则 AWS 安全客户端将使用应用程序级默认 KMS 密钥(如果已配置)。否则,将使用 AWS托管密钥对资源进行加密。

密钥轮换

AWS 安全客户端会自动定期轮换分支密钥。分支密钥轮换会创建分支密钥的新活动版本,同时保留所有以前的版本。旋转后:

  • 新数据使用新的分支密钥版本进行加密。

  • 以前加密的数据仍可使用较旧的分支密钥版本进行解密。

  • 无需对数据进行重新加密。

分支密钥轮换与 KMS 密钥轮换是分开的。您可以单独为客户托管密钥启用自动 KMS 密钥轮换。有关更多信息,请参阅《密钥管理服务开发人员指南》中的轮换 KMS AWS 钥。

分支密钥轮换后,在短时间内,先前分支密钥的缓存副本仍可用于新的加密操作。此窗口由内部缓存存存活时间 (TTL) 决定,不会影响数据的安全性。

注意事项

在 AWS 安全客户端中使用客户托管密钥时,请记住以下几点:

  • 客户托管密钥仅适用于新资源。在配置客户托管密钥之前创建的现有资源将继续使用 AWS托管加密。现有数据没有迁移。

  • 客户管理的密钥是在创建时指定的。您在创建资源时指定 KMS 密钥。您无法为现有资源添加或更改 KMS 密钥。

  • 支持多个 KMS 密钥。您可以为不同的资源使用不同的 KMS 密钥。例如,您可以将一个密钥用于生产代理空间,将另一个密钥用于开发代理空间。

  • 禁用或删除 KMS 密钥会使数据无法访问。如果您禁用或计划删除 KMS 密钥,则 AWS 安全客户端无法解密使用该密钥加密的数据。在重新启用密钥之前,受影响的资源将无法访问。删除 KMS 密钥会永久阻止访问使用该密钥加密的所有数据。

  • 需要密钥策略权限。如果您从 KMS 密钥策略中删除所需权限,则 AWS 安全客户端将无法访问加密数据。确保密钥策略授予管理员角色(用于管理 AWS 控制台中的服务)、应用程序角色(由 Web 应用程序使用)、渗透测试服务角色(由代理担任运行渗透测试)和 AWS 安全客户端服务主体的权限,如中所述所需的 KMS 权限

  • AWS KMS 配额适用。针对您的 KMS 密钥进行的加密操作计入您的 AWS KMS 请求配额。在正常使用下,分层密钥环架构通过分支密钥缓存最大限度地减少了 KMS 调用。有关更多信息,请参阅《 AWS 密钥管理服务开发人员指南》中的申请配额