Ich habe ein Python-CGI-Skript geschrieben, das bash
Befehle aufruft und auf eine erfolgreiche Anmeldung auf dem Host testen muss.
Wie schreibe ich einen Test dafür?
Könnte ich beispielsweise ein bash
Skript erstellen , das eine bestimmte Kombination aus Benutzername und Kennwort gegen den auf dem Host registrierten Benutzer testet?
login
Programm ansehen .Antworten:
Die Verwendung von PAM ist die beste Lösung. Sie können kleinen C-Code schreiben oder das Python-Pam-Paket installieren und ein Python-Skript verwenden, das mit dem Python-Pam-Paket geliefert wird. Sehen
/usr/share/doc/python-pam/examples/pamtest.py
quelle
/usr/share/doc/packages/python-pam/examples/pamtest.py
Das Skript pamtest.py kann zum Testen von Anmeldeinformationen auf Systemen mit PAM verwendet werden zur Authentifizierung ist im Python-Pam-Paket enthalten (für das Python erforderlich ist), und in einigen Distributionen ist der vollständige Pfad angegeben/usr/share/doc/python-pam/examples/pamtest.py
.Der richtige Ansatz zum Testen, ob sich ein Benutzer anmelden kann, besteht darin, sich tatsächlich als dieser Benutzer anzumelden.
Ich empfehle daher, das CGI-Skript
expect
zum Ausführen zu verwendensu
, ein Kennwort zu übergeben und den Befehl auszuführen, der ausgeführt werden muss. Hier ist ein Entwurf eines Expect-Skripts, das genau dies tut (Warnung: absolut ungetestet, und ich spreche nicht fließend). Ersetzen Sie den Benutzernamen, das Passwort und den Befehl (wo ich geschrieben habebob
,swordfish
undsomecommand
); Achten Sie darauf, richtig zu zitieren.Wenn Sie den Befehl wirklich nicht über eine Ebene von ausführen möchten
su
(z. B. weil das, was Sie tun, vom CGI-Prozess selbst ausgeführt werden muss), verwenden Sie expected, um den Befehl auszuführentrue
und zu überprüfen, ob der Rückgabestatus 0 ist.Ein anderer Ansatz wäre, PAM direkt in Ihrer Anwendung über die PAM-Bindung von Python zu verwenden .
quelle
su -c true bob && echo success
schade, dass su kein passwort als argument akzeptiertsu
CGI-Skript getestet und es benötigt ein Terminal, damit es funktioniert./bin/true
wäre genug.Um genauer zu antworten: "Ist es möglich, ein Bash-Skript zu erstellen, das eine bestimmte Kombination aus Benutzername und Passwort gegen den auf dem Host registrierten Benutzer testet?"
Ja.
quelle
shadow
Gruppe ausgeführt wird, was für ein CGI nicht unbedingt empfohlen wird: Sie benötigen eine weitere Ebene der Berechtigungseskalation. Und Sie gehen von einem bestimmten Kennwort-Hashing-Algorithmus (der von openssl unterstützt wird) und einem Kennwortspeicherort (/etc/shadow
im Gegensatz zu z. B. NIS oder LDAP) aus, der möglicherweise tatsächlich für diesen bestimmten Benutzer verwendet wird oder nicht.Es gibt eine 'C', 'Python' PAM-Lösung, die hier zitiert wird. Lassen Sie mich auch die Perl-Lösung verwenden :-)
Quelle: http://search.cpan.org/~nikip/Authen-PAM-0.16/PAM/FAQ.pod#1._Can_I_authenticate_a_user_non_interactively ?
quelle
Wenn Sie Root-Zugriff haben und md5-Kennwörter verwenden und nur Kennwörter vergleichen müssen, können Sie das Perl- Modul Crypt :: PasswdMD5 verwenden . Nehmen Sie den MD5-Hash aus / etc / shadow, entfernen Sie die $ 1 $ und teilen Sie die verbleibenden $ auf. Feld 1 = Salz, Feld 2 = verschlüsselter Text. Hashing dann die Texteingabe in dein CGI, vergleiche sie mit dem verschlüsselten Text und Bob ist dein Onkel.
quelle
shadow
Gruppe ausgeführt wird, was für ein CGI nicht unbedingt empfohlen wird: Sie benötigen eine weitere Ebene der Berechtigungseskalation. Und Sie gehen von einem bestimmten Kennwort-Hashing-Algorithmus (MD5 und nicht bcrypt oder einem anderen empfohlenen Algorithmus) und einem Kennwortspeicherort (/etc/shadow
im Gegensatz zu z. B. NIS oder LDAP) aus, der möglicherweise tatsächlich für diesen bestimmten Benutzer verwendet wird oder nicht.Nach einiger Suche habe ich dieses C-Programm geschrieben, das über ein Skript verwendet werden kann
Sie kompilieren es mit:
Sie können es als verwenden
quelle
shadow
Gruppe ausgeführt wird, was für ein CGI nicht unbedingt empfohlen wird: Sie benötigen eine weitere Ebene der Berechtigungseskalation. Und Sie gehen von einem bestimmten Kennwort-Hashing-Algorithmus (der von openssl unterstützt wird) und einem Kennwortspeicherort (/etc/shadow
im Gegensatz zu z. B. NIS oder LDAP) aus, der möglicherweise tatsächlich für diesen bestimmten Benutzer verwendet wird oder nicht. Verwenden Sie PAM, es kennt seinen Job.Da Sie erwähnt haben, dass Sie CGI in Python verwenden, ist es wahrscheinlich angebracht anzunehmen, dass Sie Apache als httpd-Server verwenden. Wenn ja, überlassen Sie den Authentifizierungsprozess Ihres Programms Apache und lassen Sie nur die authentifizierten Personen Ihre CGI-Skripte / -Programme ausführen.
Es gibt zahlreiche Module, die die Authentifizierung für Sie in Apache durchführen können. Dies hängt wirklich davon ab, nach welcher Art von Authentifizierungsmechanismus Sie suchen. Die Art und Weise, wie Sie in der Frage zitiert haben, scheint mit der Authentifizierung des lokalen Hostkontos basierend auf / etc / passwd, Shadow-Dateien, in Zusammenhang zu stehen. Modul, das zu meiner Schnellsuche dazu kommt, ist
mod_auth_shadow
. Der Vorteil besteht darin, dass Sie einer autorisierenden Person (die auf dem Berechtigungsport 80 ausgeführt wird) erlauben, den Benutzer / das Kennwort für Sie zu authentifizieren, und dass Sie sich bei Bedarf auf authentifizierte Informationen des Benutzers verlassen können, um die Befehle im Namen des Benutzers auszuführen.Gute Links zum Starten:
http://adam.shand.net/archives/2008/apache_tips_and_tricks/#index5h2
http://mod-auth-shadow.sourceforge.net/
http://www.howtoforge.com/apache_mod_auth_shadow_debian_ubuntu
Ein anderer Ansatz ist die Verwendung des SuEXEc-Moduls von Apache, das Prozesse (CGI-Programme) im Auftrag des authentifizierten Benutzers ausführt.
quelle
Dieser Code mit PAM hat bei mir funktioniert:
quelle
Wenn Sie ein Skript benötigen, um sich bei einem Host anzumelden, können Sie am besten einen SSH-Schlüssel zwischen den Hosts konfigurieren.
Link: http://pkeck.myweb.uga.edu/ssh/
Ich habe das so ziemlich von der Seite gehoben
Installieren Sie OpenSSH zunächst mühelos auf zwei UNIX-Computern. Soweit ich das beurteilen kann, funktioniert dies am besten mit DSA-Schlüsseln und SSH2. Alle anderen HOWTOs, die ich gesehen habe, scheinen sich mit RSA-Schlüsseln und SSH1 zu befassen, und die Anweisungen funktionieren nicht überraschend nicht mit SSH2. Geben Sie auf jedem Computer ssh somemachine.example.com ein und stellen Sie eine Verbindung mit Ihrem regulären Passwort her. Dadurch wird ein .ssh-Verzeichnis in Ihrem Home-Verzeichnis mit den richtigen Dauerwellen erstellt. Geben Sie auf Ihrem primären Computer, auf dem Ihre geheimen Schlüssel gespeichert werden sollen (sagen wir Hurly), ein
Dies fordert Sie zur Eingabe einer geheimen Passphrase auf. Wenn dies Ihr primärer Identitätsschlüssel ist, stellen Sie sicher, dass Sie eine gute Passphrase verwenden. Wenn dies richtig funktioniert, erhalten Sie zwei Dateien mit den Namen id_dsa und id_dsa.pub in Ihrem .ssh-Verzeichnis. Hinweis: Sie können einfach die Eingabetaste drücken, wenn Sie zur Eingabe einer Passphrase aufgefordert werden. Dadurch wird eine Taste ohne Passphrase erstellt. Dies ist eine schlechte Idee ™ für einen Identitätsschlüssel. Tun Sie es also nicht! Weiter unten finden Sie Informationen zur Verwendung von Schlüsseln ohne Passphrasen.
Kopieren Sie die Datei id_dsa.pub in das .ssh-Verzeichnis des anderen Hosts mit dem Namen authorisation_keys2. Jetzt ist Burly bereit, Ihren SSH-Schlüssel zu akzeptieren. Wie kann man feststellen, welche Schlüssel verwendet werden sollen? Der Befehl ssh-add erledigt dies. Geben Sie für einen Test Folgendes ein
Dadurch wird der ssh-Agent gestartet, Ihre Standardidentität hinzugefügt (Sie werden zur Eingabe Ihrer Passphrase aufgefordert) und eine Bash-Shell erzeugt. Von dieser neuen Shell sollten Sie in der Lage sein:
Sie sollten sich anmelden können
quelle