AWS Certified Cloud Practitioner
Post 12 of 25
48%
Complete
AWS Cloud Practitioner #12: AWS IAM - Control de Accesos
Domina IAM: users, groups, roles, policies, MFA, y el principio de least privilege para asegurar tu cuenta AWS.
Recommended Prerequisites
For the best learning experience, we recommend reading these posts first:
🎯 Lo que Aprenderás Hoy
Al finalizar este post, podrás:
- Explicar IAM: users, groups, roles, policies
- Implementar principio de least privilege
- Configurar MFA para seguridad adicional
- Diferenciar entre authentication y authorization
- Aplicar IAM best practices
El Problema Real
Trabajas en una empresa con 50 empleados usando AWS:
Problema 1: Todos usan root account
❌ Root tiene acceso completo a TODO
❌ No puedes rastrear quién hizo qué
❌ Si alguien renuncia, no puedes revocar solo su acceso
Problema 2: Developer borra producción por error
❌ Developer tiene permisos de admin
❌ Un comando erróneo = desastre
❌ No hay prevención
Problema 3: Credenciales hardcoded en app
❌ AWS access keys en código
❌ Si código se filtra = cuenta comprometidaSolución: IAM (Identity and Access Management)
¿Qué es IAM?
AWS IAM permite controlar quién puede hacer qué en tu cuenta AWS.
Analogía: IAM es como el sistema de badges de una empresa.
- Users: Empleados individuales
- Groups: Departamentos (Engineering, HR, Finance)
- Roles: Permisos temporales (contractor por 3 meses)
- Policies: Reglas (Engineering puede acceder servers, no puede ver finanzas)
Conceptos Clave
Authentication (¿Quién eres?)
Verifica identidad:
- Username + Password
- Access Key + Secret Key
- MFA tokenAuthorization (¿Qué puedes hacer?)
Determina permisos:
- ¿Puedes lanzar EC2?
- ¿Puedes borrar S3 buckets?
- ¿Puedes ver billing?IAM Users
¿Qué es? Identidad individual con credenciales permanentes.
Use cases:
✅ Empleados de la empresa
✅ Applications que necesitan AWS access
✅ Contractors/consultants
Cada user tiene:
- Username único
- Contraseña (para Console access)
- Access Keys (para API/CLI access)
- Permisos (via policies)Crear User:
# Create user
aws iam create-user --user-name juan-developer
# Create login profile (console access)
aws iam create-login-profile \
--user-name juan-developer \
--password "TempPassword123!"
# Create access keys (CLI access)
aws iam create-access-key --user-name juan-developer
# Output:
# AccessKeyId: AKIAIOSFODNN7EXAMPLE
# SecretAccessKey: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEYBest Practices:
✅ Un user por persona (NO compartir)
✅ Enforza password policy fuerte
✅ Rotate access keys regularmente
✅ Elimina users que ya no necesitan acceso
❌ NUNCA uses root user para tareas diariasIAM Groups
¿Qué es? Colección de users con permisos similares.
Ejemplo organización:
Group: Developers
Members: juan, maria, pedro
Permissions: EC2, RDS, S3 (dev buckets)
Group: Admins
Members: sofia, carlos
Permissions: Full access
Group: DataScience
Members: ana, luis
Permissions: S3, Glue, SageMaker
Beneficio:
Asignas permisos al GROUP
Todos los members heredan permisosEjemplo:
# Create group
aws iam create-group --group-name Developers
# Add user to group
aws iam add-user-to-group \
--user-name juan-developer \
--group-name Developers
# Attach policy to group (todos los members lo heredan)
aws iam attach-group-policy \
--group-name Developers \
--policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccessCaracterísticas:
✅ Users pueden estar en múltiples groups
✅ Groups NO pueden contener otros groups (no nesting)
✅ Groups facilitan gestión a escala
✅ Cambios a group afectan todos los members inmediatamenteIAM Roles
¿Qué es? Identidad con permisos que puede ser asumida temporalmente.
Key difference:
User: Identidad permanente (juan tiene acceso)
Role: Identidad temporal (quien asume el role tiene acceso)
Use cases:
✅ EC2 instance necesita acceder S3
✅ Lambda function necesita escribir a DynamoDB
✅ Cross-account access (Account A → Account B)
✅ Federated users (Google/Microsoft login)Ejemplo: EC2 → S3
Problema:
EC2 instance necesita leer S3 bucket
❌ Mala solución:
Hardcodear AWS access keys en EC2
aws configure
→ Keys en disco (inseguro)
→ Si instance comprometida = keys expuestas
✅ Buena solución:
IAM Role para EC2
1. Create role con S3 read permissions
2. Attach role a EC2 instance
3. EC2 automáticamente obtiene temporary credentials
4. App usa AWS SDK (credentials automáticas)# 1. Create role
aws iam create-role \
--role-name EC2-S3-Read-Role \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"Service": "ec2.amazonaws.com"},
"Action": "sts:AssumeRole"
}]
}'
# 2. Attach S3 read policy
aws iam attach-role-policy \
--role-name EC2-S3-Read-Role \
--policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
# 3. Create instance profile
aws iam create-instance-profile \
--instance-profile-name EC2-S3-Profile
# 4. Add role to instance profile
aws iam add-role-to-instance-profile \
--instance-profile-name EC2-S3-Profile \
--role-name EC2-S3-Read-Role
# 5. Launch EC2 with instance profile
aws ec2 run-instances \
--image-id ami-12345678 \
--instance-type t2.micro \
--iam-instance-profile Name=EC2-S3-ProfileDentro de EC2:
import boto3
# AWS SDK automáticamente usa role credentials
# NO need to configure access keys
s3 = boto3.client('s3')
response = s3.list_buckets()
print(response['Buckets'])
# ✅ Works (usando temporary credentials from role)Temporary Credentials:
Role credentials son temporales:
- Se renuevan automáticamente
- Expiran después de 1-12 horas (configurable)
- Más seguro que permanent access keysIAM Policies
¿Qué es? Documento JSON que define permisos.
Policy estructura:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow/Deny",
"Action": "service:Action",
"Resource": "arn:aws:...",
"Condition": {...}
}
]
}Tipos de Policies
1. AWS Managed Policies
Predefinidas por AWS:
- AdministratorAccess: Full access a todo
- PowerUserAccess: Todo excepto IAM
- ReadOnlyAccess: Solo lectura
- AmazonEC2FullAccess: Full EC2
- AmazonS3ReadOnlyAccess: Read S3
Ventaja: Maintained por AWS
Desventaja: Puede ser muy permisivo2. Customer Managed Policies
Creadas por ti:
Ejemplo: Developers Policy
- Permite: Launch/stop EC2 en dev environment
- Niega: Terminar EC2 en prod
- Permite: Read/Write S3 en dev buckets
- Niega: Acceso a prod buckets
Ventaja: Customizado exactamente para tus needs3. Inline Policies
Policy directamente attached a user/group/role
Usa solo para one-off exceptions
Generalmente usa managed policiesEjemplo de Policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowEC2Development",
"Effect": "Allow",
"Action": [
"ec2:RunInstances",
"ec2:StopInstances",
"ec2:StartInstances",
"ec2:DescribeInstances"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"ec2:ResourceTag/Environment": "dev"
}
}
},
{
"Sid": "DenyProductionTermination",
"Effect": "Deny",
"Action": "ec2:TerminateInstances",
"Resource": "*",
"Condition": {
"StringEquals": {
"ec2:ResourceTag/Environment": "prod"
}
}
}
]
}Explicación:
Statement 1 (Allow):
- Permite launch/stop/start EC2
- Solo para instances con tag Environment=dev
Statement 2 (Deny):
- Niega terminate instances
- Para instances con tag Environment=prod
Resultado:
Developer puede trabajar libremente en dev
Pero NO puede terminar instances de prodPolicy Evaluation Logic
Cuando user intenta action:
1. Default: Implicitly DENY
2. Check all applicable policies:
├─ User policies
├─ Group policies (todos los groups)
└─ Role policies (si usando role)
3. Evaluate:
├─ Explicit DENY? → DENY (wins always)
├─ Explicit ALLOW? → ALLOW
└─ No match? → DENY (default)
Rule: DENY always wins over ALLOWEjemplo:
User: juan
Groups: Developers (allows EC2 full access)
User policy: Deny EC2 terminate for prod instances
Action: Terminate prod instance
Evaluation:
1. Group policy: Allow EC2 actions ✓
2. User policy: Deny EC2 terminate for prod ✗
Result: DENY (explicit deny wins)MFA (Multi-Factor Authentication)
¿Qué es? Seguridad adicional: algo que sabes (password) + algo que tienes (MFA device).
MFA types:
1. Virtual MFA: Google Authenticator, Authy
2. Hardware MFA: YubiKey, Gemalto
3. SMS MFA (deprecated)
Root account MFA: CRÍTICO ✅
Users MFA: Highly recommended ✅Habilitar MFA:
# Para root account:
# Console → Security Credentials → MFA → Activate MFA
# Para IAM user:
aws iam enable-mfa-device \
--user-name juan-developer \
--serial-number arn:aws:iam::123456789012:mfa/juan-developer \
--authentication-code1 123456 \
--authentication-code2 789012Enforce MFA via Policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyAllExceptListedIfNoMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:GetUser",
"iam:ListMFADevices"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}Resultado: Users SIN MFA solo pueden configurar MFA, nada más.
Best Practices
1. Least Privilege
Principio: Solo da mínimos permisos necesarios
❌ Dar AdministratorAccess a todos
✅ Dar solo lo que necesitan
Ejemplo:
Developer que solo trabaja con Lambda:
✅ AWSLambdaFullAccess
❌ AdministratorAccess2. Root Account
Root account = acceso completo a TODO
Best practices:
✅ Habilita MFA
✅ NO uses para tareas diarias
✅ Crea IAM users para admin tasks
✅ Guarda root credentials seguramente
✅ Usa solo para account-level tasks
Account-level tasks:
- Cambiar payment information
- Close AWS account
- Change support plan
- Enable MFA on root3. Password Policy
Configura password policy fuerte:
✅ Minimum length: 14+ characters
✅ Require uppercase
✅ Require lowercase
✅ Require numbers
✅ Require symbols
✅ Password expiration: 90 days
✅ Prevent password reuse
✅ MFA para sensitive operations4. Access Keys Rotation
Access keys NO expiran automáticamente
Best practices:
✅ Rotate cada 90 días
✅ Usa roles cuando sea posible (temporary credentials)
✅ NO hardcodear en código
✅ Use AWS Secrets Manager para apps
Check last used:
aws iam get-access-key-last-used \
--access-key-id AKIAIOSFODNN7EXAMPLE
Si no usado en 90+ días → DELETE5. IAM Roles > Access Keys
Siempre prefiere roles:
EC2 access to S3:
❌ Create access keys → store in EC2
✅ Create IAM role → attach to EC2
Lambda access to DynamoDB:
❌ Hardcode credentials
✅ Use execution role
Benefits:
- Temporary credentials (auto-rotate)
- No credential management
- Auditable (CloudTrail)IAM Access Analyzer
¿Qué es? Herramienta que identifica recursos compartidos con external entities.
Analiza:
- S3 buckets accesibles externamente
- IAM roles assumable por external accounts
- KMS keys compartidas
- Lambda functions con cross-account access
Alerts:
"S3 bucket mi-bucket es público"
"Role arn:aws:iam::123:role/CrossAccount puede ser asumido por account 456"
Action: Review y revoca si no intencional📝 Preparación para el Examen
Puntos Clave para Memorizar
IAM Components:
- 📌 Users: Identidades permanentes (empleados)
- 📌 Groups: Colecciones de users (no nesting)
- 📌 Roles: Identidades asumibles, temporary credentials
- 📌 Policies: JSON documents con permisos
Security:
- 📌 Least Privilege: Mínimos permisos necesarios
- 📌 MFA: Habilitar para root y users críticos
- 📌 Root Account: NO usar diariamente
- 📌 Roles > Access Keys: Para EC2, Lambda
Policy Evaluation:
- 📌 Default DENY: Si no hay allow explícito
- 📌 Explicit DENY wins: Siempre sobre allow
- 📌 Multiple policies: Se evalúan todas
Preguntas de Práctica
Pregunta 1:
¿Cuál es la mejor práctica para dar acceso S3 a una aplicación corriendo en EC2?
A) Crear access keys y hardcodear en app B) Usar root account credentials C) Crear IAM role y attachear a EC2 D) Compartir password de IAM user
Respuesta: C) Crear IAM role y attachear a EC2
Roles proveen temporary credentials que se auto-rotan, mucho más seguro que access keys permanentes.
Pregunta 2:
Una policy ALLOW da acceso a S3. Otra policy DENY bloquea S3. ¿Qué pasa?
A) ALLOW gana B) DENY gana C) La última policy gana D) Ambas se cancelan
Respuesta: B) DENY gana
Explicit DENY siempre tiene prioridad sobre ALLOW en IAM policy evaluation.
🎓 Resumen
- IAM: Control de acceso (authentication + authorization)
- Users: Identidades permanentes
- Groups: Gestión de users a escala
- Roles: Temporary credentials, preferibles a access keys
- Policies: JSON con permisos
- Least Privilege + MFA: Principios fundamentales
⏭️ Próximo Post
Post #13: Encryption y KMS - Protección de datos at rest y in transit.
Tags: #AWS #CloudPractitioner #IAM #Security #AccessControl #MFA #Certification
Related Articles
AWS Cloud Practitioner #5: Shared Responsibility Model - ¿Quién es Responsable de Qué?
Comprende el modelo de responsabilidad compartida de AWS: qué gestiona AWS (security OF the cloud) vs. qué gestionas tú (security IN the cloud).
AWS Cloud Practitioner #9: Amazon VPC - Tu Red Privada en la Nube
Domina VPC: subnets públicas y privadas, Internet Gateway, NAT Gateway, Route Tables y diseña arquitecturas de red seguras y escalables.
AWS Cloud Practitioner #13: Encryption y AWS KMS
Aprende encryption at rest y in transit, AWS KMS para gestión de claves, y cómo proteger datos sensibles en AWS.
AWS Cloud Practitioner #1: De Servidores Físicos a la Nube
Aprende qué es cloud computing y las diferencias entre IaaS, PaaS y SaaS con una metodología bottom-up que construye tu conocimiento paso a paso.