2 min di lettura

Sicurezza e Autenticazione

PgArachne si affida interamente al sistema di permessi di PostgreSQL. Non reinventa le Liste di Controllo degli Accessi (ACL). Tutte le query vengono eseguite sotto il ruolo database specifico dell’utente autenticato utilizzando SET LOCAL ROLE.

1. Login Interattivo (JWT)

Gli utenti si autenticano utilizzando il loro reale nome utente e password PostgreSQL tramite la funzione di login. In caso di successo, ricevono un JWT generico. Quando questo token viene utilizzato, PgArachne cambia il ruolo attivo in quell’utente per la durata della richiesta.

2. Account di Servizio (Token API)

Per sistemi automatizzati o script, puoi utilizzare token API a lunga durata.

  • I token sono memorizzati nella tabella pgarachne.api_tokens.
  • Ogni token è mappato a un utente/ruolo database specifico.
  • Invia il token tramite l’header Authorization: Bearer <token>.

La creazione di token API richiede pgarachne_admin. Usa pgarachne.add_api_token(...) con un ruolo membro di pgarachne_admin.

3. Identity provider esterno (JWT personalizzato)

Se autentichi gli utenti fuori da PgArachne (ad esempio con un servizio di autenticazione esterno), puoi generare lì i JWT e inviarli direttamente a PgArachne.

  • Formato header: Authorization: Bearer <jwt>.
  • Firma: solo HMAC (HS256/HS384/HS512) con lo stesso JWT_SECRET configurato in PgArachne.
  • Claim obbligatori: db_role (stringa non vuota) e db_name (stringa che deve corrispondere a /api/:database).
  • Claim consigliato: exp (timestamp Unix) per la scadenza del token.

Esempio minimo di payload:

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

Importante: gli algoritmi JWT asimmetrici (ad esempio RS256/ES256) non sono accettati dall’implementazione attuale del server.

Configurazione Critica: Privilegi Proxy

Poiché PgArachne si connette come l’utente definito in DB_USER (es. pgarachne) e cambia identità in altri utenti, l’utente proxy deve essere membro di quei ruoli di destinazione.

Esegui questo SQL per ogni utente/ruolo che deve accedere:

-- Consenti a 'pgarachne' di passare a 'demo_user'
GRANT demo_user TO pgarachne;

Vedi anche