Wykonuj program za każdym razem, gdy ktoś loguje się przez SSH do Linux-a

10

Mam mały serwer SSH i chciałbym napisać skrypt uruchamiający się za każdym razem, gdy ktoś loguje się za pośrednictwem SSH.

Jak mam to zrobić?

Chciałbym, aby skrypt był uruchamiany za każdym razem, gdy KAŻDY się loguje, i muszę mieć dostęp do co najmniej nazwy użytkownika, który się zalogował, oraz adresu IP osoby, z której się zalogowałem.

Myślałem o użyciu /etc/bash.bashrc, ale czy to dobre rozwiązanie? Na przykład, czy istnieje sposób, aby użytkownik mógł wyłączyć jego użycie, a tym samym wyłączyć mój skrypt? Jeśli tak, jakie są moje inne opcje?

Dzięki.

houbysoft
źródło
Działa to tylko wtedy, gdy użytkownik używa bash, oczywiście. Nie będzie działać, jeśli użytkownicy będą mogli wybrać własną powłokę.
Paulo Ebermann

Odpowiedzi:

12

Mechanizm, który należy zastosować, zależy od twoich celów.

Jeśli chcesz zapewnić użytkownikom coś wygodnego lub przyjaznego , to /etc/profilejest wystarczająco rozsądne, jeśli wszyscy użytkownicy używają tej samej powłoki. Jeśli chcesz, aby polecenia były wykonywane tylko podczas logowania przez ssh, umieść je w /etc/ssh/sshrc. (Jeśli nie masz nic przeciwko użytkownikom nadpisującym polecenia własnym ~/.ssh/rcplikiem).

Jeśli chcesz zmusić użytkownika do uruchomienia jednego programu i tylko jednego programu , ForceCommanddobrym rozwiązaniem jest opcja opisana przez DigitalRoss. (Osobiście ograniczyłem użytkownika do obowiązkowego systemu kontroli dostępu , takiego jak AppArmor , SELinux , TOMOYO lub SMACK , aby upewnić się, że program nie może pozwolić użytkownikowi na ucieczkę. Pracowałem nad AppArmor od dziesięciu lat, więc to jest narzędzie, które wybrałbym jako pierwsze, ale pozostałe są świetnymi narzędziami napisanymi przez doskonałych programistów.)

Jeśli chcesz, aby jeden program był wykonywany i nie przeszkadzał użytkownikowi w jakikolwiek sposób , najlepszym rozwiązaniem jest użycie pam_exec(8)modułu, którego nie można ominąć, działa niezależnie od powłoki i zapewnia łatwą możliwość uruchamiania jako użytkownik lub jako użytkownik konto programu wykonującego autoryzację. Strona man podaje następujący przykład:

   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.

To może być przedłużony do uruchomienia na auth, account, password, i sessiondziałania; prawdopodobnie sessionbyłby najlepszy do wykonania po zalogowaniu. Po prostu dodaj wiersz:

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

do /etc/pam.d/sshdpliku kontrolnego.

Sarnold
źródło
Wygląda na to, że pam_execmoduł jest dokładnie tym, czego szukam. Dzięki!
houbysoft
2
OGLĄDAJ, jeśli wykonane polecenie zakończy się z niezerowym kodem wyjścia, logowanie się nie powiedzie i możesz zostać zablokowany. Jednym ze sposobów rozwiązania tego jest upewnienie się, że istnieje inna „sesja opcjonalna” wywoływana z innym modułem, który zawsze się udaje.
gflarity
4

Nowe wersje OpenSSH mają funkcję serwera o nazwie ForceCommand, która daje kontrolę nad skryptem zamiast operacji (scp, ssh, ...) zamierzonej przez użytkownika. Skrypt jest przekazywany z oryginalną komendą, więc prawdopodobnie możesz do niego dołączyć po zrobieniu wszystkiego, co musisz zrobić.

Z sshd_config (5):

ForceCommand

Wymusza wykonanie polecenia określonego przez ForceCommand, ignorując każde polecenie dostarczone przez klienta i ~ / .ssh / rc, jeśli są obecne. Polecenie jest wywoływane przy użyciu powłoki logowania użytkownika z opcją -c. Dotyczy to wykonania powłoki, polecenia lub podsystemu. Jest to najbardziej przydatne w bloku meczów. Polecenie pierwotnie dostarczone przez klienta jest dostępne w zmiennej środowiska SSH_ORIGINAL_COMMAND. Podanie komendy `` internal-sftp '' wymusi użycie wewnętrznego serwera sftp, który nie wymaga plików pomocniczych, gdy jest używany z ChrootDirectory.

Użyłem tego raz, aby zastąpić scp i zapewnić bezpieczne przesyłanie klejnotów, nie dając każdemu użytkownikowi upoważnionego do przesyłania klejnotów interaktywnego dostępu, którego nie potrzebowali ani nie chcieli.

DigitalRoss
źródło
3

Jednym ze sposobów byłoby użycie syslog-ng jako demona syslog i skonfigurowanie go do uruchamiania tła skryptu za każdym razem, gdy określony wpis dziennika (taki jak pomyślne logowanie ssh) jest zgodny.

Janne Pikkarainen
źródło
0

Spójrz na to:

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

Nie wierzę, że istnieje sposób na wyłączenie tego działania. Czy ktoś może to zweryfikować?

Szybki
źródło
To ( /etc/profilelub ~/.profile) zależy od powłoki użytkownika, tylko trochę mniej niż bashrc. Jeśli twoi użytkownicy używają bash lub podobnego, to jest w porządku.
Paŭlo Ebermann