Sicherheit & Authentifizierung

3 Min. Lesezeit

Sicherheit & Authentifizierung

PgArachne verlässt sich vollständig auf das PostgreSQL-Berechtigungssystem. Es erfindet keine Access Control Lists (ACLs) neu. PgArachne unterstützt vier Authentifizierungsmethoden. Die Methoden 1–3 verwenden SET LOCAL ROLE, um die Identität zu wechseln; Methode 4 (direkte Zugangsdaten) verbindet sich direkt als der jeweilige Benutzer, sodass kein Rollenwechsel nötig ist.

1. Interaktives Login (JWT)

Benutzer authentifizieren sich mit ihrem echten PostgreSQL-Benutzernamen und -Passwort über die JSON-RPC-Methode get_jwt. Bei Erfolg erhalten sie ein kurzlebiges JWT. Nachfolgende Anfragen übermitteln dieses Token im Header Authorization: Bearer <token>, und PgArachne wechselt die aktive Rolle für die Dauer jeder Anfrage zu diesem Benutzer.

2. Service-Konten (API-Token)

Für automatisierte Systeme oder Skripte werden langlebige API-Token empfohlen.

  • Token werden in der Tabelle pgarachne.api_tokens gespeichert.
  • Jedes Token ist einer bestimmten Datenbankrolle zugeordnet.
  • Senden Sie das Token über den Header Authorization: Bearer <token>.

Das Erstellen von API‑Tokens erfordert pgarachne_admin. Verwenden Sie pgarachne.add_api_token(...) mit einer Rolle, die Mitglied von pgarachne_admin ist.

3. Externer Identity Provider (eigenes JWT)

Wenn Benutzer außerhalb von PgArachne authentifiziert werden (z. B. über einen externen Auth-Dienst), kann dieser Dienst dort JWTs ausstellen und direkt an PgArachne senden.

  • Header-Format: Authorization: Bearer <jwt>.
  • Signatur: nur HMAC (HS256 / HS384 / HS512) mit demselben JWT_SECRET, der in PgArachne konfiguriert ist.
  • Pflicht-Claims: db_role (String, nicht leer) und db_name (String, muss mit dem :database-Pfadsegment übereinstimmen).
  • Empfohlener Claim: exp (Unix-Timestamp) für das Ablaufdatum.

Minimales Payload-Beispiel:

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

Hinweis: asymmetrische JWT-Algorithmen (z. B. RS256 / ES256) werden nicht unterstützt.

4. Direkte Datenbankzugangsdaten (Basic Auth)

Die einfachste Option: Senden Sie den PostgreSQL-Benutzernamen und das Passwort mit jeder Anfrage über Standard-HTTP-Basic-Authentifizierung. PgArachne öffnet einen dedizierten Connection-Pool, der direkt als dieser Benutzer authentifiziert ist — SET LOCAL ROLE wird nicht ausgeführt.

Authorization: Basic <base64(username:password)>

Beispiel mit curl:

curl -X POST http://localhost:8080/db/my_database/jsonrpc \
  -u demo_user:user_password \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"api.hello_world","params":{},"id":1}'
Wann Sie direkte Zugangsdaten verwenden sollten:
  • Schnelles Prototyping und lokale Entwicklung — kein Token-Management erforderlich.
  • Interne Dienste, die Zugangsdaten bereits sicher verwalten.
  • Szenarien, in denen das vorherige Ausstellen eines JWT unnötige Komplexität hinzufügt.

Wesentliche Unterschiede zu den token-basierten Methoden:

  • Es ist kein GRANT demo_user TO pgarachne erforderlich — PgArachne wechselt keine Rollen.
  • PostgreSQL Row-Level Security und GRANT-Berechtigungen werden wie gewohnt durchgesetzt, da die Verbindung als der tatsächliche Benutzer läuft.
  • Verbindungs-Pools werden pro Benutzer für maximal 5 Minuten vorgehalten. Nach einer Passwortänderung laufen alte Verbindungen innerhalb dieses Zeitfensters ab.
  • Damit Idempotency Keys mit direkten Zugangsdaten funktionieren, erteilen Sie dem Benutzer EXECUTE ON FUNCTION pgarachne.save_idempotency_key(text).

Proxy-Privilegien: Nur für Methoden 1–3 erforderlich

Bei der JWT- und API-Token-Authentifizierung verbindet sich PgArachne als der in DB_USER definierte Systembenutzer (z. B. pgarachne) und wechselt die Identität über SET LOCAL ROLE. Der Systembenutzer muss Mitglied jeder Zielrolle sein.

-- Required for JWT / API-token auth only:
GRANT demo_user TO pgarachne;

Dieses GRANT ist nicht erforderlich, wenn Sie direkte Zugangsdaten (Methode 4) verwenden.

Vergleich der Authentifizierungsmethoden

MethodeHeaderSET LOCAL ROLEGRANT … TO pgarachneAm besten für
JWT (get_jwt)Bearer <jwt>✅ JaErforderlichEndnutzer-Sitzungen
API-TokenBearer <token>✅ JaErforderlichAutomatisierte Dienste
Externes JWTBearer <jwt>✅ JaErforderlichIntegration externer Identity Provider
Direkte ZugangsdatenBasic <b64>❌ NeinNicht erforderlichEntwicklung, interne Dienste

Siehe auch