Gerencie o AWS Identity and Access Management (IAM) para usuários, funções, políticas e permissões. Crie políticas do IAM, configure o acesso entre contas, defina funções de serviço, resolva erros de permissão e implemente a segurança baseada no princípio do privilégio mínimo.
...Expandir tudoAWS IAM
O AWS Identity and Access Management (IAM) permite o controle seguro de acesso aos serviços e recursos da AWS. O IAM é fundamental para a segurança da AWS — todas as chamadas à API da AWS são autenticadas e autorizadas por meio do IAM.
Índice
- Conceitos básicos
- Padrões comuns
- Referência da CLI
- Melhores práticas
- Solução de problemas
- Referências
Conceitos básicos
Entidades principais
Entidades que podem fazer solicitações à AWS: usuários do IAM, funções, usuários federados e aplicativos.
Políticas
Documentos JSON que definem permissões. Tipos:
- Baseadas em identidade: associadas a usuários, grupos ou funções
- Baseadas em recursos: associadas a recursos (buckets do S3, filas do SQS)
- Limites de permissão: o máximo de permissões que uma identidade pode ter
- Políticas de controle de serviço (SCPs): Limites para toda a organização
Funções
Identidades com permissões que podem ser assumidas por entidades confiáveis. Sem credenciais permanentes — utiliza tokens de segurança temporários.
Relações de confiança
Definem quais entidades podem assumir uma função. Configuradas por meio da política de confiança da função.
Padrões comuns
Criar uma função de serviço para o Lambda
AWS CLI:
# Criar a política de confiança
cat > trust-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "lambda.amazonaws.com" },
"Action": "sts:AssumeRole"
}
]
}
EOF
# Criar a função
aws iam create-role \
--role-name MyLambdaRole \
--assume-role-policy-document file://trust-policy.json
# Anexar uma política gerenciada
aws iam attach-role-policy \
--role-name MyLambdaRole \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
boto3:
import boto3
import json
iam = boto3.client('iam')
trust_policy = {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {"Service": "lambda.amazonaws.com"},
"Action": "sts:AssumeRole"
}
]
}
# Criar funçãoiam.create_role(
RoleName='MyLambdaRole',
AssumeRolePolicyDocument=json.dumps(trust_policy)
)
# Anexar política gerenciada
iam.attach_role_policy(
RoleName='MyLambdaRole',
PolicyArn='arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
)
Criar política personalizada com privilégios mínimos
cat > policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:Query"
],
"Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/MyTable"
}
]
}
Fim do arquivo
aws iam create-policy \
--policy-name MyDynamoDBPolicy \
--policy-document file://policy.json
Assunção de função entre contas
# Na Conta B (conta confiável), crie uma função com confiança para a Conta A
cat > cross-account-trust.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "AWS": "arn:aws:iam::111111111111:root" },
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": { "sts:ExternalId": "unique-external-id" }
}
}
]
}
EOF
# Da conta A, assumir a função
aws sts assume-role \
--role-arn arn:aws:iam::222222222222:role/CrossAccountRole \
--role-session-name MySession \
--external-id unique-external-id
Referência da CLI
Comandos essenciais
| Comando | Descrição |
|---|---|
aws iam create-role |
Cria uma nova função do IAM |
aws iam create-policy |
Criar uma política gerenciada pelo cliente |
aws iam attach-role-policy |
Anexar uma política gerenciada a uma função |
aws iam put-role-policy |
Adicionar uma política embutida a uma função |
aws iam get-role |
Obter detalhes da função |
aws iam list-roles |
Listar todas as funções |
aws iam simulate-principal-policy |
Testar permissões da política |
aws sts assume-role |
Assumir uma função e obter credenciais temporárias |
aws sts get-caller-identity |
Obter a identidade atual |
Sinalizadores úteis
--query: Filtrar a saída com JMESPath--output table: Saída legível por humanos--no-cli-pager: Desativa o paginador para scripts
Práticas recomendadas
Segurança
- Nunca use a conta root para tarefas diárias
- Habilite a autenticação multifatorial (MFA) para todos os usuários humanos
- Use funções em vez de chaves de acesso de longo prazo
- Aplique o princípio do privilégio mínimo — conceda apenas as permissões necessárias
- Use condições para restringir o acesso por IP, horário ou MFA
- Alterne as credenciais regularmente
- Utilize limites de permissão para a administração delegada
Projeto de políticas
- Comece com políticas gerenciadas pela AWS e personalize-as conforme necessário
- Use variáveis de política (
${aws:username}) para políticas dinâmicas - Dê preferência a negações explícitas para ações confidenciais
- Agrupe permissões relacionadas de forma lógica
Monitoramento
- Habilite o CloudTrail para auditoria de API
- Use o Access Analyzer dIAM para identificar políticas excessivamente permissivas
- Analise os relatórios de credenciais regularmente
- Configure alertas para o uso da conta root
Solução de problemas
Erros de acesso negado
Sintoma: AccessDeniedException ou UnauthorizedAccess
Etapas de depuração:
- Verifique a identidade:
aws sts get-caller-identity - Verifique as políticas associadas: `
aws iam list-attached-role-policies --role-name MyRole` - Simule a ação:
aws iam simulate-principal-policy \ --policy-source-arn arn:aws:iam::123456789012:role/MyRole \ --action-names dynamodb:GetItem \ --resource-arns arn:aws:dynamodb:us-east-1:123456789012:table/MyTable - Verifique se há negações explícitas nas SCPs ou nos limites de permissão
- Verifique se as políticas baseadas em recursos permitem que o principal
Não é possível assumir a função
Sintoma: AccessDenied ao chamar AssumeRole
Causas:
- A política de confiança não inclui o principal chamador
- Falta a permissão
sts:AssumeRoleno chamador - Incompatibilidade de ExternalId (para funções entre contas)
- A duração da sessão excede o máximo
Solução: Revise e atualize a relação de confiança da função.
Limites de tamanho da política
- Política gerenciada: 6.144 caracteres
- Política embutida: 2.048 caracteres (usuário), 10.240 caracteres (função/grupo)
- Política de confiança: 2.048 caracteres
Solução: Use várias políticas, faça referência a recursos por prefixo/caractere curinga ou utilize controle de acesso baseado em tags.
Referências
- IAM Guia do usuário
- IAM Referência da API
- IAM Referência da CLI
- Referência de políticas
- boto3 IAM
---
name: iam
description: Manage AWS Identity and Access Management for users, roles, policies, and permissions. Create IAM policies, configure cross-account access, set up service roles, troubleshoot permission errors, and enforce least-privilege security.
---
# AWS IAM
AWS Identity and Access Management (IAM) enables secure access control to AWS services and resources. IAM is foundational to AWS security—every AWS API call is authenticated and authorized through IAM.
## Table of Contents
- [Core Concepts](#core-concepts)
- [Common Patterns](#common-patterns)
- [CLI Reference](#cli-reference)
- [Best Practices](#best-practices)
- [Troubleshooting](#troubleshooting)
- [References](#references)
## Core Concepts
### Principals
Entities that can make requests to AWS: IAM users, roles, federated users, and applications.
### Policies
JSON documents defining permissions. Types:
- **Identity-based**: Attached to users, groups, or roles
- **Resource-based**: Attached to resources (S3 buckets, SQS queues)
- **Permission boundaries**: Maximum permissions an identity can have
- **Service control policies (SCPs)**: Organization-wide limits
### Roles
Identities with permissions that can be assumed by trusted entities. No permanent credentials—uses temporary security tokens.
### Trust Relationships
Define which principals can assume a role. Configured via the role's trust policy.
## Common Patterns
### Create a Service Role for Lambda
**AWS CLI:**
```bash
# Create the trust policy
cat > trust-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "lambda.amazonaws.com" },
"Action": "sts:AssumeRole"
}
]
}
EOF
# Create the role
aws iam create-role \
--role-name MyLambdaRole \
--assume-role-policy-document file://trust-policy.json
# Attach a managed policy
aws iam attach-role-policy \
--role-name MyLambdaRole \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
```
**boto3:**
```python
import boto3
import json
iam = boto3.client('iam')
trust_policy = {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {"Service": "lambda.amazonaws.com"},
"Action": "sts:AssumeRole"
}
]
}
# Create role
iam.create_role(
RoleName='MyLambdaRole',
AssumeRolePolicyDocument=json.dumps(trust_policy)
)
# Attach managed policy
iam.attach_role_policy(
RoleName='MyLambdaRole',
PolicyArn='arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
)
```
### Create Custom Policy with Least Privilege
```bash
cat > policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:Query"
],
"Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/MyTable"
}
]
}
EOF
aws iam create-policy \
--policy-name MyDynamoDBPolicy \
--policy-document file://policy.json
```
### Cross-Account Role Assumption
```bash
# In Account B (trusted account), create role with trust for Account A
cat > cross-account-trust.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "AWS": "arn:aws:iam::111111111111:root" },
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": { "sts:ExternalId": "unique-external-id" }
}
}
]
}
EOF
# From Account A, assume the role
aws sts assume-role \
--role-arn arn:aws:iam::222222222222:role/CrossAccountRole \
--role-session-name MySession \
--external-id unique-external-id
```
## CLI Reference
### Essential Commands
| Command | Description |
|---------|-------------|
| `aws iam create-role` | Create a new IAM role |
| `aws iam create-policy` | Create a customer managed policy |
| `aws iam attach-role-policy` | Attach a managed policy to a role |
| `aws iam put-role-policy` | Add an inline policy to a role |
| `aws iam get-role` | Get role details |
| `aws iam list-roles` | List all roles |
| `aws iam simulate-principal-policy` | Test policy permissions |
| `aws sts assume-role` | Assume a role and get temporary credentials |
| `aws sts get-caller-identity` | Get current identity |
### Useful Flags
- `--query`: Filter output with JMESPath
- `--output table`: Human-readable output
- `--no-cli-pager`: Disable pager for scripting
## Best Practices
### Security
- **Never use root account** for daily tasks
- **Enable MFA** for all human users
- **Use roles** instead of long-term access keys
- **Apply least privilege** — grant only required permissions
- **Use conditions** to restrict access by IP, time, or MFA
- **Rotate credentials** regularly
- **Use permission boundaries** for delegated administration
### Policy Design
- Start with AWS managed policies, customize as needed
- Use policy variables (`${aws:username}`) for dynamic policies
- Prefer explicit denies for sensitive actions
- Group related permissions logically
### Monitoring
- Enable **CloudTrail** for API auditing
- Use **IAM Access Analyzer** to identify overly permissive policies
- Review **credential reports** regularly
- Set up alerts for root account usage
## Troubleshooting
### Access Denied Errors
**Symptom:** `AccessDeniedException` or `UnauthorizedAccess`
**Debug steps:**
1. Verify identity: `aws sts get-caller-identity`
2. Check attached policies: `aws iam list-attached-role-policies --role-name MyRole`
3. Simulate the action:
```bash
aws iam simulate-principal-policy \
--policy-source-arn arn:aws:iam::123456789012:role/MyRole \
--action-names dynamodb:GetItem \
--resource-arns arn:aws:dynamodb:us-east-1:123456789012:table/MyTable
```
4. Check for explicit denies in SCPs or permission boundaries
5. Verify resource-based policies allow the principal
### Role Cannot Be Assumed
**Symptom:** `AccessDenied` when calling `AssumeRole`
**Causes:**
- Trust policy doesn't include the calling principal
- Missing `sts:AssumeRole` permission on the caller
- ExternalId mismatch (for cross-account roles)
- Session duration exceeds maximum
**Fix:** Review and update the role's trust relationship.
### Policy Size Limits
- Managed policy: 6,144 characters
- Inline policy: 2,048 characters (user), 10,240 characters (role/group)
- Trust policy: 2,048 characters
**Solution:** Use multiple policies, reference resources by prefix/wildcard, or use tags-based access control.
## References
- [IAM User Guide](https://docs.aws.amazon.com/IAM/latest/UserGuide/)
- [IAM API Reference](https://docs.aws.amazon.com/IAM/latest/APIReference/)
- [IAM CLI Reference](https://docs.aws.amazon.com/cli/latest/reference/iam/)
- [Policy Reference](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html)
- [boto3 IAM](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/iam.html)
Instalar iam
Baixe e descompacte os arquivos de habilidades no diretório .claude/skills/.
Baixar ZIPClone o repositório e copie os arquivos da habilidade para o seu projeto.
git clone https://github.com/itsmostafa/aws-agent-skills/tree/main/skills/iam # Copy SKILL.md to your .claude/skills/ directory
Copiar





Lar
