View a markdown version of this page

自定义策略引擎的加密 - Amazon Bedrock AgentCore
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)。

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

自定义策略引擎的加密

中的策略默认 AgentCore 提供加密,以使用 Amazon 自有的加密密钥保护敏感的静态客户数据。作为额外的保护层,中的策略 AgentCore 允许您使用密 Amazon 钥管理服务 (Amazon KMS) 客户托管密钥 (CMK) 对策略引擎进行加密。此功能可确保通过静态加密保护敏感数据,从而帮助您:

  • 减轻服务端的运营负担,以保护敏感数据

  • 控制谁可以通过您自己的 Amazon KMS 客户托管密钥查看您的授权策略的详细信息

  • 构建符合严格的加密合规性和法规要求的安全敏感型应用程序

以下各节说明如何为新的策略引擎配置加密以及如何管理您的加密密钥。

注意

静态 AgentCore 加密策略适用于所有 AgentCore 有政策的 Amazon 区域。

Amazon 中策略的 KMS 密钥类型 AgentCore

中的策略与 Amazon KMS AgentCore 集成,用于管理用于加密和解密客户数据的加密密钥。要了解有关密钥类型和状态的更多信息,请参阅 Amazon KMS 开发人员指南中的密Amazon 钥管理服务概念。创建新的策略引擎时,您可以从以下 Amazon KMS 密钥类型中进行选择来加密您的数据:

Amazon 拥有的密钥

默认加密类型。中的策略 AgentCore 拥有密钥,您无需支付任何额外费用,并在创建时对静态资源数据进行加密。使用中 Policy 拥有的密钥加密或解密数据,无需在代码或应用程序中进行额外配置。 AgentCore您无需查看、管理、使用或审核这些密钥。有关更多信息,请参阅 Amazon KMS 开发人员指南中的Amazon 自有密钥。

客户自主管理型密钥

您在 Amazon 账户中创建、拥有和管理密钥。您可以完全控制 KMS 密钥。 Amazon KMS 费用适用于客户托管的密钥。有关更多信息,请参阅 Amazon KMS 定价页面。有关密钥类型的更多信息,请参阅 Amazon KMS 开发人员指南中的客户托管密钥。

当您为策略引擎的加密指定客户托管密钥时,中的策略会使用该密钥 AgentCore 加密策略引擎及其所有子资源(策略、策略生成)。要使用客户托管密钥加密策略引擎,您需要在密钥策略 AgentCore 中授予对策略的访问权限。密钥策略是一种基于资源的策略,您可以将其附加到客户托管密钥上,以控制对密钥的访问权限。有关更多详细信息,请参阅策略中的 AgentCore授权使用您的 Amazon KMS 密钥。

此外,要使用客户托管密钥创建加密策略引擎,或者要对由客户托管密钥加密的策略引擎进行 API 调用,进行调用的 IAM 用户或角色也必须有权访问该密钥。如果 AgentCore Policy in 无法访问该密钥,则任何涉及由该密钥加密的资源的授权决策都将被拒绝。当您无权访问密钥时,您将无法读取、更新或删除由该密钥加密的资源,并且任何使用该密钥进行加密的创建调用都将失败。

重要

一旦使用客户管理的密钥对策略引擎进行加密,您就无法更新资源以使用其他密钥进行加密,也无法从该策略引擎中删除该密钥。

使用 Amazon KMS 和包含策略的数据密钥 AgentCore

静 AgentCore 态加密策略功能使用 KMS 密钥和数据密钥层次结构来保护您的资源数据。

注意

中的策略仅 AgentCore 支持对称 Amazon KMS 密钥。您不能使用非对称 KMS 密钥对 AgentCore 资源中的策略进行加密。

中的策略 AgentCore 使用基于授权的模型来访问您的客户托管密钥。使用客户托管密钥创建策略引擎时,中的策略将 AgentCore 执行以下步骤:

  1. 中的策略 AgentCore 会验证密钥,以确保它是一个使用密钥的对称加密ENCRYPT_DECRYPT密钥并且处于状态。Enabled

  2. 中的策略代表您 AgentCore 创建两个 Amazon KMS 授权。要创建这些授权,请通过转发访问会 AgentCore 话 (FAS) kms:CreateGrant 使用您的身份对通话进行策略。由于CreateGrant调用是通过 FAS 使用您的凭证进行的,因此您的 Amazon KMS 密钥策略必须向您的 Amazon 账户委托人(而不是服务委托人)授予kms:CreateGrant权限。然后,补助金本身允许 Pol AgentCore icy in 代表您执行加密操作,而无需呼叫者进一步参与。

  3. 所有策略数据(策略、策略生成和策略引擎下的相关资源)均使用您的客户托管密钥进行加密。

这两笔补助金的用途不同:

政策管理补助金

用于管理策略数据。该授权允许加密、解密和生成数据密钥操作,用于创建、读取、更新和删除策略及相关资源。

政策评估补助金

用于运行时策略评估。此授权允许解密和重新加密操作,以便策略引擎可以根据传入的授权请求评估 Cedar 策略。

两种授权都受使用密钥的加密上下文的限制aws:bedrock-agentcore-policy:policy-engine-arn,该密钥将授权绑定到特定的策略引擎资源。

当您删除带有客户托管密钥的策略引擎时,中的策略 AgentCore 会自动停用这两个授权。

重要

如果您需要手动撤销授权,请务必同时撤销策略管理拨款和策略评估授权。仅撤销一项授权并不能完全取消该服务对您的密钥的访问权限,并可能导致行为不一致。您可以使用 Amazon KMS 控制台或 list-grants Amazon CLI 命令查看和管理密钥的授权。

授权使用您的 Amazon 中策略的 KMS 密钥 AgentCore

要使用包含策略的客户托管密钥 AgentCore,您的 Amazon KMS 密钥策略必须向您的 Amazon 账户授予权限。创建策略引擎时,通过转发访问会 AgentCore 话 (FAS) kms:CreateGrant 使用您的身份进行通话。因此,密钥策略必须向您的账户委托人(而不是服务委托人)授予kms:CreateGrant和其他必需的权限,并使用kms:ViaService条件来确保仅通过中的策略使用密钥 AgentCore。

中的策略至少 AgentCore 需要对客户托管密钥具有以下权限:

  • kms:CreateGrant— 为加密、解密、生成数据密钥、重新加密和描述密钥操作创建授权

  • kms:Decrypt— 解密使用密钥加密的数据

  • kms:GenerateDataKey— 生成用于加密策略数据的数据密钥

  • kms:DescribeKey— 检索密钥元数据以验证密钥配置

了解源代码上下文

源上下文提供有关试图对给定密钥进行 Amazon KMS 操作的源调用者的信息。这通过将上下文绑定到数据源来防止加密数据的混淆或滥用。

当中的策略代表您通过授权 AgentCore 执行 Amazon KMS 操作时,源上下文会在发起请求的 AgentCore 资源中标识策略。您可以在密钥策略中使用源上下文作为基于授权的操作的附加条件,将密钥的使用限制在来自特定账户或资源的请求上。

注意

源上下文条件(aws:SourceAccount和aws:SourceArn)在基于授权的 Amazon KMS 操作中可用,但在使用正向访问会kms:CreateGrant话的呼叫中不可用。

例如,您可以在密钥策略中的 KMS 操作和验证语句中添加aws:SourceAccount和aws:SourceArn条件,以确保只有在请求来自您的账户和策略引擎资源时,这些操作才会成功:

{ "Sid": "Allow Policy for KMS operations with source context", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:root" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "bedrock-agentcore.us-east-1.amazonaws.com", "aws:SourceAccount": "111122223333" }, "StringLike": { "aws:SourceArn": "arn:aws:bedrock-agentcore:us-east-1:111122223333:policy-engine/*", "kms:EncryptionContext:aws:bedrock-agentcore-policy:policy-engine-arn": "arn:aws*:bedrock-agentcore:*:*:policy-engine/*" } } }

如果源账户与此 Amazon KMS 密钥所在的账户相同,则此密钥策略允许 Policy in 通过授权代表您拨打 KMS 呼叫。 AgentCore 在检查 KMS 密钥的 CloudTrail 审计日志时,这些值应该是可验证的。有关全局 Amazon 条件密钥的更多信息,请参阅 Amazon KM S 开发人员指南中的使用 aws: SourceArn 或 aws: SourceAccount 条件密钥。

了解 kms:ViaService

kms:ViaService条件密钥将 KMS 密钥的使用限制为来自指定 Amazon 服务的请求。此条件密钥适用于转发访问会话 (FAS)。有关的更多信息kms:ViaService,请参阅 KM Amazon S 开发人员指南ViaService中的 kms:。

在密钥策略中,kms:ViaService值遵循以下格式bedrock-agentcore.REGION.amazonaws.com,其中REGION是创建策略引擎的 Amazon 区域(例如bedrock-agentcore.us-east-1.amazonaws.com)。

了解加密上下文

加密上下文是一组键值对,其中包含用于加密完整性检查的其他经过身份验证的数据。当您在加密数据的请求中包含加密上下文时, Amazon KMS 会以加密方式将加密上下文绑定到加密数据。要解密数据,必须传递相同的加密上下文。有关更多信息,请参阅 Amazon KMS 开发人员指南中的加密上下文。

中的策略在所有 Amazon KMS 加密操作中 AgentCore 使用以下加密上下文,当策略中的策略代表您调用 Amazon KMS AgentCore 进行加密和解密过程时,可以在 CloudTrail 日志中进行验证:

{ "aws:bedrock-agentcore-policy:policy-engine-arn": "arn:aws:bedrock-agentcore:REGION:ACCOUNT_ID:policy-engine/POLICY_ENGINE_ID" }

您可以在密钥策略条件中使用此加密上下文来限制哪些策略引擎可以使用该密钥。例如,下一节中的密钥策略使用一个kms:EncryptionContext条件来允许该密钥仅用于策略引擎资源。

完成 Amazon KMS 密钥策略

基于前几节中的概念,以下示例密钥策略提供了加密策略引擎和使用加密策略引擎所需的权限。该策略包含符合安全最佳实践的条件密钥。

重要

替换密钥策略中的以下值:

  • 111122223333使用您的 Amazon 账户 ID

  • us-east-1与您所在 Amazon 的地区

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Allow Policy to create grants", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/ExampleRole" }, "Action": "kms:CreateGrant", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "bedrock-agentcore.us-east-1.amazonaws.com", "kms:GrantConstraintType": "EncryptionContextSubset" }, "StringLike": { "kms:EncryptionContext:aws:bedrock-agentcore-policy:policy-engine-arn": "arn:aws*:bedrock-agentcore:*:*:policy-engine/*" }, "ForAllValues:StringEquals": { "kms:GrantOperations": [ "Encrypt", "Decrypt", "GenerateDataKey", "GenerateDataKeyWithoutPlaintext", "ReEncryptFrom", "ReEncryptTo" ] } } }, { "Sid": "Allow Policy for KMS operations", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/ExampleRole" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "bedrock-agentcore.us-east-1.amazonaws.com" }, "StringLike": { "kms:EncryptionContext:aws:bedrock-agentcore-policy:policy-engine-arn": "arn:aws*:bedrock-agentcore:*:*:policy-engine/*" } } }, { "Sid": "Allow Policy for KMS validation", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/ExampleRole" }, "Action": "kms:DescribeKey", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "bedrock-agentcore.us-east-1.amazonaws.com" } } } ] }

该政策包含以下声明:

允许策略创建授权

允许调用者在创建策略引擎时创建 Amazon KMS 授权。该kms:GrantConstraintType条件可确保授权受加密上下文的限制。的ForAllValues:StringEquals条件将授予仅kms:GrantOperations限于政策中 AgentCore 要求的加密操作。

KMS 操作的允许策略

允许调用者通过中的策略执行解密和生成数据密钥操作。 AgentCore加密上下文条件可确保这些操作的范围仅限于策略引擎资源。

允许 KMS 验证策略

允许呼叫者通过中的策略描述密钥 AgentCore。在创建策略引擎期间,使用此权限来验证密钥是否符合要求(对称、已启用、密钥使用正确)。

重要

为策略中已在使用的密 Amazon 钥修改 KMS 密钥策略时要谨慎行事 AgentCore。如果您无意中从密钥策略中删除了必要的权限,则中的策略 AgentCore 将无法再解密策略数据,并且所有授权决策都将被拒绝。任何需要访问加密数据的操作(例如创建、读取、更新或删除策略)也将失败。

加密策略引擎的先决条件

在加密策略引擎之前,请确保您已满足以下先决条件:

有关控制 KMS 密钥的 IAM 权限的更多信息,请参阅 KMS 开发人员指南中的 Amazon KMS 密钥访问和权限。

创建加密策略引擎

在创建加密策略引擎之前,请确保您正在使用的客户托管密钥已为策略设置了正确的密钥策略声明, AgentCore 以便使用该密钥进行加密和解密。有关所需权限,请参阅策略中的 AgentCore授权使用您的 Amazon KMS 密钥。

要加密您的策略引擎,请在创建策略引擎时提供密钥 ARN:

例
AgentCore CLI
  1. 使用添加引擎--encryption-key-arn,然后部署:

    agentcore add policy-engine \ --name MyPolicyEngine \ --description "Policy engine with customer-managed encryption" \ --encryption-key-arn arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab agentcore deploy --yes
Amazon CLI
  1. 在终端中运行以下代码,使用 Amazon CLI 创建加密策略引擎:

    aws bedrock-agentcore-control create-policy-engine \ --name MyPolicyEngine \ --description "Policy engine with customer-managed encryption" \ --encryption-key-arn "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"
Amazon Python SDK (Boto3)
  1. 运行以下代码,使用适用于 Python 的 Amazon 软件开发工具包创建加密策略引擎:

    import boto3 client = boto3.client('bedrock-agentcore-control') response = client.create_policy_engine( name='MyPolicyEngine', description='Policy engine with customer-managed encryption', encryptionKeyArn='arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab', ) print(response['policyEngineId'], response['status'])

响应包括策略引擎 ARN 和状态:

{ "policyEngineId": "MyPolicyEngine-abc123defg", "name": "MyPolicyEngine", "description": "Policy engine with customer-managed encryption", "policyEngineArn": "arn:aws:bedrock-agentcore:us-east-1:123456789012:policy-engine/MyPolicyEngine-abc123defg", "status": "CREATING", "statusReasons": [], "encryptionKeyArn": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab", "createdAt": "2026-02-24T12:00:00Z", "updatedAt": "2026-02-24T12:00:00Z" }
注意

如果您的策略引擎正在使用的 KMS 密钥密钥因错误的 KMS 密 Amazon 钥策略而被删除、禁用或无法访问,则资源解密将失败。这可能会导致授权决定被拒绝。访问丢失可能是暂时的(可以更正密钥策略)或永久的(已删除的密钥无法恢复),具体取决于情况。我们建议您限制对关键操作的访问权限,例如删除或禁用 KMS 密钥。此外,我们建议您的组织设置Amazon 漏洞访问程序,以确保您的特权用户能够 Amazon 在不太可能发生的无法访问策略的情况下进行访问。 AgentCore

限制

以下限制适用于策略引擎的客户托管密钥加密:

  • 策略引擎一旦启用,就无法禁用加密。

  • 创建未加密的策略引擎后,您无法将策略引擎更新为由客户托管密钥进行加密。

  • 使用客户托管密钥创建策略引擎后,您无法更改密钥或将其从该策略引擎中删除。您必须创建新的策略引擎才能使用其他密钥。

  • 客户托管密钥加密是在策略引擎级别配置的。策略引擎下的所有资源(包括策略和策略生成)都使用与策略引擎相同的客户托管密钥进行加密。您不能为策略引擎中的各个资源指定不同的密钥。

  • 撤销 Policy in AgentCore 对现有加密策略引擎的客户托管密钥的访问权限后,所有授权决策都将被拒绝,因为策略引擎无法再解密策略数据。

问题排查

本节介绍您在中使用策略时可能遇到的与客户托管密钥相关的常见错误, AgentCore 并提供了解决这些错误的故障排除步骤。

访问被拒绝: Amazon KMS 权限问题

错误:“拒绝访问指定的 KMS 密钥。验证密钥策略是否授予了所需的权限。”

这可能意味着调用者在其 IAM 策略或 KMS 密 Amazon 钥策略中缺少所需的 kms: * 操作权限,或者被引用的密钥不存在或已不存在。

要解决此问题,请执行以下操作:

  1. 验证 KMS 密钥 ARN 是否正确且密钥存在于指定区域。

  2. 验证 Amazon KMS 密钥策略是否包含所需的语句。请参阅完成 Amazon KMS 密钥策略。

  3. 验证呼叫者的 IAM 策略是否包含所需的 Amazon KMS 权限(kms:CreateGrantkms:Decrypt、kms:GenerateDataKey、、kms:DescribeKey)。

  4. 检查kms.amazonaws.com事件 CloudTrail 以确定哪个操作被拒绝以及哪个主体尝试了该操作。

验证异常: Amazon KMS 密钥配置

错误:“指定的 KMS 密钥未处于可用状态。验证密钥是否已启用且未等待删除。”

这意味着,由于其当前配置,所引用的密钥不能用于客户托管密钥加密。可能的原因包括:

  • 密钥已禁用或待删除。

  • 密钥不是对称加密密钥。

  • 密钥没有密ENCRYPT_DECRYPT钥用法。

要解决此问题,请验证密钥是否满足加密策略引擎的先决条件中描述的先决条件。

密钥不可用:您无法列出或阅读您的政策

如果客户管理的密钥变得不可用(已删除、已禁用、待删除,或者授权或密钥政策已撤销),则返回加密内容的操作将停止运行。 ListPolicyEngines、GetPolicyEngine、ListPolicies、和GetPolicy都在返回之前验证密钥并解密,因此当密钥不可用时,每一个都失败。这是设计使然:没有密钥就无法阅读策略定义。

实际问题是恢复。这些是您通常用来找出存在的内容的操作,因此丢失密钥可能会使您无法枚举需要清理的资源。

要解决此问题,请使用摘要操作。它们仅返回标识符和状态,不包含加密内容,因此它们既不验证密钥,也不解密,当密钥不进行解密时,它们会继续工作。

重要

摘要操作是与相应列表和获取操作分开的 IAM 操作。一种最低权限策略,仅授予ListPolicyEngines、、GetPolicyEngineListPolicies、GetPolicy而不涵盖这些权限。明确授予所有四个:

  • bedrock-agentcore:ListPolicyEngineSummaries

  • bedrock-agentcore:GetPolicyEngineSummary

  • bedrock-agentcore:ListPolicySummaries

  • bedrock-agentcore:GetPolicySummary

在你需要之前授予它们。当密钥变得不可用时缺少这些资源的主体无法枚举受影响的资源。有关更多信息,请参阅 AgentCore IAM 权限中的AgentCore 网关和策略。

首先,列出账户中的策略引擎,包括每个引擎使用的密钥。然后列出受影响引擎内部的策略。

例
AgentCore CLI
  1. 不可用。C AgentCore LI 不公开摘要操作,只agentcore status报告当前项目管理的资源。使用 C Amazon LI 或 SDK 恢复库存。

Amazon CLI
  1. 列出引擎,然后列出受影响引擎中的策略:

    aws bedrock-agentcore-control list-policy-engine-summaries aws bedrock-agentcore-control list-policy-summaries \ --policy-engine-id <policy-engine-id>
Amazon Python SDK (Boto3)
  1. 列出引擎,然后列出受影响引擎中的策略:

    import boto3 client = boto3.client('bedrock-agentcore-control') for engine in client.list_policy_engine_summaries()['policyEngineSummaries']: print(engine['policyEngineId'], engine['status'], engine.get('encryptionKeyArn')) for policy in client.list_policy_summaries( policyEngineId='<policy-engine-id>' )['policySummaries']: print(policy['policyId'], policy['name'], policy['status'], policy['enforcementMode'])

引擎摘要给出了每个引擎的policyEngineIdname、status、和encryptionKeyArn。encryptionKeyArn用于确认哪些引擎依赖于受影响的密钥。策略摘要给出了每个策略的policyId、namestatusenforcementMode、和,但没有给出其 definition ——该语句是加密部分,省略了。汇总操作为您提供完整的清单。但是,删除找到的内容取决于密钥。

重要

如果引擎的密钥不可用,则无法删除仍包含策略的引擎。

删除策略需要对密钥的读写权限,因此由于与读取操作相同的原因而DeletePolicy失败。删除策略引擎不会使用密钥,但会拒绝对非空引擎执行操作:

Policy engine still contains 3 policies and cannot be deleted

总而言之,当密钥不可用时,无法删除包含策略的引擎:没有密钥就无法删除策略,并且在引擎消失之前无法将其删除。空引擎仍然可以删除,在密钥仍然起作用时策略被移除的引擎也可以删除。

恢复密钥。对于持有策略的引擎来说,这是唯一的前进方向。

  1. Re-enable 已禁用的密钥,或者取消待删除的密钥。

  2. 恢复完成 Amazon KMS 密钥策略中描述的密钥策略声明和授权。

  3. 以主叫方aws kms describe-key --key-id <key-arn>身份确认访问权限。

密钥再次起作用后,读取操作将返回策略定义,删除操作将正常运行 — 按 ID 删除策略,然后删除引擎:

例
AgentCore CLI
  1. 对于项目管理的资源,请将其移除并部署:

    agentcore remove policy --engine <engine-name> --name <policy-name> --yes agentcore remove policy-engine --name <engine-name> --yes agentcore deploy --yes
Amazon CLI
  1. 按 ID 删除策略,然后删除引擎:

    aws bedrock-agentcore-control delete-policy \ --policy-engine-id <policy-engine-id> \ --policy-id <policy-id> aws bedrock-agentcore-control delete-policy-engine \ --policy-engine-id <policy-engine-id>
Amazon Python SDK (Boto3)
  1. 删除所有策略,等待每个策略,然后删除引擎:

    import boto3 client = boto3.client('bedrock-agentcore-control') ENGINE_ID = '<policy-engine-id>' for policy in client.list_policy_summaries( policyEngineId=ENGINE_ID )['policySummaries']: client.delete_policy(policyEngineId=ENGINE_ID, policyId=policy['policyId']) client.get_waiter('policy_deleted').wait( policyEngineId=ENGINE_ID, policyId=policy['policyId'] ) client.delete_policy_engine(policyEngineId=ENGINE_ID) client.get_waiter('policy_engine_deleted').wait(policyEngineId=ENGINE_ID)

当引擎仍与网关关联时,无论密钥的状态如何,都无法将其删除。请先将其解除关联;请参阅使用策略引擎更新现有网关。

警告

已完成删除的 Amazon KMS 密钥无法恢复,其下的策略定义也无法加密。如果该密钥保护了仍包含策略的引擎,则无法清空该引擎,因此无法通过 API 将其删除。如果您的引擎处于该状态,请联系 Amazon Support。

这值得计划而不是发现:在安排删除密钥之前,请删除每个使用该密钥的引擎中的策略,或者确认这些引擎已经为空。

注意

摘要操作需要自己的 IAM 权限,而仅授予列表和获取操作的策略不包括这些权限。有关要授权的操作以及提前授予的原因,请参阅密钥不可用:您无法列出或阅读您的政策。