使用最低权限策略管理加密 Amazon SQS 队列的访问权限 - Amazon Simple Queue Service

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

使用最低权限策略管理加密 Amazon SQS 队列的访问权限

您可以使用 Amazon SQS 通过使用与AWS Key Management Service (SSE) 集成的服务器端加密 () 在应用程序之间交换敏感数据。KMS通过与 Amazon SQS 的集成 AWS KMS,您可以集中管理保护亚马逊SQS的密钥以及保护您的其他 AWS 资源的密钥。

多个 AWS 服务可以充当向 Amazon 发送事件的事件源SQS。要使事件源能够访问加密的 Amazon SQS 队列,您需要使用客户管理的 AWS KMS 密钥配置队列。然后,使用密钥策略允许服务使用所需的 AWS KMS API方法。该服务还需要对访问进行身份验证的权限才能使队列发送事件。您可以通过使用 Amazon SQS 策略来实现这一目标,该策略是一种基于资源的策略,可用于控制对 Amazon SQS 队列及其数据的访问。

以下各节提供有关如何通过亚马逊政策和密 AWS KMS 钥SQS策略控制对您的加密亚马逊SQS队列的访问权限的信息。本指南中的策略将帮助您实现最低权限

本指南还描述了基于资源的策略如何使用aws:SourceArnaws:SourceAccountaws:PrincipalOrgID全局IAM条件上下文键来解决混淆副手问题

概述

在本主题中,我们将引导您了解一个常见的用例,以说明如何构建密钥策略和 Amazon SQS 队列策略。此使用案例如下图所示。

向亚马逊发布亚马逊SNS消息SQS。

在此示例中,消息创建者是一个亚马逊简单通知服务 (SNS) 主题,该主题配置为将消息分发到您的加密亚马逊SQS队列。消息使用者是一种计算服务,例如AWS Lambda函数、Amazon Elastic Compute Cloud (EC2) 实例或AWS Fargate容器。然后将您的 Amazon SQS 队列配置为将失败的消息发送到死信队列 () DLQ。这对于调试应用程序或消息传递系统非常有用DLQs,因为您可以隔离未使用的消息,以确定其处理失败的原因。在本主题中定义的解决方案中,使用 Lambda 函数等计算服务来处理存储在 Ama SQS zon 队列中的消息。如果消息使用者位于虚拟私有云中 (VPC),则本指南中包含的DenyReceivingIfNotThroughVPCE政策声明允许您将消息接收限制为特定私有云VPC。

注意

本指南仅以政策声明的形式包含所需的IAM权限。要制定政策,您需要将声明添加到您的 Amazon SQS 政策或 AWS KMS 密钥策略中。本指南未提供有关如何创建 Amazon SQS 队列或 AWS KMS 密钥的说明。有关如何创建这些资源的说明,请参阅创建 Amazon SQS 队列创建密钥

本指南中定义的亚马逊SQS政策不支持将消息直接重新发送到相同或不同的亚马逊SQS队列。

Amazon 的最低权限密钥政策 SQS

在本节中,我们将介绍 AWS KMS 用于加密亚马逊SQS队列的客户管理密钥所需的最低权限权限。使用这些权限,您可以将访问权限限制为仅限目标实体,同时实施最低权限。密钥政策必须包含以下策略语句,我们将通过以下资源详细描述这些语句:

向 AWS KMS 密钥授予管理员权限

要创建 AWS KMS 密钥,您需要为用于部署 AWS KMS 密钥的IAM角色提供 AWS KMS 管理员权限。这些管理员权限在以下 AllowKeyAdminPermissions 策略语句中进行了定义。将此声明添加到 AWS KMS 密钥策略时,请务必替换 <admin-role ARN> 使用用于部署 AWS KMS 密钥、管理密钥或两者兼而有之的IAM角色的 Amazon 资源名称 (ARN)。 AWS KMS 这可以是您的部署管道的IAM角色,也可以是您的组织在 Organizations 中的管理员角色。AWS

{ "Sid": "AllowKeyAdminPermissions", "Effect": "Allow", "Principal": { "AWS": [ "<admin-role ARN>" ] }, "Action": [ "kms:Create*", "kms:Describe*", "kms:Enable*", "kms:List*", "kms:Put*", "kms:Update*", "kms:Revoke*", "kms:Disable*", "kms:Get*", "kms:Delete*", "kms:TagResource", "kms:UntagResource", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion" ], "Resource": "*" }
注意

在 AWS KMS 密钥策略中,Resource元素的值必须是*,这意味着 “这个 AWS KMS 密钥”。星号 (*) 标识 AWS KMS 密钥策略所关联的密钥。

授予对密钥元数据的只读访问权限

要向其他IAM角色授予对您的密钥元数据的只读访问权限,请将该AllowReadAccessToKeyMetaData声明添加到您的密钥策略中。例如,以下语句允许您列出账户中的所有 AWS KMS 密钥以供审计。此语句授予 AWS 根用户对密钥元数据的只读访问权限。因此,账户中的任何IAM委托人只要其基于身份的策略具有以下声明中列出的权限,就可以访问密钥元数据:kms:Describe*kms:Get*、和。kms:List*一定要更换 <account-ID> 用你自己的信息。

{ "Sid": "AllowReadAcesssToKeyMetaData", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::<accountID>:root" ] }, "Action": [ "kms:Describe*", "kms:Get*", "kms:List*" ], "Resource": "*" }

向亚马逊SNSKMS授予向队列发布消息的权限 SNS

要允许您的亚马逊SNS主题向加密的亚马逊SQS队列发布消息,请将AllowSNSToSendToSQS政策声明添加到您的密钥策略中。此声明授予亚马逊使用该 AWS KMS 密钥发布到您的亚马逊SQS队列的SNS权限。一定要更换 <account-ID> 用你自己的信息。

注意

声明Condition中的限制只能在同一 AWS 账户中使用Amazon SNS 服务。

{ "Sid": "AllowSNSToSendToSQS", "Effect": "Allow", "Principal": { "Service": [ "sns.amazonaws.com" ] }, "Action": [ "kms:GenerateDataKey" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "<account-id>" } } }

允许使用者解密来自队列的消息

以下AllowConsumersToReceiveFromTheQueue语句向亚马逊SQS消息使用者授予解密从加密的 Ama SQS zon 队列收到的消息所需的权限。附上政策声明时,请替换 <consumer's runtime role ARN> 使用消息使用ARN者的IAM运行时角色。

{ "Sid": "AllowConsumersToReceiveFromTheQueue", "Effect": "Allow", "Principal": { "AWS": [ "<consumer's execution role ARN>" ] }, "Action": [ "kms:Decrypt" ], "Resource": "*" }

亚马逊最低权限SQS政策

本节将引导您了解本指南所涵盖的用例(例如,Amazon to AmazonSQS)的最低权限亚马逊SQSSNS队列策略。定义的策略旨在通过混合使用 DenyAllow 语句来防止意外访问。Allow 语句会向目标实体或实体授予访问权限。这些Deny声明可防止其他非预期实体访问亚马逊队SQS列,同时将目标实体排除在政策条件之内。

Amazon SQS 政策包括以下声明,我们在下面详细描述了这些声明:

限制 Amazon 的SQS管理权限

以下RestrictAdminQueueActions政策声明将 Amazon SQS 管理权限仅限于您用于部署队列、管理队列或两者兼而有之的一个或多个角色。IAM请务必更换 <placeholder values> 用你自己的信息。指定用于部署 Amazon SQS 队列的IAM角色以及应具有 Amazon SQS 管理权限的所有管理员角色。ARN ARNs

{ "Sid": "RestrictAdminQueueActions", "Effect": "Deny", "Principal": { "AWS": "*" }, "Action": [ "sqs:AddPermission", "sqs:DeleteQueue", "sqs:RemovePermission", "sqs:SetQueueAttributes" ], "Resource": "<SQS Queue ARN>", "Condition": { "StringNotLike": { "aws:PrincipalARN": [ "arn:aws:iam::<account-id>:role/<deployment-role-name>", "<admin-role ARN>" ] } } }

限制指定组织的 Amazon SQS 队列操作

为了帮助保护您的 Amazon SQS 资源免受外部访问(由AWS 组织外部实体访问),请使用以下声明。此声明将 Amazon SQS 队列访问权限限制为您在中指定的组织Condition。一定要更换 <SQS queue ARN> 以及用于部署 Amazon SQS 队列的IAM角色的;以及 ARN <org-id>,并附上您的组织 ID。

{ "Sid": "DenyQueueActionsOutsideOrg", "Effect": "Deny", "Principal": { "AWS": "*" }, "Action": [ "sqs:AddPermission", "sqs:ChangeMessageVisibility", "sqs:DeleteQueue", "sqs:RemovePermission", "sqs:SetQueueAttributes", "sqs:ReceiveMessage" ], "Resource": "<SQS queue ARN>", "Condition": { "StringNotEquals": { "aws:PrincipalOrgID": [ "<org-id>" ] } } }

向消费者授SQS予亚马逊权限

要从 Amazon SQS 队列接收消息,您需要向消息使用者提供必要的权限。以下策略声明向您指定的使用者授予使用来自 Amazon SQS 队列的消息所需的权限。在您的 Amazon SQS 政策中添加声明时,请务必替换 <consumer's IAM runtime role ARN> 与使用ARN者使用的IAM运行时角色相同;以及 <SQS queue ARN>,其中包含用于部署 Amazon SQS 队列的IAM角色。ARN

{ "Sid": "AllowConsumersToReceiveFromTheQueue", "Effect": "Allow", "Principal": { "AWS": "<consumer's IAM execution role ARN>" }, "Action": [ "sqs:ChangeMessageVisibility", "sqs:DeleteMessage", "sqs:GetQueueAttributes", "sqs:ReceiveMessage" ], "Resource": "<SQS queue ARN>" }

要防止其他实体接收来自亚马逊SQS队列的消息,请将该DenyOtherConsumersFromReceiving声明添加到亚马逊SQS队列策略中。此语句会限制消息仅供您指定的使用者使用,不允许其他使用者访问,即使他们的身份权限会授予他们访问权限,也是如此。一定要更换 <SQS queue ARN> 以及 <consumer’s runtime role ARN> 用你自己的信息。

{ "Sid": "DenyOtherConsumersFromReceiving", "Effect": "Deny", "Principal": { "AWS": "*" }, "Action": [ "sqs:ChangeMessageVisibility", "sqs:DeleteMessage", "sqs:ReceiveMessage" ], "Resource": "<SQS queue ARN>", "Condition": { "StringNotLike": { "aws:PrincipalARN": "<consumer's execution role ARN>" } } }

实施传输中加密

以下DenyUnsecureTransport政策声明强制消费者和制作者使用安全通道(TLS连接)来发送和接收来自 Amazon SQS 队列的消息。一定要更换 <SQS queue ARN> 使用用于部署 Amazon SQS 队列的IAM角色的。ARN

{ "Sid": "DenyUnsecureTransport", "Effect": "Deny", "Principal": { "AWS": "*" }, "Action": [ "sqs:ReceiveMessage", "sqs:SendMessage" ], "Resource": "<SQS queue ARN>", "Condition": { "Bool": { "aws:SecureTransport": "false" } } }

将消息传输限制为特定的 Amazon SNS 主题

以下AllowSNSToSendToTheQueue策略声明允许指定的 Amazon SNS 主题向亚马逊SQS队列发送消息。一定要更换 <SQS queue ARN> 与用于部署 Amazon SQS 队列的IAM角色相同;以及 ARN <SNS topic ARN>,以亚马逊为SNS主题ARN。

{ "Sid": "AllowSNSToSendToTheQueue", "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Action": "sqs:SendMessage", "Resource": "<SQS queue ARN>", "Condition": { "ArnLike": { "aws:SourceArn": "<SNS topic ARN>" } } }

以下 DenyAllProducersExceptSNSFromSending 策略语句禁止其他创建者向队列发送消息。Replace(替换) <SQS queue ARN> 以及 <SNS topic ARN> 用你自己的信息。

{ "Sid": "DenyAllProducersExceptSNSFromSending", "Effect": "Deny", "Principal": { "AWS": "*" }, "Action": "sqs:SendMessage", "Resource": "<SQS queue ARN>", "Condition": { "ArnNotLike": { "aws:SourceArn": "<SNS topic ARN>" } } }

(可选)将消息接收限制到特定VPC端点

要将消息仅限于特定的VPC终端节点,请将以下政策声明添加到您的 Amazon SQS 队列策略中。此语句可防止消息使用者从队列接收消息,除非消息来自所需的VPC端点。Replace(替换) <SQS queue ARN> 与用于部署 Amazon SQS 队列的IAM角色相同;以及 ARN <vpce_id> 使用终VPC端节点的 ID。

{ "Sid": "DenyReceivingIfNotThroughVPCE", "Effect": "Deny", "Principal": "*", "Action": [ "sqs:ReceiveMessage" ], "Resource": "<SQS queue ARN>", "Condition": { "StringNotEquals": { "aws:sourceVpce": "<vpce id>" } } }

Amazon 关于死信队列的SQS政策声明

将以下策略声明(由其声明 ID 标识)添加到您的DLQ访问策略中:

  • RestrictAdminQueueActions

  • DenyQueueActionsOutsideOrg

  • AllowConsumersToReceiveFromTheQueue

  • DenyOtherConsumersFromReceiving

  • DenyUnsecureTransport

除了在DLQ访问策略中添加上述策略声明外,您还应添加一条声明,以限制向 Amazon SQS 队列传输消息,如下一节所述。

限制向 Amazon SQS 队列传输消息

要限制仅访问同一账户的 Amazon SQS 队列,请在DLQ队列DenyAnyProducersExceptSQS策略中添加以下政策声明。此语句不会将消息传输限制到特定队列,因为您需要在创建主队列DLQ之前进行部署,因此在创建SQSARN时您不会知道 Amazon DLQ。如果您只需要将访问权限限制为一个 Amazon SQS 队列,请在知道时Condition使用您的亚马逊SQS源队列进行修改。aws:SourceArn ARN

{ "Sid": "DenyAnyProducersExceptSQS", "Effect": "Deny", "Principal": { "AWS": "*" }, "Action": "sqs:SendMessage", "Resource": "<SQS DLQ ARN>", "Condition": { "ArnNotLike": { "aws:SourceArn": "arn:aws:sqs:<region>:<account-id>:*" } } }
重要

本指南中定义的 Amazon SQS 队列策略不会将sqs:PurgeQueue操作限制在某个IAM或多个角色上。该sqs:PurgeQueue操作允许您删除 Amazon SQS 队列中的所有消息。您也可以使用此操作更改消息格式,而无需替换 Amazon SQS 队列。调试应用程序时,您可以清除 Amazon SQS 队列以删除可能的错误消息。测试应用程序时,您可以通过 Amazon SQS 队列驱动大量消息,然后在进入生产环境之前清除队列以重新开始。之所以不将此操作限制为某个角色,是因为在部署 Amazon SQS 队列时可能不知道此角色。您需要将此权限添加到角色基于身份的策略中,才能清除队列。

防范跨服务混淆代理问题

混淆代理问题是一个安全问题,即没有执行操作权限的实体可能会迫使更具权限的实体执行该操作。为了防止这种情况, AWS 如果您向第三方(称为跨账户)或其他 AWS 服务(称为跨服务)提供对您账户中资源的访问权限,则提供可帮助您保护账户的工具。本节中的策略语句可以帮助您防范跨服务混淆代理问题。

一个服务(呼叫服务)调用另一项服务(所谓的服务)时,可能会发生跨服务模拟。可以操纵调用服务以使用其权限对另一个客户的资源进行操作,否则该服务不应有访问权限。为了帮助防范此问题,本文中定义的基于资源的策略使用aws:SourceArnaws:SourceAccount、和aws:PrincipalOrgID全局IAM条件上下文密钥。这会将服务拥有的权限限制在 Organizations 中的特定资源、特定账户或特定 AWS 组织。

使用IAM访问分析器查看跨账户访问权限

您可以使用 A AWS IAMccess Analy zer 查看您的亚马逊SQS队列策略和 AWS KMS 密钥策略,并在亚马逊SQS队列或 AWS KMS 密钥向外部实体授予访问权限时提醒您。IAMAccess Analyzer 可帮助识别组织中的资源以及与信任区域之外的实体共享的账户。此信任区域可以是您在启用 A IAM ccess Analyzer 时指定的 AWS 组织中的 AWS 帐户或组织。

IAMAccess Analyzer 使用基于逻辑的推理来分析环境中基于资源的策略,从而识别与外部委托人共享的资源。 AWS 对于在您的信任区域外共享的资源的每个实例,Access Analyzer 都会生成一个调查结果。调查结果包括有关访问权限以及该访问权限授予到的外部主体的信息。您可以查看调查结果,以确定该访问权限是按计划授予且安全,还是计划外的访问权限并存在安全风险。对于任何意外访问,请查看受影响的策略并进行修复。有关 Access Analyzer 如何识别对您的 AWS 资源的意外 AWS IAM访问的更多信息,请参阅此博客文章

有关 A AWS IAM ccess Analyzer 的更多信息,请参阅AWS IAM访问分析器文档