Meinungen zu PAM?

Sickboy

Müßiggänger
Bisher hatte ich nicht viel mit PAM zu tun. Für ein Projekt brauche ich eine einfache Authentifizierungslösung. Ich nutze nginx als HTTP-Frontend für PostgreSQL. Die Requests müssen einen Authorization-Header schicken. Zur Zeit prüfe ich die Credentials einfach gegen eine htpasswd. Mit PAM könnte ich aber Gruppen und Read/Write-Privileges einrichten, indem ich ein Modul schreibe, dass sich die Berechtigungen aus einer SQLite holt.

Hat jemand schon mit PAM gearbeitet? Sollte man das noch nutzen?
 
Hat jemand schon mit PAM gearbeitet? Sollte man das noch nutzen?
Ich wüsste jetzt nicht, warum man das nicht mehr (?) nutzen sollte? PAM ist die Standardabstraktion für Authentifizierung am System und funktioniert wie es soll. Was ich jetzt nicht ganz verstanden habe: Willst du die Anbindung an PAM selbst programmieren, oder zielt die Frage auf etwas anderes?
 
Für nginx gibt es ein PAM-Modul. Das Authentisierungsmodul müsste ich dann aber noch selber schreiben. Sicher, ich könnte auch LDAP, Kerberos oder Shibboleth nehmen, aber das scheint mir alles riesiger Aufwand zu sein. Ich frage auch, weil PAM nun schon 25 Jahre alt ist.
 
Für nginx gibt es ein PAM-Modul. Das Authentisierungsmodul müsste ich dann aber noch selber schreiben.
Da kann ich immer noch nicht ganz folgen, ist denn ein PAM-Modul kein Authentifizierungsmodul? Authentifizierung ist doch genau das, was PAM tut ...

Sicher, ich könnte auch LDAP, Kerberos oder Shibboleth nehmen, aber das scheint mir alles riesiger Aufwand zu sein.
Hmm, Shibboleth sagt mir nichts. LDAP würde nur Sinn ergeben, wenn du ein Verzeichnis nutzen willst, das eben NICHT via PAM zur systemweiten Authentifizierung genutzt wird. Einzig Kerberos würde einen Vorteil bieten, in einem Szenario, in dem SSO gewünscht ist. Gibt aber auch ein Kerberos-Modul für PAM, vielleicht würde das auch schon reichen...

Ich frage auch, weil PAM nun schon 25 Jahre alt ist.
Das Alter spielt keine Rolle bei einem System bzw einer Software, die gepflegt wird :) Oder stellst du die Frage auch bei Unix, C, ...?

Von Codingseite habe ich noch nicht viel mit PAM gemacht, nur mal einen simplen Versuch, eine username/password Kombination in C zu validieren -- dabei ist mir aufgefallen, dass PAM komplett auf einen Terminal-Dialog mit dem User setzt für die Anmeldung, aber immerhin kann man per Callback-Funktion "Antworten" geben. Dieses Design könnte vielleicht ein kleiner Nachteil sein.
 
Bisher hatte ich nicht viel mit PAM zu tun. Für ein Projekt brauche ich eine einfache Authentifizierungslösung.

Kannst du bezüglich deines Anwendungsfalls noch etwas weiter ausholen? "Projekt" ist ein weites Feld. Davon würde auch eine konkrete Empfehlung abhängen, zumal gerade Authentifizierung und Authorisierung ein sehr übergreifendes Thema ist.

Mit PAM könnte ich aber Gruppen und Read/Write-Privileges einrichten, indem ich ein Modul schreibe, dass sich die Berechtigungen aus einer SQLite holt.

Das klingt gefährlich danach, als würdest du dir gerade dein eigenes Authentifizierungs- und Authorisierungs-Framework schreiben. Das ist ein ähnliches Minenfeld wie ein eigenes Verschlüsselungs-, Web-, Logging- oder ORM-Framework mit krassen Fallstricken, in die man früher oder später - eher früher - stolpert.

Normalerweise würde ich hier fertige Open-Source-Software wie Keycloak (und/oder Gatekeeper) oder ähnliches samt der dazugehörigen Standards (siehe unten) empfehlen - das hängt aber wieder ganz von deinen Rahmenbedinungen ab. Dafür gibt es meist auch reichlich fertige Lösungen, i.d.R. auch als fertiges PAM, wobei PAM seine ganz eigenen Probleme mit sich bringt (siehe unten).

Hat jemand schon mit PAM gearbeitet?

Ja, leider.

Sollte man das noch nutzen?

Wie üblich gilt die Antwort: kommt darauf an.

Hintergrund: PAM bringt eine Reihe von Eigenheiten/Problemen mit sich, derer man sich bewusst sein sollte und die Einsatzmöglichkeiten enorm einschränken. Wenn es was ein fertiges PAM gibt, was genau deinen Anwendungszweck erfüllt - probiere es aus und nutze es. Ansonsten würde ich eher die Finger davon lassen.

Sicher, ich könnte auch LDAP, Kerberos oder Shibboleth nehmen, aber das scheint mir alles riesiger Aufwand zu sein.

Bitte im Jahre 2020 kein Kerberos mehr einsetzen, dass hat zuviele Probleme. Es gibt OAuth 2.0 bzw. OIDC, das du im Hintergrund auch mit einfacheren Lösungen als LDAP befeuern kannst.

Ich frage auch, weil PAM nun schon 25 Jahre alt ist.

Es ist an vielen Stellen aus der Zeit gefallen und erfüllt viele moderne Anforderungen schlecht bis unzureichend. Manchmal ist es trotzdem die am wenigsten schlechte Lösung für die jeweilige Anforderung. ;)
 
Ich wollte das ngx_http_auth_pam_module für nginx einsetzen. Das schickt dann beim Aufruf einer Restricted-URL Nachrichten an ein beliebiges PAM-Modul für die Authentifizierung. Ich müsste dann nur das PAM-Modul schreiben, wahrscheinlich in C, mit irgendeiner Key-Value-Datenbank für die roles, wie LMDB oder Tokyo Cabinet (oder halt SQLite). LDAP scheint mir dagegen wahnsinnig aufwendig zu sein.

Wenn nun ein User einen HTTP-API-Call durchführt, packt dieser einfach einen HTTP-Basic-Auth-Header in den Request, nginx leitet dann Benutzername, Passwort und aufgerufene Resource an PAM, und das PAM-Modul prüft das dann.
 
Ich müsste dann nur das PAM-Modul schreiben, wahrscheinlich in C, mit irgendeiner Key-Value-Datenbank für die roles, wie LMDB oder Tokyo Cabinet (oder halt SQLite).
Ok für DAS Szenario würde ich PAM nicht nehmen. PAM ist sinnvoll, wenn du eine Authentifizierung für User des Systems haben willst (ob das dann klassisches passwd, ldap, winbind oder sonstwas ist) :)
 
Hol dir das M. W. Lucas Buch zu PAM. Solange du bereit bis Passwörter über HTTPS zu verschicken ist PAM eine gute Lösung. PAM kann verdammt kompliziert sein, aber du musst ja nicht alles nutzen. Vermutlich gibt es auch schon ein passendes PAM Modul für deinen Anwendungsfall was dir das schreiben eines eigenen Moduls ersparen würde.
 
Natürlich ist das alles mit PAM realisierbar, ich denke aber wenn man sowieso genau weiß, dass man seine User in einer Datenbank speichern will, ist so eine Komplexität vielleicht nicht nötig. OpenID Connect, wie weiter oben vorgeschlagen, halte ich hier erst recht für Overkill, zumal ich nichts von Anforderungen wie SSO oder Federation gelesen habe :)

Was mir aufgefallen ist, ist die Erwähnung von Rollen. Das ist aber normalerweise ein Autorisierungs-Thema und sollte nicht von einer Authentifizierungs-Lösung behandelt werden. IMHO is es sinnvoll, Authentifizierung in irgendeiner Form zu zentralisieren, aber Autorisierung sollte immer die Applikation selbst handhaben, die von außen nur die Information bekommt, /wer/ sie gerade benutzt.
 
Natürlich ist das alles mit PAM realisierbar, ich denke aber wenn man sowieso genau weiß, dass man seine User in einer Datenbank speichern will, ist so eine Komplexität vielleicht nicht nötig. OpenID Connect, wie weiter oben vorgeschlagen, halte ich hier erst recht für Overkill, zumal ich nichts von Anforderungen wie SSO oder Federation gelesen habe :)

Deswegen ja auch meine Frage nach mehr Information. :D
Wenn man schon mit eigenen PAM-Implementierungen anfangen will, steckt meistens deutlich mehr dahinter...

Vor einem Ausflug in die PAM-Hölle würde ich mir aber sowieso erstmal das deutlich nervenschonendere nginx-eigene http_auth_request_module anschauen.
 
Zurück
Oben