2 min de lectura

Seguridad y Autenticación

PgArachne se basa completamente en el sistema de permisos de PostgreSQL. No reinventa las Listas de Control de Acceso (ACLs). Todas las consultas se ejecutan bajo el rol de base de datos específico del usuario autenticado usando SET LOCAL ROLE.

1. Inicio de Sesión Interactivo (JWT)

Los usuarios se autentican usando su nombre de usuario y contraseña reales de PostgreSQL a través de la función de inicio de sesión. Si tiene éxito, reciben un JWT genérico. Cuando se usa este token, PgArachne cambia el rol activo a ese usuario durante la duración de la petición.

2. Cuentas de Servicio (Tokens de API)

Para sistemas automatizados o scripts, puedes usar tokens de API de larga duración.

  • Los tokens se almacenan en la tabla pgarachne.api_tokens.
  • Cada token se asigna a un usuario/rol de base de datos específico.
  • Envía el token a través del encabezado Authorization: Bearer <token>.

Crear tokens API requiere pgarachne_admin. Usa pgarachne.add_api_token(...) con un rol que sea miembro de pgarachne_admin.

3. Proveedor de identidad externo (JWT propio)

Si autenticas usuarios fuera de PgArachne (por ejemplo con un servicio de autenticación externo), puedes emitir JWT allí y enviarlos directamente a PgArachne.

  • Formato del header: Authorization: Bearer <jwt>.
  • Firma: solo HMAC (HS256/HS384/HS512) con el mismo JWT_SECRET configurado en PgArachne.
  • Claims obligatorios: db_role (string, no vacío) y db_name (string, debe coincidir con /api/:database).
  • Claim recomendado: exp (timestamp Unix) para expiración del token.

Ejemplo mínimo de payload:

{
  "db_role": "demo_user",
  "db_name": "my_database",
  "exp": 1767225600
}

Importante: los algoritmos JWT asimétricos (por ejemplo RS256/ES256) no son aceptados por la implementación actual del servidor.

Configuración Crítica: Privilegios del Proxy

Dado que PgArachne se conecta como el usuario definido en DB_USER (ej. pgarachne) y cambia la identidad a otros usuarios, el usuario proxy debe ser miembro de esos roles objetivo.

Ejecuta este SQL para cada usuario/rol que necesite iniciar sesión:

-- Permitir a 'pgarachne' cambiar a 'demo_user'
GRANT demo_user TO pgarachne;

Ver también