Ident-Authentifizierung unter PostgreSQL
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
bash> createuser pguser --login
# MAPNAME SYSTEM-USERNAME PG-USERNAME mapping ordix pguser
# 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
bash> pg_ctl reload
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]
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
Seminarempfehlung
Sie haben Interesse an einer Weiterbildung oder Fragen zum Thema PostgreSQL? Sprechen Sie uns an oder besuchen Sie einen unserer Kurse aus unserem Seminarshop:
Zu unseren PostgreSQL Seminaren
Senior Chief Consultant bei ORDIX
Bei Updates im Blog, informieren wir per E-Mail.
Kommentare