Eseguire il programma ogni volta che qualcuno accede tramite SSH in un box Linux


10

Ho un piccolo server SSH e vorrei scrivere uno script da eseguire ogni volta che qualcuno accede tramite SSH.

Ora, come potrei farlo?

Vorrei che lo script venisse eseguito ogni volta che ANYBODY accede e devo avere accesso almeno al nome utente della persona che ha effettuato l'accesso e all'indirizzo IP da cui la persona ha effettuato l'accesso.

Ho pensato di usare /etc/bash.bashrc, ma è una buona soluzione? Ad esempio, c'è un modo in cui un utente potrebbe disabilitarne l'uso e quindi disabilitare il mio script? Se sì, quali sono le altre mie opzioni?

Grazie.


Funzionerà solo se l'utente usa bash, ovviamente. Non funzionerà se gli utenti possono selezionare la propria shell.
Paŭlo Ebermann,

Risposte:


12

Il meccanismo da utilizzare dipende dai tuoi obiettivi.

Se desideri fornire qualcosa di conveniente o amichevole per i tuoi utenti, allora /etc/profileè abbastanza ragionevole se tutti i tuoi utenti usano la stessa shell. Se si desidera che i comandi vengano eseguiti solo quando si accede tramite ssh, posizionare i comandi in /etc/ssh/sshrc. (Se non ti dispiace che gli utenti abbiano la precedenza sui comandi con il proprio ~/.ssh/rcfile.)

Se si desidera forzare un utente ad eseguire un programma e un solo programma , l' ForceCommandopzione come descritta da DigitalRoss è un buon approccio. (Personalmente limiterei ulteriormente l'utente con un sistema di controllo degli accessi obbligatorio come AppArmor , SELinux , TOMOYO o SMACK , per garantire che il programma non possa consentire a un utente di fuggire. Ho lavorato su AppArmor per dieci anni, quindi è il lo sceglierei prima, ma gli altri sono ottimi strumenti scritti da programmatori eccellenti.)

Se vuoi solo eseguire un programma e non disturbare l'utente in alcun modo , l'approccio migliore è utilizzare il pam_exec(8)modulo, che non può essere bypassato, funziona indipendentemente dalla shell e offre una facile capacità di essere eseguito come utente o come utente conto del programma che esegue l'autorizzazione. La manpage fornisce il seguente esempio:

   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.

Questo potrebbe essere esteso per l'esecuzione su auth, account, password, e sessionle azioni; probabilmente sessionsarebbe meglio per l'esecuzione al momento del login. Basta aggiungere una riga come:

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

al tuo /etc/pam.d/sshdfile di controllo.


Sembra che il pam_execmodulo sia esattamente quello che sto cercando. Grazie!
houbysoft,

2
GUARDA, se il comando che esegui esce con un codice di uscita diverso da zero, il tuo login fallirà e potresti essere bloccato. Un modo per risolverlo è assicurarsi che ci sia un'altra "sessione opzionale" chiamata con un modulo diverso che ha sempre successo.
gflarity,

4

Le versioni newish di OpenSSH hanno una funzione server chiamata ForceCommand che dà il controllo a uno script invece dell'operazione (scp, ssh, ...) che l'utente intendeva. Lo script viene passato al comando originale, quindi potresti probabilmente incatenarlo dopo aver fatto tutto ciò che devi fare.

Da sshd_config (5):

ForceCommand

Forza l'esecuzione del comando specificato da ForceCommand, ignorando qualsiasi comando fornito dal client e ~ / .ssh / rc se presente. Il comando viene invocato utilizzando la shell di accesso dell'utente con l'opzione -c. Questo vale per l'esecuzione di shell, comandi o sottosistemi. È molto utile all'interno di un blocco Match. Il comando originariamente fornito dal client è disponibile nella variabile di ambiente SSH_ORIGINAL_COMMAND. Specificare un comando di `` internal-sftp '' forzerà l'uso di un server sftp in-process che non richiede file di supporto quando usato con ChrootDirectory.

L'ho usato una volta per sovrascrivere scp e fornire un caricamento sicuro delle gemme senza dare a tutti gli utenti autorizzati a caricare gemme l'accesso interattivo di cui non avevano bisogno o che non desideravano.


3

Un modo sarebbe usare syslog-ng come demone syslog e configurarlo per eseguire uno sfondo di script ogni volta che una determinata voce di registro (come un login ssh riuscito) corrisponde.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.