Cloud & Infraestrutura

Dominando IAM em Profundidade: Users, Groups, Roles, Policies e Least Privilege em Projetos Reais

9 min de leitura

Dominando IAM em Profundidade: Users, Groups, Roles, Policies e Least Privilege em Projetos Reais

Fundamentos de IAM: A Base da Segurança em Nuvem Identity and Access Management (IAM) é o alicerce de qualquer infraestrutura segura na nuvem. O IAM controla quem pode acessar o quê e como, funcionando como um guardião digital que valida identidades e autoriza ações. Em projetos reais, uma política IAM mal configurada pode expor dados sensíveis, comprometer compliance (LGPD, HIPAA) ou resultar em custos imensuráveis com recursos roubados. O IAM é tanto um conceito técnico quanto uma responsabilidade estratégica: você precisa garantir que desenvolvedores tenham poder para fazer seu trabalho, sem abrir portas desnecessárias. Os três pilares fundamentais são: identificação (quem você é), autenticação (prova de identidade) e autorização (o que você pode fazer). Na AWS, Azure e GCP, esses pilares se concretizam através de Users, Groups, Roles e Policies. Entender essa tríade é essencial antes de implementar Least Privilege, que é a filosofia de segurança mais importante que você aprenderá neste artigo. Users, Groups e Roles: A Estrutura Organizacional

<h2>Fundamentos de IAM: A Base da Segurança em Nuvem</h2>

<p>Identity and Access Management (IAM) é o alicerce de qualquer infraestrutura segura na nuvem. O IAM controla <em>quem</em> pode acessar <em>o quê</em> e <em>como</em>, funcionando como um guardião digital que valida identidades e autoriza ações. Em projetos reais, uma política IAM mal configurada pode expor dados sensíveis, comprometer compliance (LGPD, HIPAA) ou resultar em custos imensuráveis com recursos roubados. O IAM é tanto um conceito técnico quanto uma responsabilidade estratégica: você precisa garantir que desenvolvedores tenham poder para fazer seu trabalho, sem abrir portas desnecessárias.</p>

<p>Os três pilares fundamentais são: <strong>identificação</strong> (quem você é), <strong>autenticação</strong> (prova de identidade) e <strong>autorização</strong> (o que você pode fazer). Na AWS, Azure e GCP, esses pilares se concretizam através de Users, Groups, Roles e Policies. Entender essa tríade é essencial antes de implementar Least Privilege, que é a filosofia de segurança mais importante que você aprenderá neste artigo.</p>

<h2>Users, Groups e Roles: A Estrutura Organizacional</h2>

<p>Users representam indivíduos ou aplicações que precisam acessar recursos. Groups são coleções de users que compartilham as mesmas necessidades de acesso, reduzindo o trabalho administrativo exponencialmente. Roles são entidades abstratas que encapsulam permissões e podem ser assumidas por users, grupos, ou até serviços. A chave é entender que <strong>roles são reutilizáveis e escaláveis</strong>, enquanto permissions diretas em users criam caos em projetos maiores.</p>

<p>Veja um exemplo prático com Terraform (infraestrutura como código), que você usará em projetos reais:</p>

<pre><code class="language-hcl"># Criando um grupo para desenvolvedores

resource &quot;aws_iam_group&quot; &quot;developers&quot; {

name = &quot;developers&quot;

}

Criando um usuário

resource &quot;aws_iam_user&quot; &quot;alice&quot; {

name = &quot;alice.silva&quot;

}

Adicionando o usuário ao grupo

resource &quot;aws_iam_group_membership&quot; &quot;dev_membership&quot; {

name = &quot;dev-group-membership&quot;

users = [aws_iam_user.alice.name]

group = aws_iam_group.developers.name

}

Criando uma role para aplicações EC2

resource &quot;aws_iam_role&quot; &quot;ec2_app_role&quot; {

name = &quot;ec2-app-role&quot;

assume_role_policy = jsonencode({

Version = &quot;2012-10-17&quot;

Statement = [

{

Action = &quot;sts:AssumeRole&quot;

Effect = &quot;Allow&quot;

Principal = {

Service = &quot;ec2.amazonaws.com&quot;

}

}

]

})

}</code></pre>

<p>Este código demonstra a separação clara: users são pessoas, groups organizam users, e roles abstratamente definem responsabilidades. Em uma startup com 50 pessoas, você pode ter 3-4 grupos em vez de 50 políticas espalhadas. Quando a Alice muda de departamento, você a remove de um grupo e adiciona a outro — uma operação.</p>

<h2>Policies e Least Privilege: O Coração da Segurança</h2>

<p>Policies são documentos JSON que definem exatamente quais ações (actions), em quais recursos (resources), são permitidas (Allow) ou negadas (Deny). Least Privilege é o princípio de conceder <strong>apenas</strong> as permissões necessárias para realizar uma tarefa específica, nada mais. Este princípio reduz o dano potencial se uma credencial vazar ou um funcionário agir com má intenção.</p>

<p>Uma policy típica de um desenvolvedor backend que precisa acessar S3 e RDS deve ser altamente específica:</p>

<pre><code class="language-json">{

&quot;Version&quot;: &quot;2012-10-17&quot;,

&quot;Statement&quot;: [

{

&quot;Sid&quot;: &quot;S3ReadProductionBucket&quot;,

&quot;Effect&quot;: &quot;Allow&quot;,

&quot;Action&quot;: [

&quot;s3:GetObject&quot;,

&quot;s3:ListBucket&quot;

],

&quot;Resource&quot;: [

&quot;arn:aws:s3:::production-data&quot;,

&quot;arn:aws:s3:::production-data/*&quot;

]

},

{

&quot;Sid&quot;: &quot;RDSConnectProduction&quot;,

&quot;Effect&quot;: &quot;Allow&quot;,

&quot;Action&quot;: [

&quot;rds-db:connect&quot;

],

&quot;Resource&quot;: &quot;arn:aws:rds:us-east-1:123456789012:db:prod-database&quot;

},

{

&quot;Sid&quot;: &quot;DenyS3DeleteInProduction&quot;,

&quot;Effect&quot;: &quot;Deny&quot;,

&quot;Action&quot;: [

&quot;s3:DeleteBucket&quot;,

&quot;s3:DeleteObject&quot;

],

&quot;Resource&quot;: &quot;*&quot;

}

]

}</code></pre>

<p>Repare: ela pode <em>ler</em> do S3 e conectar ao RDS, mas <strong>nunca</strong> pode deletar — mesmo que tente contornar. Essa negação explícita é crítica. Em um projeto real que auditar, você encontra policies que permitem <code>s3:*</code> (tudo em S3) para &quot;simplificar&quot;. Isso é um sinal vermelho de negligência. O custo de 20 minutos definindo permissões é infinitamente menor que o custo de uma invasão.</p>

<h3>Implementação em Produção</h3>

<pre><code class="language-hcl"># Policy document em Terraform para role de aplicação

resource &quot;aws_iam_role_policy&quot; &quot;lambda_dynamodb_policy&quot; {

name = &quot;lambda-dynamodb-policy&quot;

role = aws_iam_role.lambda_role.id

policy = jsonencode({

Version = &quot;2012-10-17&quot;

Statement = [

{

Effect = &quot;Allow&quot;

Action = [

&quot;dynamodb:GetItem&quot;,

&quot;dynamodb:Query&quot;,

&quot;dynamodb:Scan&quot;

]

Resource = &quot;arn:aws:dynamodb:us-east-1:123456789012:table/users&quot;

},

{

Effect = &quot;Allow&quot;

Action = &quot;logs:CreateLogGroup&quot;

Resource = &quot;arn:aws:logs:us-east-1:123456789012:*&quot;

}

]

})

}</code></pre>

<p>Esta função Lambda pode ler dados de uma tabela DynamoDB específica e criar logs, nada mais. Se seu código tiver uma vulnerabilidade SQL injection (improvável em DynamoDB, mas hipoteticamente), o dano é limitado: não há acesso a outras tabelas, bancos ou serviços.</p>

<h2>Padrões Reais: Da Teoria à Prática</h2>

<p>Em uma empresa típica, você encontrará esses padrões: <strong>1) Separação por Ambiente</strong> — desenvolvedores têm acesso limitado a staging, produção requer aprovação extra; <strong>2) Separação por Time</strong> — backend, frontend, devops, cada um com suas roles específicas; <strong>3) Time-Based Access</strong> — credenciais que expiram automaticamente, rotacionadas a cada 90 dias.</p>

<p>Um exemplo real de staging vs produção:</p>

<pre><code class="language-hcl">resource &quot;aws_iam_group&quot; &quot;dev_staging_access&quot; {

name = &quot;dev-staging-access&quot;

}

resource &quot;aws_iam_group&quot; &quot;sre_production_access&quot; {

name = &quot;sre-production-access&quot;

}

Staging é permissivo

resource &quot;aws_iam_group_policy&quot; &quot;staging_policy&quot; {

name = &quot;staging-policy&quot;

group = aws_iam_group.dev_staging_access.name

policy = jsonencode({

Version = &quot;2012-10-17&quot;

Statement = [{

Effect = &quot;Allow&quot;

Action = &quot;ec2:*&quot;

Resource = &quot;*&quot;

Condition = {

StringEquals = {

&quot;aws:RequestedRegion&quot; = &quot;us-east-1-staging&quot;

}

}

}]

})

}

Produção é restritivo e requer MFA

resource &quot;aws_iam_group_policy&quot; &quot;production_policy&quot; {

name = &quot;production-policy&quot;

group = aws_iam_group.sre_production_access.name

policy = jsonencode({

Version = &quot;2012-10-17&quot;

Statement = [{

Effect = &quot;Allow&quot;

Action = [&quot;ec2:DescribeInstances&quot;, &quot;ec2:StartInstances&quot;]

Resource = &quot;*&quot;

Condition = {

Bool = {

&quot;aws:MultiFactorAuthPresent&quot; = &quot;true&quot;

}

}

}]

})

}</code></pre>

<p>Este padrão reflete o mundo real: desenvolvedores testam agressivamente em staging, mas produção exige MFA e um conjunto menor de ações. Assim, um desenvolvedor junior com credenciais comprometidas não pode derrubar a produção por acidente.</p>

<h2>Conclusão</h2>

<p>Dominando IAM significa: <strong>1) Estruturar Users em Groups, não políticas espalhadas</strong> — isso reduz complexidade exponencialmente em empresas em crescimento. <strong>2) Implementar Least Privilege como princípio inabalável</strong> — cada credencial deve ter o mínimo possível, não o máximo. <strong>3) Usar Roles para abstração e reutilização</strong> — roles são seu melhor amigo quando você tem múltiplos ambientes, times ou aplicações.</p>

<p>IAM não é sexy, mas é a diferença entre uma infraestrutura que dorme tranquila e um desastre de segurança. Comece pequeno, implemente Least Privilege desde o dia um, e você evitará refatorações dolorosas depois. Sua equipe de segurança (e seu sono) agradecem.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html" target="_blank" rel="noopener noreferrer">AWS IAM Best Practices - Documentação Oficial</a></li>

<li><a href="https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html" target="_blank" rel="noopener noreferrer">Principle of Least Privilege - OWASP</a></li>

<li><a href="https://registry.terraform.io/modules/terraform-aws-modules/iam/aws/latest" target="_blank" rel="noopener noreferrer">Terraform AWS IAM Module</a></li>

<li><a href="https://csrc.nist.gov/publications/detail/sp/800-207/final" target="_blank" rel="noopener noreferrer">Zero Trust Architecture - NIST Special Publication 800-207</a></li>

<li><a href="https://cloudsecurityalliance.org/" target="_blank" rel="noopener noreferrer">Cloud Security Alliance - IAM Guidance</a></li>

</ul>

Comentários

Mais em Cloud & Infraestrutura

Deploy automático e HTTPS: Nginx com GitHub Actions e Certbot
Deploy automático e HTTPS: Nginx com GitHub Actions e Certbot

Servidor configurado, agora automatize. Deploy com GitHub Actions, HTTPS grat...

Como Usar API Gateway: REST API, HTTP API e WebSocket API na Prática em Produção
Como Usar API Gateway: REST API, HTTP API e WebSocket API na Prática em Produção

Entendendo as Três Arquiteturas do API Gateway O AWS API Gateway oferece três...

Dominando EC2 em Profundidade: Instance Types, AMIs e Placement Groups em Projetos Reais
Dominando EC2 em Profundidade: Instance Types, AMIs e Placement Groups em Projetos Reais

Instance Types: Escolhendo a Máquina Correta Os tipos de instância EC2 são or...