Gerenciamento de acesso para filas criptografadas do Amazon SQS com políticas de privilégio mínimo
É possível usar o Amazon SQS para trocar dados sigilosos entre aplicações usando a criptografia do lado do servidor (SSE) integrada ao AWS Key Management Service (KMS). Com a integração do Amazon SQS e do AWS KMS, você pode gerenciar de forma centralizada as chaves que protegem o Amazon SQS, bem como as chaves que protegem seus outros recursos da AWS.
Vários serviços da AWS podem servir como fontes que enviam eventos ao Amazon SQS. Para permitir que uma fonte de eventos acesse a fila criptografada do Amazon SQS, você precisa configurar a fila com uma chave do AWS KMS gerenciada pelo cliente. Depois, utilize a política de chaves para permitir que o serviço use os métodos de API necessários do AWS KMS. O serviço também exige permissões para autenticar o acesso e permitir que a fila envie eventos. É possível fazer isso usando uma política do Amazon SQS, que é uma política baseada em recursos que você pode usar para controlar o acesso à fila do Amazon SQS e os respectivos dados.
As seções a seguir fornecem informações sobre como controlar o acesso à fila criptografada do Amazon SQS por meio da política do Amazon SQS e da política de chaves do AWS KMS. As políticas deste guia ajudarão você a alcançar o privilégio mínimo.
Este guia também descreve como as políticas baseadas em recursos resolvem o problema de confused-deputy usando as chaves de contexto de condição globais do IAM aws:SourceArn, aws:SourceAccount e aws:PrincipalOrgID.
Tópicos
Visão geral
Neste tópico, vamos mostrar um caso de uso comum para ilustrar como você pode criar a política de chaves e a política de filas do Amazon SQS. Esse caso de uso é mostrado na imagem a seguir.
Neste exemplo, o produtor de mensagens é um tópico do Amazon Simple Notification Service (SNS), que está configurado para fazer fanout de mensagens para a fila criptografada do Amazon SQS. O consumidor de mensagens é um serviço de computação, como uma função do AWS Lambda, uma instância do Amazon Elastic Compute Cloud (EC2) ou um contêiner do AWS Fargate. Sua fila do Amazon SQS é então configurada para enviar mensagens de falha Amazon a uma fila de mensagens não entregues (DLQ). Isso é útil para depurar a aplicação ou o sistema de mensagens, pois as DLQs permitem que você isole mensagens não consumidas para determinar por que seu processamento não obteve êxito. Na solução definida neste tópico, um serviço de computação, como uma função do Lambda, é usado para processar mensagens armazenadas na fila do Amazon SQS. Se o consumidor da mensagem estiver localizado em uma nuvem privada virtual (VPC), a declaração de política DenyReceivingIfNotThroughVPCE incluída neste guia permite restringir o recebimento de mensagens a essa VPC específica.
nota
Este guia contém somente as permissões do IAM necessárias na forma de declarações de política. Para criar a política, você precisa adicionar as declarações à política do Amazon SQS ou à política de chaves do AWS KMS. Este guia não fornece instruções sobre como criar a fila do Amazon SQS ou a chave do AWS KMS. Para obter instruções sobre a criação desses recursos, consulte “Creating an Amazon SQS queue” (Criar uma fila do Amazon SQS) e Creating keys (Criar chaves).
A política do Amazon SQS definida neste guia não é compatível com o redirecionamento de mensagens diretamente para a mesma fila ou uma fila diferente do Amazon SQS.
Política de chaves de privilégio mínimo para o Amazon SQS
Nesta seção, descreveremos as permissões de privilégio mínimo necessárias no AWS KMS para a chave gerenciada pelo cliente que você usa para criptografar a fila do Amazon SQS. Com essas permissões, você pode limitar o acesso somente às entidades pretendidas e, ao mesmo tempo, implementar o privilégio mínimo. A política principal deve consistir nas seguintes declarações de política, que descrevemos em detalhes abaixo:
Conceder permissões de administrador à chave do AWS KMS
Para criar uma chave do AWS KMS, você precisa fornecer permissões de administrador do AWS KMS ao perfil do IAM que você usa para implantar a chave do AWS KMS. Essas permissões de administrador são definidas na declaração de política do AllowKeyAdminPermissions a seguir. Ao adicionar essa declaração à política de chaves do AWS KMS, substitua <admin-role ARN> pelo nome do recurso da Amazon (ARN) do perfil do IAM usado para implantar a chave do AWS KMS, gerenciar a chave do AWS KMS ou realizar ambas as ações. Essa pode ser o perfil do IAM do pipeline de implantação ou a função de administrador da sua organização no AWS Organizations
{ "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": "*" }
nota
Em uma política de chaves do AWS KMS, o valor do elemento Resource precisa ser *, que significa “essa chave do AWS KMS”. O asterisco (*) identifica a chave do AWS KMS à qual a política de chaves está associada.
Conceder acesso somente leitura aos metadados de chave
Para conceder a outros perfis do IAM acesso somente leitura aos metadados de chave, adicione a declaração AllowReadAccessToKeyMetaData à política de chaves. Por exemplo, a declaração a seguir permite listar todas as chaves do AWS KMS em sua conta para fins de auditoria. Ela concede ao usuário raiz da AWS acesso somente leitura aos metadados de chave. Portanto, qualquer entidade principal do IAM na conta pode ter acesso aos metadados de chave quando as respectivas políticas baseadas em identidade tiverem as permissões listadas na seguinte declaração: kms:Describe*, kms:Get* e kms:List*. Substitua <account-ID> por suas próprias informações.
{ "Sid": "AllowReadAcesssToKeyMetaData", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::<accountID>:root" ] }, "Action": [ "kms:Describe*", "kms:Get*", "kms:List*" ], "Resource": "*" }
Conceder permissões de KMS do Amazon SNS para que este publique mensagens na fila
Para permitir que o tópico do Amazon SNS publique mensagens na fila criptografada do Amazon SQS, adicione a declaração de política AllowSNSToSendToSQS à sua política de chaves. Essa declaração concede ao Amazon SNS permissões para usar a chave do AWS KMS com objetivo de publicar para a fila do Amazon SQS. Substitua <account-ID> por suas próprias informações.
nota
A Condition na declaração limita o acesso somente ao serviço do Amazon SNS na mesma conta da AWS.
{ "Sid": "AllowSNSToSendToSQS", "Effect": "Allow", "Principal": { "Service": [ "sns.amazonaws.com" ] }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceAccount": "<account-id>" } } }
Permitir que os consumidores decodifiquem mensagens da fila
A declaração AllowConsumersToReceiveFromTheQueue a seguir concede ao consumidor de mensagens do Amazon SQS as permissões necessárias para descriptografar as mensagens recebidas da fila criptografada do Amazon SQS. Ao anexar a declaração de política, substitua <consumer's runtime role ARN> pelo ARN da função de tempo de execução do IAM do consumidor da mensagem.
{ "Sid": "AllowConsumersToReceiveFromTheQueue", "Effect": "Allow", "Principal": { "AWS": [ "<consumer's execution role ARN>" ] }, "Action": [ "kms:Decrypt" ], "Resource": "*" }
Política de privilégio mínimo do Amazon SQS
Esta seção mostra as políticas de fila do Amazon SQS de privilégio mínimo para o caso de uso coberto por este guia (por exemplo, do Amazon SNS para o Amazon SQS). A política definida foi projetada para impedir o acesso não intencional usando uma combinação das declarações Deny e Allow. As declarações Allow concedem acesso à entidade ou às entidades pretendidas. As declarações Deny impedem que outras entidades não intencionais acessem a fila do Amazon SQS e exclui a entidade pretendida da condição da política.
A política do Amazon SQS inclui as seguintes declarações, que descrevemos em detalhes abaixo:
Restringir as permissões de gerenciamento do Amazon SQS
A declaração de política RestrictAdminQueueActions a seguir restringe as permissões de gerenciamento do Amazon SQS somente ao perfil ou aos perfis do IAM que você usa para implantar a fila, gerenciar a fila ou realizar ambas as atividades. Substitua <placeholder values> por suas próprias informações. Especifique o ARN do perfil do IAM usado para implantar a fila do Amazon SQS, bem como os ARNs de qualquer função de administrador que deva ter permissões de gerenciamento do Amazon SQS.
{ "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>" ] } } }
Restringir as ações de fila do Amazon SQS da organização especificada
Para ajudar a proteger seus recursos do Amazon SQS contra acesso externo (acesso por uma entidade fora da sua organização da AWS), use a instrução a seguir. Essa declaração limita o acesso à fila do Amazon SQS à organização que você especifica na Condition. Substitua <SQS queue ARN> pelo ARN do perfil do IAM usado para implantar a fila do Amazon SQS, e <org-id>, pelo ID da organização.
{ "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>" ] } } }
Conceder permissões do Amazon SQS aos consumidores
Para receber mensagens da fila do Amazon SQS, você precisa fornecer ao consumidor da mensagem as permissões necessárias. A declaração de política a seguir concede ao consumidor, especificado por você, as permissões necessárias para consumir mensagens da fila do Amazon SQS. Ao adicionar a declaração à política do Amazon SQS, substitua <consumer's IAM runtime role ARN> pelo ARN da função de tempo de execução do IAM usada pelo consumidor, e <SQS queue ARN> pelo ARN do perfil do IAM usado para implantar a fila do Amazon SQS.
{ "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>" }
Para evitar que outras entidades recebam mensagens da fila do Amazon SQS, adicione a declaração DenyOtherConsumersFromReceiving à política de filas do Amazon SQS. Essa declaração restringe o consumo de mensagens ao consumidor que você especificar, permitindo que nenhum outro consumidor tenha acesso, mesmo quando suas permissões de identidade concederem acesso. Substitua <SQS queue ARN> e <consumer’s runtime role ARN> por suas próprias informações.
{ "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>" } } }
Aplicar a criptografia em trânsito
A declaração de política do DenyUnsecureTransport a seguir obriga os consumidores e produtores a usarem canais seguros (conexões TLS) para enviar e receber mensagens da fila do Amazon SQS. Substitua <SQS queue ARN> pelo ARN do perfil do IAM usado para implantar a fila do Amazon SQS.
{ "Sid": "DenyUnsecureTransport", "Effect": "Deny", "Principal": { "AWS": "*" }, "Action": [ "sqs:ReceiveMessage", "sqs:SendMessage" ], "Resource": "<SQS queue ARN>", "Condition": { "Bool": { "aws:SecureTransport": "false" } } }
Restringir a transmissão de mensagens para um tópico específico do Amazon SNS
Veja a seguir um exemplo de declaração de política que permite ao tópico do Amazon SNS enviar mensagem à fila do Amazon SQS. Substitua <SQS queue ARN> pelo ARN do perfil do IAM usado para implantar a fila do Amazon SQS, e <SNS topic ARN> pelo ARN do tópico do Amazon SNS.
{ "Sid": "AllowSNSToSendToTheQueue", "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Action": "sqs:SendMessage", "Resource": "<SQS queue ARN>", "Condition": { "ArnLike": { "aws:SourceArn": "<SNS topic ARN>" } } }
A declaração de política DenyAllProducersExceptSNSFromSending a seguir impede que outros produtores enviem mensagens à fila. Substitua <SQS] queue ARN> e <SNS topic ARN> por suas próprias informações.
{ "Sid": "DenyAllProducersExceptSNSFromSending", "Effect": "Deny", "Principal": { "AWS": "*" }, "Action": "sqs:SendMessage", "Resource": "<SQS queue ARN>", "Condition": { "ArnNotLike": { "aws:SourceArn": "<SNS topic ARN>" } } }
(Opcional) Restringir o recebimento de mensagens a um endpoint da VPC específico
Para restringir o recebimento de mensagens apenas a determinado endpoint da VPC<SQS queue ARN> pelo ARN do perfil do IAM usado para implantar a fila do Amazon SQS; e <vpce_id> pelo ID do endpoint da VPC.
{ "Sid": "DenyReceivingIfNotThroughVPCE", "Effect": "Deny", "Principal": "*", "Action": [ "sqs:ReceiveMessage" ], "Resource": "<SQS queue ARN>", "Condition": { "StringNotEquals": { "aws:sourceVpce": "<vpce id>" } } }
Declarações de política do Amazon SQS para a fila de mensagens não entregues
Adicione as seguintes declarações de política, identificadas pelo ID da declaração, à política de acesso da fila de mensagens não entregues (DLQ):
-
RestrictAdminQueueActions -
DenyQueueActionsOutsideOrg -
AllowConsumersToReceiveFromTheQueue -
DenyOtherConsumersFromReceiving -
DenyUnsecureTransport
Além de adicionar as declarações de política anteriores à política de acesso da DLQ, você também deve adicionar uma declaração para restringir a transmissão de mensagens às filas do Amazon SQS, conforme descrito na seção a seguir.
Restringir a transmissão de mensagens para filas do Amazon SQS
Para restringir o acesso somente às filas do Amazon SQS da mesma conta, adicione a declaração de política DenyAnyProducersExceptSQS a seguir à política de DLQs. Essa declaração não limita a transmissão de mensagens para uma fila específica porque é necessário implantar a DLQ antes de criar a fila principal. Por isso, você não saberá o ARN do Amazon SQS ao criar a DLQ. Se você precisar limitar o acesso a apenas uma fila do Amazon SQS, modifique aws:SourceArn na Condition com o ARN da sua fila de origem do Amazon SQS quando souber.
{ "Sid": "DenyAnyProducersExceptSQS", "Effect": "Deny", "Principal": { "AWS": "*" }, "Action": "sqs:SendMessage", "Resource": "<SQS DLQ ARN>", "Condition": { "ArnNotLike": { "aws:SourceArn": "arn:aws:sqs:<region>:<account-id>:*" } } }
Importante
As políticas de fila do Amazon SQS definidas neste guia não restringem à ação sqs:PurgeQueue para determinado perfil ou perfis do IAM. A ação sqs:PurgeQueue permite que você exclua todas as mensagens na fila do Amazon SQS. Também é possível usar essa ação para fazer alterações no formato da mensagem sem substituir a fila do Amazon SQS. Ao depurar uma aplicação, você pode limpar a fila do Amazon SQS para remover mensagens possivelmente errôneas. Ao testar a aplicação, você pode direcionar um alto volume de mensagens pela fila do Amazon SQS e, depois, limpar a fila para começar do zero antes de entrar em produção. O motivo para não restringir essa ação a determinada função é que essa função pode não ser conhecida ao implantar a fila do Amazon SQS. Você precisará adicionar essa permissão à política baseada em identidades da função para poder limpar a fila.
Prevenção do problema de adjunto confuso entre serviços
O problema de adjunto confuso é um problema de segurança em que uma entidade que não tem permissão para executar uma ação pode coagir outra entidade mais privilegiada a executá-la. Para evitar isso, a AWS fornece ferramentas que ajudam a proteger sua conta caso você conceda acesso aos recursos na sua conta a terceiros (conhecido como entre contas) ou a outros serviços da AWS (conhecido como entre serviços). As declarações de política nesta seção podem ajudar a evitar o problema de adjunto confuso entre serviços.
A personificação entre serviços pode ocorrer quando um serviço (o serviço de chamada) chama outro serviço (o serviço chamado). O serviço de chamada pode ser manipulado para que ele use as respectivas permissões com o objetivo de acessar os recursos de outro cliente de uma forma que, normalmente, ele não deveria ter permissão. Para ajudar a combater esse problema, as políticas baseadas em recursos definidas nesta publicação usam as chaves de contexto de condição globais do IAM aws:SourceArn, aws:SourceAccount e aws:PrincipalOrgID. Isso limita as permissões que um serviço tem para determinado recurso, determinada conta ou organização específica no AWS Organizations.
Usar o IAM Access Analyzer para analisar o acesso entre contas
É possível usar o AWS IAM Access Analyzer para revisar suas políticas de fila do Amazon SQS as políticas de chave do AWS KMS e alertar você quando uma fila do Amazon SQS ou uma chave do AWS KMS concede acesso a uma entidade externa. O IAM Access Analyzer ajuda a identificar os recursos da sua organização e as contas que são compartilhadas com uma entidade fora da zona de confiança. Essa zona de confiança pode ser uma conta da AWS ou a organização no AWS Organizations que você especifica ao habilitar o IAM Access Analyzer.
O IAM Access Analyzer identifica recursos compartilhados com entidades externas usando raciocínio baseado em lógica para analisar as políticas baseadas em recurso no ambiente da AWS. Para cada instância de um recurso compartilhado fora de sua zona de confiança, o Access Analyzer gera uma descoberta. As descobertas incluem informações sobre o acesso e a entidade principal externa a que é concedido. Analise as descobertas para determinar se o acesso é pretendido e seguro ou se não é intencional e representa um risco à segurança. Para qualquer acesso não intencional, avalie a política afetada e corrija-a. Consulte esta publicação do blog
Para obter mais informações sobre o AWS IAM Access Analyzer, consulte a documentação do AWS IAM Access Analyzer.