Data perimeter com RCPs e condições de Org
Lição 19 · Módulo 5 — Especialista
O que é um data perimeter
Um data perimeter é um conjunto de guardrails preventivos que garante uma frase simples:
| Perímetro | Pergunta | Chaves típicas | Onde aplicar |
|---|---|---|---|
| Identidade | Quem acessa meus recursos é da minha org? | aws:PrincipalOrgID, aws:PrincipalIsAWSService | RCP, resource policies |
| Recurso | Minhas identidades só acessam recursos da minha org? | aws:ResourceOrgID | SCP, VPC endpoint policies |
| Rede | A request vem da minha rede? | aws:SourceIp, aws:SourceVpc, aws:ViaAWSService | SCP, RCP, resource policies |
RCP vs SCP
- SCP limita o que os principais das suas contas podem fazer, em qualquer recurso. Ideal para o perímetro de recurso: "minhas roles não escrevem em bucket de fora".
- RCP (Resource Control Policy) limita o que qualquer principal, inclusive de fora da org, pode fazer nos recursos das suas contas. Ideal para o perímetro de identidade: "ninguém de fora lê meus buckets, mesmo que alguém erre uma bucket policy".
Como SCPs, RCPs nunca concedem permissão; só definem o teto. Valem só para serviços suportados (S3, KMS, STS, SQS, Secrets Manager e uma lista que cresce; confira a documentação atual).
RCP de perímetro de identidade
Baseada nos exemplos oficiais de data perimeter da AWS:
12345678910111213141516
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceOrgIdentities", "Effect": "Deny", "Principal": "*", "Action": ["s3:*", "kms:*", "sqs:*", "secretsmanager:*", "sts:AssumeRole"], "Resource": "*", "Condition": { "StringNotEqualsIfExists": { "aws:PrincipalOrgID": "o-exemplo" }, "BoolIfExists": { "aws:PrincipalIsAWSService": "false" } } } ]} Leia as duas condições juntas (AND). O Deny se aplica quando:
- o principal não é da org
o-exemplo(ou não tem org), e - o principal não é um service principal da AWS.
| Quem chama | PrincipalOrgID | PrincipalIsAWSService | Deny? |
|---|---|---|---|
| Role da sua org | o-exemplo → falso | false → verdadeiro | Não |
| Role de conta externa | outro/ausente → verdadeiro | false → verdadeiro | Sim |
cloudtrail.amazonaws.com | ausente → verdadeiro | true → falso | Não |
E o confused deputy com service principals?
A RCP acima libera todo service principal. Para fechar a brecha da lição 18, adicione um segundo statement exigindo que o serviço aja em nome de um recurso da sua org:
123456789101112
{ "Sid": "EnforceConfusedDeputyProtection", "Effect": "Deny", "Principal": "*", "Action": ["s3:*", "kms:*", "sqs:*", "secretsmanager:*"], "Resource": "*", "Condition": { "StringNotEqualsIfExists": { "aws:SourceOrgID": "o-exemplo" }, "Null": { "aws:SourceAccount": "false" }, "Bool": { "aws:PrincipalIsAWSService": "true" } }}
Só se aplica a service principals (Bool: true) que trazem um recurso de origem
(Null: false), e nega se esse recurso não for da sua org.
Condições de Org em key policies
O padrão Principal: "*" + aws:PrincipalOrgPaths numa key policy é
um Allow por perímetro. Funciona bem para roles e usuários das OUs, mas:
-
aws:PrincipalOrgPathsé multivalorada: useForAnyValue:StringLikecom o caminho completo (o-xxx/r-xxx/ou-xxx/.../*). A lição 20 explica o porquê. -
aws:PrincipalOrgIDé single-valued: useStringEquals, semForAnyValue. - Não dependa desse Allow para serviços agindo por você. Cite a SLR ou o service principal explicitamente, e em cross-account use grant (lição 17).
Como implantar sem quebrar tudo
- Comece por uma conta de teste, depois uma OU pequena e, por último, a raiz.
- Monitore
AccessDeniedno CloudTrail antes e depois de cada etapa. - Mapeie integrações de terceiros (SaaS, parceiros) que precisam de exceção.
- Use IAM Access Analyzer (external access) para descobrir quem já acessa de fora.
Teste rápido
Você aplica a RCP de perímetro SEM o BoolIfExists de PrincipalIsAWSService. O que quebra primeiro?
Uma RCP nega kms:* para quem não é da org. A SLR do Auto Scaling de uma conta da org usando a CMK é afetada?
Resumo
Perímetro de identidade com RCP, perímetro de recurso com SCP e perímetro de rede com
ambos. Sempre trate service principals à parte (IfExists +
PrincipalIsAWSService) e proteja contra confused deputy com
aws:SourceOrgID. Implante de baixo para cima, observando o CloudTrail.
Referência Well-Architected
Alinhada com Define permission guardrails for your organization e Share resources securely within your organization.
Referências
Terminou esta lição?
Seu progresso fica salvo apenas neste navegador.