Ident-Authentifizierung unter PostgreSQL

ident_authentification

Unter PostgreSQL können mehrere Verfahren zur Authentifizierung eines Users zum Einsatz kommen. Üblicherweise werden interne Datenbank-User zur Authentifizierung am Datenbankcluster verwendet, die über eigene Passwörter verfügen.

Eine etwas andere Variante ist die Ident Authentication. Hierbei wird der Name eines Client-Betriebssystembenutzers über einen Ident-Server ermittelt, und, sofern berechtigt, für den Zugriff zur Datenbank verwendet. Mit dem Ident-Protokoll kann ein Server feststellen, welcher User eine bestimmte TCP-Verbindung geöffnet hat. Die Datenbank vertraut in diesem Fall dem Client-Betriebssystem bzw. verlagert die Authentifizierung auf dieses. In diesem Artikel wird die Einrichtung einer solchen Verbindung beschrieben.

Um im Anschluss zu verdeutlichen, dass es sich bei den benutzten Namen zwischen Betriebssystem und Datenbank um unterschiedliche User handelt, wird außerdem noch ein User-Mapping verwendet, einem optionalen Zusatz des Ident-Verfahrens.

Der User wird dazu zunächst im Client-Betriebssystem als root angelegt:

bash> useradd ordix -g users -m 
Die nächsten Schritte führen wir nun als User postgres auf dem Datenbankserver aus. Zunächst legen wir einen Datenbankuser pguser an:
bash> createuser pguser --login 
Im PGDATA-Verzeichnis des Datenbank-Clusters editieren wir die Datei pg_ident.conf und erstellen ein simples User-Mapping zwischen dem OS-User des Clients und dem Datenbank-User:
# MAPNAME       SYSTEM-USERNAME         PG-USERNAME
mapping         ordix                   pguser 
Zusätzlich muss in der pg_hba.conf ein Eintrag zur Verwendung des Mappings vorhanden sein. Ein Zugriff mit der Ident-Methode muss immer über das Netzwerk geschehen, daher verwenden wir einen host-Eintrag:
# TYPE   DATABASE        USER        ADDRESS       METHOD OPTION
host     all             all         samenet       ident  map=mapping

bash> psql
postgres=# alter system set log_connections TO on;
ALTER SYSTEM 
Um die Änderungen an den Konfigurationsdateien zu aktivieren, reicht es, die diese neu einzulesen.
bash> pg_ctl reload 
Wenn wir jetzt versuchen, uns vom User ordix aus anzumelden, schlägt dies allerdings immer noch fehl. Das Postgres-Environment zur Anmeldung wurde bereits über die .bash_profile geladen.
bash> su - ordix
bash> psql -d postgres -h dbhost.ordix.de -U pguser 
psql: FATAL:  Ident-Authentifizierung für Benutzer » pguser« fehlgeschlagen 

Ein Blick in die Server-Logdatei zeigt uns auch, warum:

2020-04-17 12:44:43.894 CEST [unbekannt] [unbekannt] [16203]LOG:  Verbindung empfangen: Host=192.168.78.133 Port=54894
2020-04-17 12:44:43.895 CEST postgres pguser [16203]LOG:  konnte nicht mit Ident-Server auf Adresse »192.168.78.133«, Port 113 verbinden: Verbindungsaufbau abgelehnt
2020-04-17 12:44:43.895 CEST postgres pguser [16203]FATAL:  Ident-Authentifizierung für Benutzer »pguser« fehlgeschlagen
2020-04-17 12:44:43.895 CEST postgres pguser [16203]DETAIL:  Verbindung stimmte mit pg_hba.conf-Zeile 89 überein: »host    all             all             samenet                 ident map=mapping«  

Der erwähnte Port 113 ist der Standardport des Ident-Servers, welcher auf dem Client allerdings noch nicht läuft und daher gestartet werden muss. In unserem konkreten Fall ist er tatsächlich noch gar nicht installiert.

Da wir im Beispiel unter SUSE Linux arbeiten, installieren wir zunächst das zugehörige Paket mit zypper in einer root-Session, wieder auf dem Client:

bash > zypper install pidentd
Refreshing service 'SMT-http_ordix_de'.
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following NEW package is going to be installed:
  pidentd

1 new package to install.
Overall download size: 63.1 KiB. Already cached: 0 B. After the operation,
additional 168.2 KiB will be used.
Continue? [y/n/...? shows all options] (y): y
Retrieving package pidentd-3.1a25-342.176.x86_64
                                           (1/1),  63.1 KiB (168.2 KiB unpacked)
Retrieving: pidentd-3.1a25-342.176.x86_64.rpm ............................[done]
Checking for file conflicts: .............................................[done]
(1/1) Installing: pidentd-3.1a25-342.176.x86_64 ..........................[done] 
Im Anschluss muss der Dienst gestartet und für den Neustart aktiviert werden:
bash> /etc/init.d/identd start
redirecting to systemctl start identd.service

bash> systemctl enable identd.service
identd.service is not a native service, redirecting to systemd-sysv-install
Executing /usr/lib/systemd/systemd-sysv-install enable identd
bash> systemctl status identd.service
● identd.service - LSB: Start identd
   Loaded: loaded (/etc/init.d/identd; bad; vendor preset: disabled)
   Active: active (running) since Fri 2020-04-17 11:24:16 CEST; 37min ago
     Docs: man:systemd-sysv-generator(8)
    Tasks: 3 (limit: 512)
   CGroup: /system.slice/identd.service
           └─11856 /usr/sbin/in.identd -e

Apr 17 11:24:16 linux-kh5d systemd[1]: Starting LSB: Start identd...
Apr 17 11:24:16 linux-kh5d in.identd[11856]: started
Apr 17 11:24:16 linux-kh5d identd[11846]: Starting identd..done
Apr 17 11:24:16 linux-kh5d systemd[1]: Started LSB: Start identd. 

Jetzt läuft der Ident-Server:

bash> netstat -anp|grep ident
tcp        0      0 :::113                  :::*                    LISTEN      22935/in.identd
unix  2      [ ]         DGRAM                    170506 22935/in.identd 

Nun melden wir uns als User ordix am System an und versuchen erneut, uns zu verbinden

bash> su - ordix
bash> psql -d postgres -U pguser -h dbhost.ordix.de
psql (10.4)
Geben Sie »help« für Hilfe ein.

postgres=> \conninfo
Sie sind verbunden mit der Datenbank »postgres« als Benutzer »pguser« auf Host »dbhost.ordix.de« auf Port »2345«. 

Man beachte allerdings bei dieser ganzen Geschichte folgendes: Es wird in der Dokumentation explizit darauf hingewiesen, dass sich diese Methode nur für geschlossene Netzwerke eignet, in denen dem Client-Rechner, auf dem der Ident-Server ausgeführt wird, vertraut wird. Anderenfalls kann ein Angreifer dies nämlich nutzen, um dem Datenbank-Server eine falsche Identität vorzutäuschen.

Fazit

Die Authentifizierung mittels eines User-Mappings funktioniert tadellos, sollte aber nur in gut gesicherten und überwachten Umgebungen verwendet werden.

Links

By accepting you will be accessing a service provided by a third-party external to https://blog.ordix.de/