opción

Gestiona AWS Identity and Access Management (IAM) para usuarios, roles, políticas y permisos. Crea políticas de IAM, configura el acceso entre cuentas, configura roles de servicio, resuelve errores de permisos y aplica el principio de «privilegio mínimo».

...Expandir todo
34
Tiempo actualizado 21 de septiembre de 2026

AWS IAM

La gestión de identidades y accesos de AWS (IAM) permite un control de acceso seguro a los servicios y recursos de AWS. IAM es un elemento fundamental de la seguridad de AWS: todas las llamadas a la API de AWS se autentican y autorizan a través de IAM.

Índice

  • Conceptos básicos
  • Patrones comunes
  • Referencia de la CLI
  • Prácticas recomendadas
  • Solución de problemas
  • Referencias

Conceptos básicos

Entidades principales

Entidades que pueden realizar solicitudes a AWS: usuarios de IAM, roles, usuarios federados y aplicaciones.

Políticas

Documentos JSON que definen los permisos. Tipos:

  • Basadas en la identidad: asociadas a usuarios, grupos o roles
  • Basadas en recursos: asociadas a recursos (depósitos de S3, colas de SQS)
  • Límites de permisos: permisos máximos que puede tener una identidad
  • Políticas de control de servicios (SCP): límites a nivel de organización

Roles

Identidades con permisos que pueden ser asumidos por entidades de confianza. Sin credenciales permanentes: utiliza tokens de seguridad temporales.

Relaciones de confianza

Definen qué entidades pueden asumir un rol. Se configuran a través de la política de confianza del rol.

Patrones comunes

Crear un rol de servicio para Lambda

AWS CLI:

# Crear la política de confianza
cat > trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "Service": "lambda.amazonaws.com" },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF

# Crear el rol
aws iam create-role \
  --role-name MyLambdaRole \
  --assume-role-policy-document file://trust-policy.json

# Asociar una política gestionada
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"
        }
    ]
}

# Crear rol
iam.create_role(
    RoleName='MyLambdaRole',
    AssumeRolePolicyDocument=json.dumps(trust_policy)
)

# Asociar una política gestionada
iam.attach_role_policy(
    RoleName='MyLambdaRole',
    PolicyArn='arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
)

Crear una política personalizada con el mínimo de privilegios

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"
    }
  ]
}
Fin de archivo

aws iam create-policy \
  --policy-name MyDynamoDBPolicy \
  --policy-document file://policy.json

Asunción de roles entre cuentas

# En la cuenta B (cuenta de confianza), crea una función con confianza para la cuenta 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

# Desde la cuenta A, asumir el rol
aws sts assume-role \
  --role-arn arn:aws:iam::222222222222:role/CrossAccountRole \
  --role-session-name MySession \
  --external-id unique-external-id

Referencia de la CLI

Comandos esenciales

Comando Descripción
aws iam create-role Crear un nuevo rol de IAM
aws iam create-policy Crear una política gestionada por el cliente
aws iam attach-role-policy Asignar una política gestionada a un rol
aws iam put-role-policy Añadir una política en línea a un rol
aws iam get-role Obtener detalles de un rol
aws iam list-roles Enumerar todos los roles
aws iam simulate-principal-policy Probar los permisos de la política
aws sts assume-role Asumir un rol y obtener credenciales temporales
aws sts get-caller-identity Obtener la identidad actual

Opciones útiles

  • --query: Filtrar la salida con JMESPath
  • --output table: Salida legible para el usuario
  • --no-cli-pager: Desactivar el paginador para la creación de scripts

Prácticas recomendadas

Seguridad

  • Nunca utilices la cuenta de root para las tareas diarias
  • Activa la autenticación multifactorial (MFA) para todos los usuarios humanos
  • Utiliza roles en lugar de claves de acceso de larga duración
  • Aplica el principio del mínimo privilegio: concede solo los permisos necesarios
  • Utiliza condiciones para restringir el acceso por IP, hora o autenticación multifactorial (MFA)
  • Rota las credenciales periódicamente
  • Utilizar límites de permisos para la administración delegada

Diseño de políticas

  • Empieza con políticas gestionadas por AWS y personalízalas según sea necesario
  • Utilice variables de política (${aws:username}) para políticas dinámicas
  • Da preferencia a las denegaciones explícitas para las acciones sensibles
  • Agrupa los permisos relacionados de forma lógica

Supervisión

  • Habilita CloudTrail para la auditoría de la API
  • Utilice el Analizador de acceso deIAM para identificar políticas excesivamente permisivas
  • Revisa los informes de credenciales con regularidad
  • Configurar alertas sobre el uso de la cuenta root

Resolución de problemas

Errores de acceso denegado

Síntoma: AccessDeniedException o UnauthorizedAccess

Pasos de depuración:

  1. Verificar la identidad: aws sts get-caller-identity
  2. Comprueba las políticas asociadas: ` aws iam list-attached-role-policies --role-name MyRole`
  3. Simular la acción:
    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. Comprueba si hay denegaciones explícitas en las SCP o en los límites de permisos
  5. Comprueba que las políticas basadas en recursos permitan al principal

No se puede asumir el rol

Síntoma: «AccessDenied» al llamar a «AssumeRole»

Causas:

  • La política de confianza no incluye al sujeto que realiza la llamada
  • Falta el permiso sts:AssumeRole en el solicitante
  • Discrepancia en el ExternalId (para roles entre cuentas)
  • La duración de la sesión supera el límite máximo

Solución: Revisa y actualiza la relación de confianza del rol.

Límites de tamaño de la política

  • Política gestionada: 6.144 caracteres
  • Política en línea: 2.048 caracteres (usuario), 10.240 caracteres (rol/grupo)
  • Política de confianza: 2.048 caracteres

Solución: Utiliza varias políticas, haz referencia a los recursos mediante prefijos o comodines, o utiliza un control de acceso basado en etiquetas.

Referencias

  • IAM Guía del usuario
  • IAM Referencia de la API
  • IAM Referencia de la CLI
  • Referencia de políticas
  • boto3 IAM
Ver en GitHub
---
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)

Todos los archivos

3 archivos
SKILL.md 6.9k
Ver

Instalar iam

Descarga y descomprime los archivos de habilidades en tu directorio .claude/skills/.

Descargar ZIP

Clona el repositorio y copia los archivos de la habilidad a tu proyecto.

git clone https://github.com/itsmostafa/aws-agent-skills/tree/main/skills/iam # Copy SKILL.md to your .claude/skills/ directory

Copiar Copiar
Configuración rápida: Copia la carpeta de la habilidad en .claude/skills/ Claude detectará y utilizará automáticamente la habilidad

Habilidades relacionadas

gmgn-portfolio
Tiempo actualizado 1 de julio de 2026
device-integrity
Tiempo actualizado 29 de junio de 2026
zeroize-audit
Tiempo actualizado 1 de julio de 2026
flutter-use-http-package
Tiempo actualizado 30 de junio de 2026
OR