Ich habe eine Legacy-App, die einen Benutzernamen / eine Passwortanforderung asynchron über die Leitung erhält. Da ich den Benutzernamen und das Passwort bereits als Variablen gespeichert habe, was wäre der beste Weg zur Authentifizierung mit PAM unter Linux (Debian 6)?
Ich habe versucht, meine eigene Konversationsfunktion zu schreiben, aber ich bin mir nicht sicher, wie ich das Passwort am besten dazubekomme. Ich habe darüber nachgedacht, es in appdata zu speichern und auf das von der pam_conv-Struktur zu verweisen, aber es gibt fast keine Dokumentation darüber, wie man das macht.
Gibt es eine einfachere Möglichkeit, Benutzer ohne Overkill einer Konversationsfunktion zu authentifizieren? Ich kann pam_set_data auch nicht erfolgreich verwenden, und ich bin mir nicht sicher, ob das überhaupt angebracht ist.
Folgendes mache ich:
%Vor%Und es ergaben sich erste Versuche zur Konversationsfunktion (Passwort ist zum Testen fest codiert):
%Vor%Jede Hilfe wäre willkommen. Danke!
Die Art, wie Standardinformationen (z. B. ein Kennwort) für PAM übergeben werden, besteht darin, Variablen zu verwenden, die im Pam-Handle mit pam_set_item festgelegt sind (siehe Manpage für pam_set_item).
Sie können festlegen, was Ihre Anwendung später im pam_stack verwenden soll. Wenn Sie das Passwort in den pam_stack setzen wollen, sollten Sie dies sofort nach dem Aufruf von pam_start () tun können, indem Sie die Variable PAM_AUTHTOK ähnlich dem folgenden Pseudocode in den Stack setzen:
%Vor%Dadurch wird das Passwort auf dem Stack jedem Modul zur Verfügung gestellt, das es verwenden möchte. In der Regel müssen Sie dem Modul jedoch mitteilen, dass es es verwenden soll, indem Sie die Standardoptionen use_first_pass oder try_first_pass in der pam_configuration für den Service festlegen Fall /etc/pam.d/common-auth).
Das Standardmodul pam_unix unterstützt try_first_pass, sodass es nicht schaden würde, es in Ihre PAM-Konfiguration auf Ihrem System einzufügen (am Ende der Zeile für pam_unix).
Nachdem Sie dies getan haben, sollte jeder Aufruf von pam_authenticate () , der vom common-auth-Dienst aufgerufen wird, einfach das Passwort hochgehen und mitgehen.
Eine kleine Anmerkung über den Unterschied zwischen use_first_pass und try_first_pass: Beide sagen dem Modul (in diesem Fall pam_unix), das Passwort auf dem pam_stack auszuprobieren, aber sie unterscheiden sich im Verhalten, wenn sie kein password / AUTHTOK haben. In dem fehlenden Fall schlägt use_first_pass fehl und try_first_pass erlaubt dem Modul, nach einem Passwort zu fragen.
Fantius 'Lösung funktionierte für mich, sogar als root.
Ich habe mich ursprünglich für Johns Lösung entschieden, da es sauberer war und PAM-Variablen ohne die Konversationsfunktion verwendet hat (wirklich, hier ist es nicht nötig), aber es hat nicht funktioniert und wird auch nicht funktionieren. Wie Adam Badura in beiden Beiträgen erwähnt, hat PAM einige interne Überprüfungen, um die direkte Einstellung von PAM_AUTHTOK zu verhindern.
Johns Lösung wird zu einem ähnlichen Verhalten führen wie hier , wo sich jeder Passwort-Wert anmelden darf ( auch wenn Sie die Variable pam_conv deklarieren, aber nicht definieren.
Ich würde den Benutzern auch empfehlen, sich der Platzierung des malloc bewusst zu sein, da es sich wahrscheinlich in Ihrer Anwendung unterscheiden wird (denken Sie daran, dass der obige Code eher ein Test / eine Vorlage ist als alles andere).
Tags und Links c c++ linux authentication pam