Führen Sie das Programm jedes Mal aus, wenn sich jemand über SSH bei einer Linux-Box anmeldet

10

Ich habe einen kleinen SSH-Server und möchte ein Skript schreiben, das jedes Mal ausgeführt wird, wenn sich jemand über SSH anmeldet.

Wie würde ich das machen?

Ich möchte, dass das Skript jedes Mal ausgeführt wird, wenn sich JEDER anmeldet, und ich muss Zugriff auf mindestens den Benutzernamen der Person haben, die sich angemeldet hat, und auf die IP-Adresse, von der aus sich die Person angemeldet hat.

Ich habe darüber nachgedacht /etc/bash.bashrc, aber ist das eine gute Lösung? Gibt es zum Beispiel eine Möglichkeit, wie ein Benutzer seine Verwendung deaktivieren und damit mein Skript deaktivieren kann? Wenn ja, welche anderen Optionen habe ich?

Vielen Dank.

houbysoft
quelle
Dies funktioniert natürlich nur, wenn der Benutzer bash verwendet. Es funktioniert nicht, wenn die Benutzer ihre eigene Shell auswählen können.
Paŭlo Ebermann

Antworten:

12

Der zu verwendende Mechanismus hängt von Ihren Zielen ab.

Wenn Sie Ihren Benutzern etwas Bequemes oder Freundliches bieten möchten, /etc/profileist dies angemessen, wenn alle Benutzer dieselbe Shell verwenden. Wenn Sie möchten, dass die Befehle nur ausgeführt werden, wenn Sie sich über anmelden ssh, platzieren Sie Befehle in /etc/ssh/sshrc. (Wenn es Ihnen nichts ausmacht, dass Benutzer die Befehle mit ihrer eigenen ~/.ssh/rcDatei überschreiben .)

Wenn Sie einen Benutzer zwingen möchten , ein Programm und nur ein Programm auszuführen , ist die ForceCommandvon DigitalRoss beschriebene Option ein guter Ansatz. (Ich persönlich würde den Benutzer weiter auf ein obligatorisches Zugriffskontrollsystem wie AppArmor , SELinux , TOMOYO oder SMACK beschränken , um sicherzustellen, dass das Programm einem Benutzer nicht die Flucht ermöglicht. Ich habe zehn Jahre lang an AppArmor gearbeitet Werkzeug, das ich zuerst auswählen würde, aber die anderen sind gute Werkzeuge, die von exzellenten Programmierern geschrieben wurden.)

Wenn Sie nur möchten, dass ein Programm ausgeführt wird und den Benutzer in keiner Weise stört , ist es am besten, das pam_exec(8)Modul zu verwenden, das nicht umgangen werden kann, unabhängig von der Shell funktioniert und eine einfache Möglichkeit bietet, als Benutzer oder als Benutzer ausgeführt zu werden Konto des Programms, das die Autorisierung durchführt. Die Manpage gibt folgendes Beispiel:

   Add the following line to /etc/pam.d/passwd to rebuild the
   NIS database after each local password change:

               passwd optional pam_exec.so seteuid make -C /var/yp

   This will execute the command

       make -C /var/yp

   with effective user ID.

Dies könnte laufen auf verlängert werden auth, account, passwordund sessionAktionen; Dies ist wahrscheinlich sessionam besten für die Ausführung beim Anmelden geeignet. Fügen Sie einfach eine Zeile wie folgt hinzu:

session optional pam_exec.so log=/var/log/ssh_login_cmd /usr/local/bin/ssh_cmd

zu Ihrer /etc/pam.d/sshdSteuerdatei.

Sarnold
quelle
Es sieht so aus, als ob das pam_execModul genau das ist, wonach ich suche. Vielen Dank!
Houbysoft
2
WATCH OUT: Wenn der von Ihnen ausgeführte Befehl mit einem Exit-Code ungleich Null beendet wird, schlägt Ihre Anmeldung fehl und Sie könnten gesperrt werden. Eine Möglichkeit, dies zu lösen, besteht darin, sicherzustellen, dass eine andere optionale Sitzung mit einem anderen Modul aufgerufen wird, die immer erfolgreich ist.
gflarity
4

Neuere Versionen von OpenSSH verfügen über eine Serverfunktion namens ForceCommand , mit der ein Skript anstelle der vom Benutzer beabsichtigten Operation (scp, ssh, ...) gesteuert werden kann. Dem Skript wird der ursprüngliche Befehl übergeben, sodass Sie ihn wahrscheinlich verketten können, nachdem Sie alles getan haben, was Sie tun müssen.

Von sshd_config (5):

ForceCommand

Erzwingt die Ausführung des von ForceCommand angegebenen Befehls und ignoriert alle vom Client bereitgestellten Befehle und ~ / .ssh / rc, falls vorhanden. Der Befehl wird mithilfe der Anmeldeshell des Benutzers mit der Option -c aufgerufen. Dies gilt für die Ausführung von Shell-, Befehls- oder Subsystemen. Es ist am nützlichsten in einem Match-Block. Der ursprünglich vom Client bereitgestellte Befehl ist in der Umgebungsvariablen SSH_ORIGINAL_COMMAND verfügbar. Wenn Sie den Befehl "internal-sftp" angeben, wird die Verwendung eines in Bearbeitung befindlichen SFTP-Servers erzwungen, für den bei Verwendung mit ChrootDirectory keine Unterstützungsdateien erforderlich sind.

Ich habe dies einmal verwendet, um scp zu überschreiben und einen sicheren Edelstein-Upload bereitzustellen, ohne jedem Benutzer, der zum Hochladen von Edelsteinen berechtigt ist, einen interaktiven Zugriff zu gewähren, den er nicht benötigte oder wollte.

DigitalRoss
quelle
3

Eine Möglichkeit wäre, syslog-ng als Syslog-Daemon zu verwenden und es so zu konfigurieren, dass jedes Mal, wenn ein bestimmter Protokolleintrag (z. B. eine erfolgreiche SSH-Anmeldung) übereinstimmt, ein Skripthintergrund ausgeführt wird.

Janne Pikkarainen
quelle
0

Überprüfen Sie dies heraus:

http://ubuntuforums.org/showthread.php?p=9383927

Ich glaube nicht, dass es eine Möglichkeit gibt, dies vom Laufen abzuhalten. Kann jemand anderes dies überprüfen?

Schnell
quelle
Es ( /etc/profileoder ~/.profile) hängt von der Shell des Benutzers ab, nur ein bisschen weniger als bashrc. Wenn Ihre Benutzer eine Bash oder ähnliches verwenden, ist dies in Ordnung.
Paŭlo Ebermann