intermediate Por Mathias Paulenko

Plantilla de Revision de Control de Acceso

Una plantilla para auditar derechos de acceso de usuarios, verificar privilegio minimo y documentar decisiones de acceso en sistemas y equipos.

Nota para desarrolladores hispanohablantes: Esta guía incluye ejemplos y convenciones de nomenclatura adaptadas a equipos que trabajan en español. Cuando existen diferencias significativas en terminología técnica entre el inglés y el español, se indican explícitamente para facilitar la comunicación en equipos multiculturales.

Descripcion General

Una Plantilla de Revision de Control de Acceso proporciona una forma estructurada de verificar que usuarios y cuentas de servicio tienen solo los permisos requeridos por su rol actual. Documenta quien tiene acceso, por que lo tiene y si todavia esta justificado, apoyando marcos de cumplimiento como SOC 2, ISO 27001 y PCI-DSS.

Cuando Usar

  • For alternatives, see Compliance Gap Analysis Template.

  • Durante revisiones de acceso trimestrales o anuales.

  • Antes de una auditoria externa o certificacion.

  • Despues de un cambio de rol, terminacion o reorganizacion.

  • Al incorporar o retirar un sistema sensible.

  • Cuando se detecta una cuenta con privilegios excesivos.

Prerequisitos

  • Un inventario autorizado de sistemas, roles y usuarios.
  • Acceso a logs del proveedor de identidad o APIs de gestion de roles.
  • Una politica definida de privilegio minimo y ciclo de vida de roles.
  • Un revisor que sea manager o dueno del sistema, no el usuario revisado.

Solucion

Plantilla

1. Alcance de la Revision

CampoDescripcionEjemplo
Sistema o aplicacionRecurso bajo revisionBase de datos de produccion
Periodo de revisionFechas de inicio y finQ2 2026
RevisorPersona responsableEngineering manager
Fecha de revisionCuando se realiza la atestacion2026-06-27
Tamano de muestraNumero de usuarios revisados42

2. Registro de Acceso de Usuarios

UsuarioRolPermisosJustificacion de NegocioAun Requerido?Notas del Revisor
alice@example.comdb-adminLectura, escritura, schemaMantenimiento de BDSiValido
bob@example.comsolo-lecturaLecturaReportesNoDesactivar cuenta
deploy-botservicioDesplegar en produccionPipeline CI/CDSiGestionado por rol IAM

3. Checklist de Cuentas de Servicio

CuentaPropositoUltimo UsoLlave RotadaAccion Requerida
backup-saBackups nocturnos2026-06-26SiNinguna
integration-saSincronizacion terceroNuncaNoRevisar o eliminar
monitoring-saIngesta de metricas2026-06-27SiNinguna

4. Hallazgos y Acciones

ID HallazgoDescripcionSeveridadDuenoFecha LimiteEstado
AC-01Dos usuarios con admin nunca lo usanMediaEquipo IAM2026-07-04Abierto
AC-02Cuenta huerfana de ex contratistaAltaSeguridad2026-06-30Abierto
AC-03MFA ausente en tres cuentas privilegiadasAltaEquipo identidad2026-07-02Abierto

5. Atestacion

CampoValor
Nombre del revisorAlice Rivera
RolEngineering manager
Fecha2026-06-27
ResultadoAprobado con condiciones
CondicionesEliminar dos cuentas huerfanas y exigir MFA en 5 dias
Proxima revision2026-09-27

Explicacion

La revision separa la identificacion del acceso de la aprobacion. Al listar cada cuenta, su rol, justificacion y necesidad, los revisores pueden detectar acumulacion de privilegios, cuentas huerfanas y MFA faltante. El paso de atestacion crea una trazabilidad de auditoria que demuestra cumplimiento.

Variantes

  • Revision de acceso privilegiado: Se enfoca solo en administradores, cuentas root y credenciales de emergencia.
  • Revision a nivel aplicacion: Revisa roles y permisos dentro de una sola aplicacion, no infraestructura.
  • Revision de IAM en la nube: Apunta a roles, politicas y grupos de AWS, Azure o GCP.
  • Revision de contratistas: Revisa acceso con duracion limitada y fechas de vencimiento.

Lo que funciona

  • Realiza revisiones trimestrales para acceso privilegiado y anuales para acceso estandar.
  • Usa como revisor un manager o dueno del sistema, nunca al titular de la cuenta.
  • Desactiva automaticamente cuentas inactivas por un periodo definido.
  • Exige MFA para todas las cuentas privilegiadas.
  • Elimina el acceso antes o en el ultimo dia del empleado.
  • Conserva registros de atestacion por al menos un anio o segun requisitos de cumplimiento.

Errores Comunes

  • Revisar acceso sin verificar si la cuenta sigue activa.
  • Permitir auto-revision de permisos propios.
  • Mantener acceso amplio despues de un cambio de rol.
  • Olvidar revisar cuentas de servicio y API keys.
  • Omitir acceso a la consola en la nube al revisar roles de aplicacion.

Troubleshooting

  • Authentication bypass in tests: ensure test users cannot reach production endpoints.
  • False positives in scanning tools: tune rules against the risk profile. Distinguish between reachable vulnerabilities and theoretical issues.
  • Secrets appear in logs: Audit log sinks for sensitive patterns.
  • CSP breaks legitimate functionality: Iterate on allowed sources based on real violations.
  • Incident response stalls: run tabletop exercises.

Soluciones Avanzadas

Revision automatizada de acceso con AWS IAM Access Analyzer

Usa AWS IAM Access Analyzer para detectar permisos no usados y generar hallazgos para revision:

#!/bin/bash
set -euo pipefail

# Generar hallazgos de access analyzer
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)

# Listar todos los usuarios IAM y su ultima actividad
echo "=== IAM Users Last Activity ==="
aws iam get-account-authorization-details --output json | \
  jq -r '.UserDetailList[] | {
    user: .UserName,
    groups: (.Groups | join(", ")),
    policies: (.AttachedManagedPolicies | map(.PolicyName) | join(", ")),
    last_used: .PasswordLastUsed
  }'

# Verificar access keys no usadas
echo ""
echo "=== Unused Access Keys (>90 days) ==="
for user in $(aws iam list-users --query 'Users[].UserName' --output text); do
  aws iam list-access-keys --user-name "$user" --output json | \
    jq -r '.AccessKeyMetadata[] | select(.Status=="Active") | "\(.UserName) \(.AccessKeyId) \(.CreateDate)"'
done

# Generar reporte de permisos no usados
echo ""
echo "=== IAM Access Analyzer Findings ==="
aws accessanalyzer list-findings --analyzer-arn "$ANALYZER_ARN" --output json | \
  jq -r '.findings[] | select(.status=="ACTIVE") | {
    resource: .resource,
    finding: .findingType,
    principal: .principal
  }'

Script de auditoria de acceso en organizacion de GitHub

Audita miembros de la organizacion de GitHub y su acceso a repositorios con la GitHub API:

#!/usr/bin/env python3
"""Auditar acceso de org de GitHub y flaggear miembros inactivos."""
import requests
import sys
from datetime import datetime, timedelta

ORG = "your-org"
TOKEN = sys.argv[1] if len(sys.argv) > 1 else ""
HEADERS = {"Authorization": f"token {TOKEN}", "Accept": "application/vnd.github+json"}

def get_org_members() -> list:
    resp = requests.get(f"https://api.github.com/orgs/{ORG}/members", headers=HEADERS)
    return resp.json()

def get_user_activity(username: str) -> dict:
    resp = requests.get(
        f"https://api.github.com/users/{username}/events",
        headers=HEADERS,
        params={"per_page": 1},
    )
    events = resp.json()
    if events:
        last_event = datetime.strptime(events[0]["created_at"], "%Y-%m-%dT%H:%M:%SZ")
        days_inactive = (datetime.utcnow() - last_event).days
        return {"username": username, "last_active": events[0]["created_at"], "days_inactive": days_inactive}
    return {"username": username, "last_active": "never", "days_inactive": 999}

def audit_members() -> None:
    members = get_org_members()
    print(f"Total org members: {len(members)}\n")
    print(f"{'Username':<25} {'Last Active':<25} {'Days Inactive':<15} {'Status'}")
    print("-" * 80)

    threshold = 90
    for member in members:
        username = member["login"]
        activity = get_user_activity(username)
        status = "REVIEW" if activity["days_inactive"] > threshold else "OK"
        print(f"{username:<25} {activity['last_active']:<25} {activity['days_inactive']:<15} {status}")

if __name__ == "__main__":
    audit_members()

Auditoria RBAC de Kubernetes con kubectl

Audita bindings RBAC de Kubernetes e identifica subjects sobre-privilegiados:

#!/bin/bash
set -euo pipefail

echo "=== ClusterRoleBindings with cluster-admin ==="
kubectl get clusterrolebindings -o json | \
  jq -r '.items[] | select(.roleRef.name=="cluster-admin") | "\(.metadata.name) -> \(.subjects[].name // "unknown")"'

echo ""
echo "=== RoleBindings per namespace ==="
for ns in $(kubectl get namespaces -o jsonpath='{.items[*].metadata.name}'); do
  echo "--- Namespace: $ns ---"
  kubectl get rolebindings -n "$ns" -o json | \
    jq -r '.items[] | "\(.metadata.name): role=\(.roleRef.name) subjects=\([.subjects[].name] | join(", "))"'
done

echo ""
echo "=== Service accounts with secrets ==="
kubectl get serviceaccounts --all-namespaces -o json | \
  jq -r '.items[] | select(.secrets != null and (.secrets | length > 0)) | "\(.metadata.namespace)/\(.metadata.name)"'

Mejores Practicas Adicionales

  1. Implementa acceso just-in-time para operaciones privilegiadas. En vez de conceder acceso admin permanente, usa elevacion just-in-time con aprobacion y limites de tiempo. Esto reduce la superficie de ataque y crea una trazabilidad auditable:
# Teleport role: acceso admin temporal con aprobacion
kind: role
metadata:
  name: jit-admin
spec:
  allow:
    node_labels: "*"
    max_session_ttl: 4h
    require_session_join: true
  1. Usa dashboards de revision de acceso para visibilidad continua. Construye un dashboard que muestre metricas de acceso en tiempo real, como numero de cuentas privilegiadas, cuentas inactivas y cobertura de MFA:
-- Query: cuentas privilegiadas sin MFA
SELECT u.username, u.role, u.last_login
FROM users u
LEFT JOIN mfa_enrollments m ON u.id = m.user_id
WHERE u.role IN ('admin', 'operator') AND m.id IS NULL
ORDER BY u.last_login DESC;

Errores Comunes Adicionales

  1. No revisar cuentas de servicio e identidades de maquina. Las cuentas de servicio suelen acumular permisos con el tiempo y rara vez se revisan. Incluyelas en cada ciclo de revision de acceso y verifica su ultimo uso:
# Verificar fecha de ultimo uso para AWS access keys
aws iam list-access-keys --user-name deploy-bot --query 'AccessKeyMetadata[].{Key:AccessKeyId, LastUsed:CreateDate, Status:Status}' --output table
  1. Confiar en spreadsheets manuales para revisiones de acceso. Los spreadsheets son propensos a errores y se desactualizan rapidamente. Usa herramientas de gobernanza de identidad o scripts que extraigan datos en vivo de tu proveedor de identidad:
# Exportar datos de acceso en vivo en vez de mantener spreadsheets
aws iam get-account-authorization-details --output json > access-snapshot-$(date +%Y%m%d).json

Puntos Clave

  • Aplica plantilla de revision de control de acceso cuando necesites una solución práctica para tu caso de uso.
  • Monitorea el rendimiento después de implementar; mide latencia, errores y uso de recursos antes y después.
  • Revisa la sección de Troubleshooting ante errores comunes; la mayoría tienen causa raíz documentada con solución.
  • Mantén dependencias actualizadas y ejecuta tests en CI para prevenir regresiones en producción.

Errores Comunes en Producción

  • Dejar campos requeridos vacíos o usar respuestas vagas de una palabra.
  • Llenar el documento una vez y nunca actualizarlo cuando cambia el alcance o las decisiones.
  • Guardar el documento donde el equipo no lo busque durante incidentes o revisiones.
  • No asignar un responsable, fecha límite o cadencia de revisión.
  • Copiar texto base sin eliminar secciones que no aplican.
  • Saltar el control de versiones, lo que impide rollback y responsabilidad.
  • No vincular el documento con decisiones relacionadas o acciones de seguimiento.
  • Evitar revisiones trimestrales que retirarían secciones obsoletas o sin uso.

Preguntas frecuentes

Que es una cuenta huerfana?
Una cuenta que permanece activa despues de que el dueno dejo la organizacion, cambio de rol o dejo de usar el servicio asociado. Son de alto riesgo y deben desactivarse o eliminarse.
Las revisiones de acceso pueden automatizarse?
Si. Herramientas de gobernanza de identidad pueden recolectar datos de acceso, disparar recordatorios y enrutar aprobaciones. Sin embargo, la atestacion humana sigue siendo requerida para la mayoria...
Que evidencia necesita un auditor?
Un registro de acceso completo, decisiones del revisor, acciones de remediacion y atestacion firmada con fechas y nombres de revisores.