O documento discute como usar o AWS Identity and Access Management (IAM) de forma efetiva para refinar permissões e garantir o princípio do menor privilégio. Ele apresenta conceitos-chave do IAM como usuários, grupos, políticas e roles, e fornece exemplos práticos de como aplicá-los para controlar o acesso a recursos da AWS.
Boas práticas de programação com Object Calisthenics
Seja um ninja em AWS IAM
1. Seja um Ninja em AWS IAM
Claudia Charro, Arquiteta de Soluções
2. O que esperar desta sessão?
• Conhecer mais as capacidades do AWS Identity and Access
Management (IAM).
• Entender como utilizá-lo para refinar as permissões aos seus
recursos e garantir o princípio do menor privilégio.
• Cenários práticos.
4. A linguagem da Policy
• Especificação: Como são definidas as políticas de acesso.
• Aplicação: Como são avaliadas as políticas de acesso.
5. Cenário 1
O desenvolvedor Bob precisa de permissões para
trabalhar com instâncias EC2 na conta de desenvolvimento.
A empresa definiu que, por questões de custo, em
desenvolvimento somente podem ser usadas instâncias das
famílias t1.*, t2.*, m3.*.
Para isso, ele terá acesso total às funções sobre
Amazon EC2 (start, stop, describe etc.), mas só poderá lançar
instâncias das famílias t1.*, t2.*, m3.*.
6. {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:*",
"Resource": "*"
},
{
"Effect": "Deny",
"Action": "ec2:RunInstances",
"Resource": "*",
"Condition": {
"StringNotLike": {
"ec2:InstanceType": [
"t1.*",
"t2.*",
"m3.*"
]
}
}
}
]
}
Que não tenham o valor
InstanceType = T1, T2 ou
M3.
Para todos os recursos
Nega permissão em
EC2:RunInstances
Policy
7.
8. Qual foi o resultado?
Por que não
foi como
esperado?
… Mais a frente saberemos o motivo
9. Princípios da especificação da Policy
• Documento JSON.
{
"Statement":[{
"Effect":”Allow/Deny",
"Principal":”ARN ou Conta",
"Action":”Serviço:ações",
"Resource":”Amazon Resource Name
ARN",
"Condition":{
"condition":{
"key":"value" }
}
}
]
}
Permitir ou negar
10. Aplicação das Policies
DENY
Decisão final =
”NEGADO”
Sim
ALLOW
Decisão final =
“PERMITIDO”
Si
m
Não
Há
ALLOW ?
4
DENY
Decisão começa
com tudo negado
por padrão
1
Avaliar todas
as policies
aplicáveis
2
Não DENY
Decisão final =
“NEGADO”
5
Há DENY
Explícito?
3
11. Princípios da especificação da Policy
{
"Statement":[{
"Effect":”Allow/Deny",
"Principal":”ARN ou Conta",
"Action":”Serviço:ações",
"Resource":”Amazon Resource Name
ARN",
"Condition":{
"condition":{
"key":"value" }
}
}
]
}
Quem recebe a
permissão.
Só existe nas
policies baseadas
em recursos.
12. Principal
• Entidade que recebe as permissões.
<!-- Everyone (anonymous users) -->
"Principal":"AWS":"*"
<!–- Conta específica -->
"Principal":{"AWS":"arn:aws:iam::123456789012:root" }
"Principal":{"AWS":"123456789012"}
<!–- Um usuário do IAM -->
"Principal":"AWS":"arn:aws:iam::123456789012:user/username"
<!–- Acesso federado -->
"Principal":{"Federated":"www.amazon.com"}
"Principal": { "Federated": "arn:aws:iam::123456789012:saml-provider/provider-name" }
<!-- Specific service -->
"Principal":{"Service":"ec2.amazonaws.com"}
14. Princípios da especificação da Policy
{
"Statement":[{
"Effect":”Allow/Deny",
"Principal":”ARN ou Conta",
"Action":”Serviço:ações",
"Resource":”Amazon Resource Name
ARN",
"Condition":{
"condition":{
"key":"value" }
}
}
]
}
Quais serviços e
ações estão no
escopo da policy.
15. Action
• Escopo dos serviços e ações a que se refere a policy.
<!-- EC2 -->
"Action":"ec2:StartInstances"
<!-- IAM -->
"Action":"iam:CreateUser"
<!–- Amazon S3 -->
"Action":"s3:GetObject"
<!-– Múltiplos valores -->
"Action":["sqs:SendMessage","sqs:ReceiveMessage"]
<-- Wildcards (* ou ?) no nome da ação ->
"Action":"iam:*AccessKey*"
16. Princípios da especificação da Policy
{
"Statement":[{
"Effect":”Allow/Deny",
"Principal":”ARN ou Conta",
"Action":”Serviço:ações",
"Resource":”Amazon Resource Name ARN",
"Condition":{
"condition":{
"key":"value" }
}
}
]
}
Para quais
recursos valem as
permissões
17. Resource
• Recursos sobre os quais se aplicam as policies.
<-- Amazon SQS queue-->
"Resource":"arn:aws:sqs:us-west-2:123456789012:queue1"
<-- Várias tabelas do Amazon DynamoDB -->
"Resource":["arn:aws:dynamodb:us-west-2:123456789012:table/books_table",
"arn:aws:dynamodb:us-west-2:123456789012:table/magazines_table"]
<-- Todas as instâncias EC2 para em uma conta em uma região -->
"Resource": "arn:aws:ec2:us-east-1:123456789012:instance/*"
18. Princípios da especificação da Policy
{
"Statement":[{
"Effect":”Allow/Deny",
"Principal":”ARN ou Conta",
"Action":”Serviço:ações",
"Resource":”Amazon Resource Name ARN",
"Condition":{
"condition":{
"key":"value" }
}
}
]
}
Condições
restringem as
permissões
19. Condição
Permite um usuário acessar os recursos sob as condições:
• Data após as 11:00 da manhã de 01 de Janeiro de 2017
E
• Data antes das 3:00 da tarde de 31 de Dezembro de 2017
E
• A requisição foi originada de um IP pertencente aos ranges IP 192.0.2.0 /24 OU 203.0.113.0
/24.
"Condition" : {
"DateGreaterThan" : {"aws:CurrentTime" : "2017-01-01T11:00:00Z"},
"DateLessThan": {"aws:CurrentTime" : "2017-12-31T15:00:00Z"},
"IpAddress" : {"aws:SourceIp" : ["192.0.2.0/24", "203.0.113.0/24"]}
}
E
OU
24. Outra conta
Acct ID: 222222222222
ReadyOnlyCrossAccount { "Statement": [
"Effect": "Allow",
"Action":[
"s3:Get*",
"s3:List*",
”cloudtrail:Get*",
”cloudtrail:List*”,
...entre outras
],
"Resource": "*"
}
]
}
Conta Desenv.
Acct ID: 111111111111
Autenticado como
user_bob
Assume role
ReadyOnlyCrossAccount
Troca para a conta 2 no
console da AWS
{ "Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::222222222222:role/ReadyOnlyRoleCrossAccount"
}
]
}
Policy atrelada ao
usuário para
permitir que ele
assuma a role
ReadyRoleCrossAcc
ount na conta de
produção
Permissões da role
ReadyOnyCrossAccount
STS
Bob
Mudar de Console como user_bob
arn:aws:iam::111111111111:user/user_bob
Acesso entre contas (cross-account role)
25. {
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Principal": {
"AWS": ["arn:aws:iam::111111111111:root"]
}
}]
}
Valor default – Trust Relationship
Permitir acesso entre contas para um
usuário do IAM
26. {
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Principal": {
"AWS": ["arn:aws:iam::111111111111:user/user_bob"]
}
}]
}
Modifica para especificar o usuário
exato que irá assumir a role.
Permitir acesso condicional entre contas
para um usuário do IAM
27. {
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Principal": {
"Service": "ec2.amazonaws.com”
}
}]
}
Modifica para especificar um serviço
que irá assumir a role.
Permitir acesso condicional entre contas
para um serviço
28. Cenário 2
Bob, o desenvolvedor, trabalha em uma empresa
parceira da AWS.
Para um projeto novo, Bob precisa de acesso
somente leitura à conta de seu cliente para fazer um
diagnóstico sobre os recursos que existem nesta conta.
31. Cenário 3
Bob e todos os desenvolvedores podem trabalhar
com instâncias Amazon EC2 na conta de
desenvolvimento.
Porém, Bob sendo desenvolvedor só pode trabalhar
sobre instâncias que foram criadas para ele, ou seja,
com o Bob como owner.
32. {
"Version": "2012-10-17",
"Statement": [{
"Sid": "THISLIMITSACCESSTOOWNINSTANCES",
"Effect": "Allow",
"Action": ["ec2:RebootInstances",
"ec2:StartInstances",
"ec2:StopInstances",
"ec2:TerminateInstances"
],
"Resource": "arn:aws:ec2:*:111111111111:instance/*",
"Condition": {
"StringEquals": {
"ec2:ResourceTag/Owner": "${aws:username}"
}
}
}
]
}
Somente permite se
atender à condição
Especifica a chave (usando
a tag) e o valor (variável)
Restringindo acesso às instâncias
Amazon EC2
33.
34. Retomando o cenário 1
O desenvolvedor Bob precisa de permissões para
trabalhar com instâncias Amazon EC2 na conta de
desenvolvimento.
A empresa definiu que, por questões de custo, em
desenvolvimento somente podem ser usadas
instâncias das famílias t1.*, t2.*, m3.*.
Para isso, ele terá acesso total às
funcionalidades sobre Amazon EC2 (start, stop,
describe etc.), mas só poderá lançar instâncias das
famílias t1.*, t2.*, m3.*.
35. {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:*",
"Resource": "*"
},
{
"Effect": "Deny",
"Action": "ec2:RunInstances",
"Resource": "*",
"Condition": {
"StringNotLike": {
"ec2:InstanceType": [
"t1.*",
"t2.*",
"m3.*"
]
}
}
}
]
}
Que não tenham o valor InstanceType
= T1, T2 ou M3.
Para todos os recursos
Nega permissão em EC2:RunInstances
Retomando o cenário 1
36. {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:*",
"Resource": "*"
},
{
"Effect": "Deny",
"Action": "ec2:RunInstances",
"Resource": "arn:aws:ec2:*:012345678901:instance/*",
"Condition": {
"StringNotLikeIfExists": {
"ec2:InstanceType": [
"t1.*", "t2.*", "m3.*"
]
}
}
}
]
}
Somente se aplica às instâncias e com
a condição da chave existir.
Explicitamente nega o acesso a
RunInstances, para todas as regiões e
recursos se a condição for satisfeita.
Libera acesso a todas as ações em
instâncias Amazon EC2, assim será
possível criar security groups, atrelar
uma role.
Exemplo StringNotLikeIfExists
46. {
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:BatchGetItem",
"dynamodb:Query",
"dynamodb:Put*",
"dynamodb:BatchWriteItem“
],
"Resource": ["arn:aws:dynamodb:us-east-1:531546565747:table/score"],
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:CognitoIdentity": ["${graph.facebook.com:id}"]
}
}
}]
}
Variável nas condições
Permite acesso aos itens do Dynamo cujo atributo CognitoIdentity seja
igual ao usuário federado com o facebook.
Anatomia de uma policy com variáveis
48. • A mensagem inclui:
– Se a requisição foi negada com um
DENY explícito ou implícito.
– O principal que fez a requisição.
– A ação.
– O recurso.
– As condições.
• Requer permissão para executar:
sts:DecodeAuthorizationMessage
A mensagem é codificada porque os detalhes do status
da autorização podem conter informações restritas ao
usuário!
• Additional information about the authorization status of a request
Output
Como saber o que falhou?
49.
50. Compreendendo NotAction - ? Se der tempo
• Exceção.
• Exemplo: Quero permitir tudo, exceto operações no IAM.
{
"Version": "2012-10-17",
"Statement": [ {
"Effect": "Allow",
"NotAction": "iam:*",
"Resource": "*"
}
]
}
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
},
{
"Effect": "Deny",
"Action": "iam:*",
"Resource": "*"
}
]
}
or
Esta policy não nega. O usuário pode ter outra
policy que libera IAM:*
Se você quer prevenir o usuário de ser capaz de acessar
APIs do IAM, use uma negação explícita.
Tem
diferença?
Notas do Editor
IAM policies are assigned to IAM users and groups. These users are bound by the permissions defined in the IAM policy.
Enforcement: entender como as policies são interpretadas.
Objetivo: controlar custos.
Objetivo: controlar custos.
Pode usar o alias?
Uma entidade que tem o acesso liberado (allow) ou negado (deny) a um recurso.
Representado por um Amazon Resource Name (ARN).
Para as IAM policies, o elemento principal é implícito (i.e., o usuário, grupo, ou role associada).
Pode usar o alias?
Uma entidade que tem o acesso liberado (allow) ou negado (deny) a um recurso.
Representado por um Amazon Resource Name (ARN).
Para as IAM policies, o elemento principal é implícito (i.e., o usuário, grupo, ou role associada).
Descreve o tipo de acesso que deve ser liberado (allow) ou negado (deny).
Você encontra exemplos na documentação ou pode escolher em um drop-down list do editor de policies.
O(s) objeto(s) de que fala a policy.
Um Statement deve incluir o elemento Resource ou NotResource.
O(s) objeto(s) de que fala a policy.
Um Statement deve incluir o elemento Resource ou NotResource.
A versão é importante, porque senão ele vai tratar como literal. Tem versões anteriores?
1o não é Deny é uma exclusão.
Se ele for colocado em um grupo administrador, ele vai ganhar o acesso.
2o O deny realmente impede ainda que haja outra policy negando.
Permite especificar uma exceção em uma lista de ações.
Pode simplificar a policy em relação a usar Action e excluir as ações.
Exemplo: Quero permitir tudo exceto chamadas de APIs do IAM.