Autenticación y Autorización
Resumen¶
Esta guía explica protocolos y herramientas para autenticación y autorización en entornos empresariales: LDAP, OAuth2, SAML. Incluye integración con Keycloak/FreeIPA y ejemplos prácticos.
Prerrequisitos¶
- Conocimientos básicos de protocolos web (HTTP, HTTPS).
- Familiaridad con conceptos de identidad (usuarios, roles, permisos).
- Acceso a un entorno de laboratorio (VM o contenedores).
Protocolos Principales¶
LDAP (Lightweight Directory Access Protocol)¶
Protocolo estándar para acceder a directorios de usuarios.
Características¶
- Jerarquía: Estructura de árbol (OU, Groups, Users).
- Atributos: Información de usuario (cn, uid, mail).
- Operaciones: Bind, Search, Add, Modify.
Ejemplo con OpenLDAP¶
# Instalar
sudo apt install slapd ldap-utils
# Configurar dominio
sudo dpkg-reconfigure slapd
# Añadir usuario
ldapadd -x -D cn=admin,dc=example,dc=com -W -f user.ldif
Archivo user.ldif:
dn: uid=jdoe,ou=users,dc=example,dc=com
objectClass: inetOrgPerson
cn: John Doe
sn: Doe
uid: jdoe
mail: jdoe@example.com
userPassword: {SSHA}hashedpassword
OAuth2¶
Framework para autorización delegada, permite acceso limitado a recursos sin compartir credenciales.
Flujo Authorization Code¶
- Cliente solicita autorización al servidor de auth.
- Usuario se autentica y autoriza.
- Servidor devuelve code.
- Cliente intercambia code por access token.
- Cliente usa token para acceder a recursos.
Ejemplo con curl¶
# Paso 1: Obtener code (manual en browser)
# https://auth.example.com/oauth/authorize?response_type=code&client_id=client123&redirect_uri=https://app.example.com/callback
# Paso 2: Intercambiar code por token
curl -X POST https://auth.example.com/oauth/token \
-d 'grant_type=authorization_code&code=auth_code&redirect_uri=https://app.example.com/callback&client_id=client123&client_secret=secret'
# Respuesta: {"access_token":"token123","token_type":"Bearer"}
SAML (Security Assertion Markup Language)¶
Protocolo XML para intercambio de información de autenticación y autorización.
Componentes¶
- Identity Provider (IdP): Autentica usuarios.
- Service Provider (SP): Proporciona servicios.
- Assertions: Información sobre autenticación/autorización.
Flujo Básico¶
- Usuario accede a SP.
- SP redirige a IdP.
- Usuario se autentica en IdP.
- IdP envía assertion SAML a SP.
- SP valida assertion y permite acceso.
Herramientas de Gestión de Identidad¶
Keycloak¶
Servidor de identidad open-source, soporta OAuth2, SAML, LDAP.
Instalación con Docker¶
docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:latest start-dev
Configuración Básica¶
- Acceder a http://localhost:8080
- Crear realm
- Configurar clientes (OAuth2 apps)
- Crear usuarios y roles
- Configurar identity providers (LDAP, Google, etc.)
Integración con Aplicación¶
# Python con requests-oauthlib
from requests_oauthlib import OAuth2Session
client_id = 'myclient'
client_secret = 'secret'
redirect_uri = 'http://localhost:8080/callback'
oauth = OAuth2Session(client_id, redirect_uri=redirect_uri)
authorization_url, state = oauth.authorization_url('http://localhost:8080/realms/myrealm/protocol/openid-connect/auth')
# Redirigir usuario a authorization_url
FreeIPA¶
Suite integrada para gestión de identidad (LDAP + Kerberos + DNS + CA).
Instalación¶
# En CentOS/RHEL
sudo yum install freeipa-server
sudo ipa-server-install
Uso¶
# Añadir usuario
ipa user-add jdoe --first=John --last=Doe
# Añadir host
ipa host-add myserver.example.com
# Configurar sudo rules
ipa sudorule-add mysudo
ipa sudorule-add-host mysudo --hosts=myserver.example.com
Integración en Aplicaciones¶
Kubernetes con OIDC¶
# kubeconfig con OIDC
apiVersion: v1
kind: Config
clusters:
- cluster:
server: https://k8s.example.com
contexts:
- context:
cluster: kubernetes
user: oidc
current-context: oidc
users:
- name: oidc
user:
exec:
apiVersion: client.authentication.k8s.io/v1beta1
command: kubectl
args:
- oidc-login
- get-token
- --oidc-issuer-url=https://keycloak.example.com/realms/myrealm
- --oidc-client-id=kubernetes
- --oidc-client-secret=secret
Aplicación Web con JWT¶
// Verificar token JWT
const jwt = require('jsonwebtoken');
function verifyToken(req, res, next) {
const token = req.headers['authorization'];
if (!token) return res.status(403).send('Token required');
jwt.verify(token, 'secretkey', (err, decoded) => {
if (err) return res.status(401).send('Invalid token');
req.user = decoded;
next();
});
}
Mejores Prácticas¶
- Multi-Factor Authentication (MFA): Siempre activar.
- Principio de Least Privilege: Roles mínimos.
- Auditoría: Logs de autenticación y autorización.
- Certificados: Usar HTTPS y certificados válidos.
- Rotación: Cambiar secrets periódicamente.
Troubleshooting¶
# Verificar conectividad LDAP
ldapsearch -x -b "dc=example,dc=com" -D "cn=admin,dc=example,dc=com" -W
# Debug OAuth2
curl -v https://auth.example.com/.well-known/openid-configuration
# Logs de Keycloak
docker logs keycloak