Wie kann ein Benutzer ohne PAM richtig authentifiziert werden?

Wie kann ein Benutzer ohne PAM richtig authentifiziert werden?

da meine entsprechende Frage anscheinend nicht viel Beachtung findet, hier noch eine: Was ist heutzutage die richtige Art, einen Benutzer unter Linux über die Eingabeaufforderung für Benutzername/Passwort zu authentifizieren?

Im Prinzip müsste ich wohl Benutzernamen und Passwort abrufen, Salt und Hash des entsprechenden Benutzers aus auslesen /etc/shadow. Anschließend würde ich den Hash des angegebenen Passworts und des gespeicherten Salts berechnen und prüfen, ob das Ergebnis mit dem in gespeicherten Hash übereinstimmt /etc/shadow.

Normalerweise könnte ich mich einfach über PAM authentifizieren (z. B. pam_unix), das all dies bereits erledigt, aber meine Anwendung ist ein benutzerdefiniertes PAM-Modul und ich habe keine Methode gefunden, ein PAM-Modul von einem anderen aus aufzurufen. Wenn dies irgendwie möglich ist, würde ich diese Lösung gerne wählen.

Ab sofort fand ich dieses wirklich veraltete Tutorialhttp://www.tldp.org/HOWTO/Shadow-Password-HOWTO-8.htmlvon 1996, als die Shadow-Unterstützung offenbar noch nicht in libc integriert war. Darin werden pw_authund validals Hilfsfunktionen für die Authentifizierung erwähnt. Ich habe versucht, diese in meinen Code einzufügen und mit libshadow.aeinem der Shadow-Tools zu verknüpfen, aber ich erhalte Fehlermeldungen wegen „nicht aufgelöster externer Referenz“ für pw_authund valid. Der Code sieht ungefähr so ​​aus:

if ((pw->pw_passwd && pw->pw_passwd[0] == '@'
     && pw_auth (pw->pw_passwd+1, pw->pw_name, PW_LOGIN, NULL))
    || !valid (passwd, pw)) {
    return (UPAP_AUTHNAK);
}

Ich habe das nicht weiter geprüft, aber es ist trotzdem keine bevorzugte Lösung, da ich meinen Code jedes Mal aktualisieren müsste, wenn die Shadow-Utils aktualisiert werden.

Ich würde viel lieber auf eine Bibliothek (die nicht PAM ist) verlinken, die eine Authentifizierung gegen bietet /etc/shadow. Gibt es so etwas und ich habe es noch nicht gefunden? Oder eine andere Lösung?

Antwort1

Ihre Angst vor einem Update der Shadow-Utils ist meiner Meinung nach unbegründet. Die in diesem HOWTO beschriebenen Routinen sind auf meinen Ubuntu 12.04- und Mint 17-Systemen verfügbar, ohne dass etwas Besonderes installiert werden muss.

Die Struktur zum Lesen /etc/shadowvon Informationen in einem C-Programm finden Sie in /usr/include/shadow.hund mit man 5 shadow. Die Funktionen, die Sie benötigen, um z. B. einen Shadow-Passworteintrag nach Namen zu finden, wie in definiert, /usr/include/shadow.hsind getspnamund damit erhalten Sie auch eine Manpage ( man getspnam), die diesen und alle zugehörigen Funktionen beschreibt.

Auf dieser Grundlage sollten Sie in der Lage sein, den gehashten Passworteintrag für jeden beliebigen Namen abzurufen. Das gehashte Passwort sollte mehrere '$'-Token enthalten, alles nach und einschließlich des letzten '$' aus dem gehashten Passwort abschneiden und dies als Salt an präsentieren. crypt()Die Glibc-Version (gemäß man 3 crypt) sollte in der Lage sein, die „erweiterten“ Salts zu verarbeiten, die SHA512-Einträge anzeigen, wie sie heutzutage üblicher sind.

verwandte Informationen