O problema de "confused deputy"
O problema do substituto confuso é um problema de segurança em que uma entidade que não tem permissão para executar uma ação pode coagir uma entidade mais privilegiada a executar a ação. Para evitar isso, a AWS fornece ferramentas que ajudam você a proteger sua conta se você fornecer acesso aos recursos na sua conta a terceiros (conhecido como entre contas) ou a outros serviços da AWS (conhecido como entre serviços).
Às vezes, poderá ser necessário conceder acesso aos recursos da AWS a terceiros (delegar acesso). Por exemplo, você decide contratar uma empresa terceirizada chamada Example Corp para monitorar sua Conta da AWS e ajudar a otimizar os custos. Para rastrear seus gastos diários, a Example Corp precisa de acesso aos seus recursos da AWS. A Example Corp também monitora muitas outras Contas da AWS para outros clientes. É possível usar um perfil do IAM para estabelecer uma relação de confiança entre sua Conta da AWS e a conta da Example Corp. Um aspecto importante desse cenário é o ID externo, um identificador opcional que você pode usar em uma política de confiança do perfil do IAM para designar quem pode assumir ao perfil. A função principal do ID externo é abordar e impedir o problema de substituto confuso.
Alguns serviços da AWS (serviços de chamada) usam a entidade principal de serviços da AWS para acessar recursos da AWS de outros serviços da AWS (serviços chamados). Em algumas dessas interações de serviços, você pode configurar serviços de chamada para se comunicarem com os recursos de um serviço chamado em outra Conta da AWS. Um exemplo disso é configurar o AWS CloudTrail para gravar em um bucket central do Amazon S3 localizado em outra Conta da AWS. O serviço de chamada CloudTrail recebe acesso ao seu bucket do S3 usando a política do bucket do S3 ao adicionar uma instrução de permissão para cloudtrail.amazonaws.com.
Quando uma entidade principal de serviço da AWS de um serviço de chamada está acessando um recurso de um serviço chamado, a política de recursos do serviço chamado está autorizando somente a entidade principal do serviço AWS, e não o ator que configurou o serviço de chamada. Por exemplo, um bucket do Amazon S3 que confia na entidade principal do serviço do CloudTrail sem condições pode receber logs do CloudTrail das Contas da AWS configuradas por um administrador confiável, mas também pode receber logs do CloudTrail de um ator não autorizado em sua Conta da AWS, caso ele saiba o nome do bucket do Amazon S3.
O problema de confused deputy surge quando um ator usa a confiança de uma entidade principal de um serviço da AWS para obter acesso a recursos aos quais não deveria ter acesso.
Prevenção de substituto confuso entre contas
O diagrama a seguir ilustra o problema do substituto confuso entre contas.
![A descrição de um problema confused deputy.](images/confuseddeputyproblem2.png)
Este cenário supõe o seguinte:
-
AWS1 é a sua Conta da AWS.
-
AWS1:ExampleRole é uma função em sua conta. Esta política de confiança da função confia na Example Corp especificando a conta da AWS da Example Corp como a conta que pode assumir a função.
Veja o que acontece:
-
Ao começar a usar o serviço da Exemplo Corp, você fornece o ARN AWS1:ExampleRole à Exemplo Corp.
-
A Example Corp usa esse ARN de perfil para obter credenciais de segurança temporárias para acessar recursos na sua Conta da AWS. Dessa forma, confie na Example Corp como um "substituto" que pode agir em seu nome.
-
Outro cliente da AWS também começa a usar os serviços da Exemplo Corp e também fornece o ARN AWS1:ExampleRole para a Exemplo Corp usar. Provavelmente, o outro cliente soube ou adivinhou o AWS1:ExampleRole, que não é um segredo.
-
Quando o outro cliente pede à Exemplo Corp que acesse os recursos da AWS (o que ele afirma ser) em sua conta, a Exemplo Corp usa AWS1:ExampleRole para acessar os recursos da sua conta.
Dessa forma, o outro cliente pode obter acesso não autorizado aos seus recursos. Como esse outro cliente foi capaz de burlar a Example Corp para agir involuntariamente em seus recursos, a Example Corp agora é um "confused deputy."
A Example Corp pode abordar o problema do substituto confuso exigindo que você inclua a verificação de condição ExternalId
na política de confiança da função. A Example Corp gera um único valor de ExternalId
para cada cliente e usa esse valor em sua solicitação para assumir a função. O valor de ExternalId
deve ser exclusivo entre os clientes da Example Corp e controlado pela Example Corp, não por seus clientes. É por isso que ele é fornecido pela Example Corp e não é criado por você. Isso impede que a Example Corp seja um substituto confuso e conceda acesso a recursos da AWS de outra conta.
Em nosso cenário, imagine que seu identificador exclusivo da Example Corp seja 12345 e que o identificador do outro cliente seja 67890. Esses identificadores são simplificados para esse cenário. Em geral, esses identificadores são GUIDs. Supondo que esses identificadores sejam exclusivos entre os clientes da Example Corp, eles são valores confidenciais próprios para o ID externo.
A Example Corp atribui o valor do ID externo "12345" a você. É necessário adicionar um elemento Condition
à política de confiança da função que exige que o valor do sts:ExternalId
seja 12345, como:
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "
Example Corp's AWS Account ID
" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "12345" } } } }
O elemento Condition (Condição) dessa política só permite que a Example Corp assuma a função quando a chamada de API AssumeRole incluir o valor do ID externo 12345. A Example Corp garante que sempre que assumir uma função em nome de um cliente, incluirá o valor do ID externo desse cliente em uma chamada AssumeRole. Mesmo que outro cliente forneça seu ARN à Example Corp, ele não poderá controlar o ID externo que a Example Corp inclui em sua solicitação para a AWS. Isso ajuda a evitar que um cliente não autorizado tenha acesso aos seus recursos.
O diagrama a seguir ilustra isso.
![Como mitigar um problema confused deputy.](images/confuseddeputymitigation2.png)
-
Como antes, ao começar a usar o serviço da Exemplo Corp, você fornece o ARN AWS1:ExampleRole à Exemplo Corp.
-
Quando a Exemplo Corp usa esse ARN de perfil para assumir a função AWS1:ExampleRole, ela inclui o ID externo (12345) na chamada de API AssumeRole. O ID externo corresponde à política de confiança da perfil e, portanto, a chamada de API AssumeRole tem êxito, e a Example Corp obtém credenciais de segurança temporárias para acessar recursos na sua Conta da AWS.
-
Outro cliente da AWS também começa a usar os serviços da Exemplo Corp e, assim como antes, esse cliente também fornece o ARN AWS1:ExampleRole para a Exemplo Corp usar.
-
Mas, desta vez, quando a Exemplo Corp tenta assumir a função AWS1:ExampleRole, ela fornece o ID externo associado a outro cliente (67890). O outro cliente não tem como alterar isso. A Example Corp faz isso porque a solicitação para usar a função veio de outro cliente, portanto, 67890 indica a circunstância em que a Example Corp está atuando. Como você adicionou uma condição com seu próprio ID externo (12345) à política de confiança de AWS1:ExampleRole, a chamada de API AssumeRole não vai funcionar. O outro cliente será impedido de obter o acesso não autorizado aos recursos na sua conta (indicado pelo "X" vermelho no diagrama).
O ID externo ajuda a prevenir que qualquer outro cliente engane a Example Corp a acessar seus recursos involuntariamente.
Prevenção do problema do substituto confuso entre serviços
O diagrama a seguir demonstra o problema de confused deputy entre serviços usando o exemplo de interação entre o CloudTrail e o Amazon S3, em que um ator não autorizado grava logs do CloudTrail em um bucket do Amazon S3 ao qual não está autorizado a ter acesso.
![Um ator não autorizado recebe acesso a um bucket do Amazon S3 em outra conta usando a entidade principal do serviço do CloudTrail.](images/cross-service-confused-deputy1.png)
Para ajudar a evitar que um ator não autorizado use a confiança de uma entidade principal da AWS para obter acesso aos seus recursos, as entidades principais de serviços da AWS incluem informações sobre o recurso da AWS, a Conta da AWS e a organização da AWS em nome dos quais estão agindo.
Essas informações estão disponíveis em valores-chave de condições globais que podem ser usados em uma política de recursos ou política de controle de recursos para solicitações feitas pelas entidades principais de serviços da AWS. Recomendamos usar aws:SourceArn, aws:SourceAccount, aws:SourceAccount ou aws:SourceOrgPaths nas políticas de recursos sempre que uma entidade principal de serviço da AWS receber permissão para acessar um dos seus recursos. Essas chaves de condição permitem que você teste nas políticas de recursos ou nas políticas de controle de recursos se as entidades principais de serviços da AWS que acessam os recursos estão fazendo isso em nome dos recursos da AWS, das Contas da AWS ou do AWS Organizations que você espera.
-
Use
aws:SourceArn
para permitir que uma entidade principal de serviço da AWS acesse os recursos em nome de um recurso específico, como uma trilha do AWS CloudTrail específica ou uma frota do AppStream. -
Use
aws:SourceAccount
para permitir que uma entidade principal de serviço da AWS acesse os recursos em nome de uma Conta da AWS específica. -
Use
aws:SourceOrgID
para permitir que uma entidade principal de serviço da AWS acesse os recursos em nome de uma AWS Organizations específica. -
Use
aws:SourceOrgPaths
para permitir que uma entidade principal de serviço da AWS acesse os recursos em nome de um caminho do AWS Organizations específico.
O diagrama a seguir demonstra o cenário de confused deputy entre serviços quando um recurso é configurado com a chave de contexto de condição global aws:SourceAccount
, e um ator não autorizado de outra conta tenta acessar recursos da AWS aos quais não deveria ter acesso.
![Um ator não autorizado tem o acesso negado a um bucket do Amazon S3 em outra conta usando a entidade principal do serviço do CloudTrail.](images/cross-service-confused-deputy2.png)
Usar as chaves de condição global aws:SourceArn
, aws:SourceAccount
, aws:SourceOrgID
e aws:SourceOrgPaths
em uma política ajuda a garantir que as entidades principais de serviços estejam acessando os recursos em seu nome. Recomendamos usar essas chaves de condição sempre que o acesso a um de seus recursos for concedido a uma entidade principal de serviço da AWS.
nota
Algumas interações de AWS service (Serviço da AWS) têm controles adicionais para ajudar a proteger contra problemas de confused deputy entre serviços que testam o acesso de usuários a um recurso. Por exemplo, quando uma concessão de chave do KMS é emitida para um AWS service (Serviço da AWS), o AWS KMS usa o contexto de criptografia associado ao recurso e a concessão de chave para ajudar a proteger contra problemas de confused deputy entre serviços.
Consulte a documentação dos serviços que você usa para obter mais informações sobre os mecanismos específicos dos serviços que podem ajudar a evitar os riscos de confused deputy entre serviços e se aws:SourceArn
, aws:SourceAccount
, aws:SourceOrgID
e aws:SourceOrgPaths
são compatíveis.
Proteção contra confused deputy entre serviços com políticas baseadas em recursos
O exemplo de política a seguir concede à entidade principal de serviço cloudtrail.amazonaws.com
acesso ao bucket do Amazon S3, arn:aws:s3:::amzn-s3-demo-bucket1, somente quando a entidade principal de serviço está agindo em nome da Conta da AWS 111122223333.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "CloudTrailAclCheck", "Effect": "Allow", "Principal": {"Service": "cloudtrail.amazonaws.com"}, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::
amzn-s3-demo-bucket1
", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333" } } }, { "Sid": "AWSCloudTrailWrite", "Effect": "Allow", "Principal": {"Service": "cloudtrail.amazonaws.com"}, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/[optionalPrefix]/Logs/myAccountID/*
", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333" } } } ] }
Esse exemplo de política de bucket concede à entidade principal de serviço appstream.amazonaws.com
acesso ao script do PowerShell examplefile.psh em s3://amzn-s3-demo-bucket2 somente quando ele está agindo em nome da frota especificada do Amazon AppStream, especificando o ARN da frota com aws:SourceArn
.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "appstream.amazonaws.com" ] }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::
amzn-s3-demo-bucket2/examplefile.psh
", "Condition": { "ArnEquals": { "aws:SourceArn": "arn:aws:appstream:us-east-1:111122223333
:fleet/ExampleFleetName
" } } } ] }
Proteção contra confused deputy entre serviços com políticas de controle de recursos
Você pode usar políticas de controle de recursos (RCP) para aplicar controles contra confused deputy entre serviços aos recursos de Serviços da AWS compatíveis. As RCPs permitem que você aplique de forma centralizada controles contra confused deputy entre serviços em seus recursos. Você pode usar chaves de condição como aws:SourceOrgId
e aws:SourceOrgPaths
com RCPs anexadas ao AWS Organizations, a unidades organizacionais (OU) ou a Contas da AWS em sua organização sem adicionar instruções a políticas específicas baseadas em recursos. Para obter mais informações sobre RCPs e serviços compatíveis, consulte Resource control policies (RCPs) no Guia do usuário do AWS Organizations.
O exemplo a seguir de RCP nega às entidades principais de serviço da AWS o acesso aos buckets do Amazon S3 nas contas de membros quando aws:SourceOrgID
não é igual a o-ExampleOrg. Uma permissão correspondente deve estar presente na política baseada em recursos do bucket do Amazon S3 para permitir as entidades principais de serviço da AWS com um SourceOrgID igual a o-ExampleOrg.S
Essa política aplica o controle somente nas solicitações das entidades principais de serviço ("Bool":
{"aws:PrincipalIsAWSService": "true"}
) que tenham a chave aws:SourceAccount
presente ("Null": {"aws:SourceAccount":
"false"}
), de modo que as integrações de serviços que não exijam o uso da chave de condição e as chamadas pelas entidades principais não sejam afetadas. Se a chave de condição aws:SourceAccount
estiver presente no contexto da solicitação, a condição Null será avaliada como true, fazendo com que aws:SourceOrgID
seja aplicada. Você pode usar aws:SourceAccount
em vez de aws:SourceOrgID
no operador de condição Null para que o controle ainda seja aplicado caso a solicitação seja originada de uma conta que não pertença a uma organização.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "RCPEnforceConfusedDeputyProtectionForS3", "Effect": "Deny", "Principal": "*", "Action": [ "s3:*" ], "Resource": "*", "Condition": { "StringNotEqualsIfExists": { "aws:SourceOrgID": "
o-ExampleOrg
" }, "Null": { "aws:SourceAccount": "false" }, "Bool": { "aws:PrincipalIsAWSService": "true" } } } ] }