Exécuter le programme chaque fois que quelqu'un se connecte via SSH dans une boîte Linux

10

J'ai un petit serveur SSH et j'aimerais écrire un script à exécuter chaque fois que quelqu'un se connecte via SSH.

Maintenant, comment pourrais-je m'y prendre?

J'aimerais que le script s'exécute à chaque fois que ANYBODY se connecte, et je dois avoir accès au moins au nom d'utilisateur de la personne qui s'est connectée et à l'adresse IP à partir de laquelle la personne s'est connectée.

J'ai pensé à utiliser /etc/bash.bashrc, mais est-ce une bonne solution? Par exemple, existe-t-il un moyen pour un utilisateur de désactiver son utilisation, et donc de désactiver mon script? Si oui, quelles sont mes autres options?

Merci.

houbysoft
la source
Cela ne fonctionnera que si l'utilisateur utilise bash, bien sûr. Cela ne fonctionnera pas si les utilisateurs peuvent sélectionner leur propre shell.
Paŭlo Ebermann

Réponses:

12

Le mécanisme à utiliser dépend de vos objectifs.

Si vous souhaitez fournir quelque chose de pratique ou de convivial à vos utilisateurs, alors votre /etc/profileest assez raisonnable si tous vos utilisateurs utilisent le même shell. Si vous souhaitez que les commandes s'exécutent uniquement lorsque vous vous connectez via ssh, placez les commandes dans /etc/ssh/sshrc. (Si cela ne vous dérange pas que les utilisateurs remplacent les commandes par leur propre ~/.ssh/rcfichier.)

Si vous souhaitez forcer un utilisateur à exécuter un programme et un seul programme , l' ForceCommandoption décrite par DigitalRoss est une bonne approche. (Personnellement, je limiterais davantage l'utilisateur avec un système de contrôle d'accès obligatoire tel que AppArmor , SELinux , TOMOYO ou SMACK , pour garantir que le programme ne puisse pas permettre à un utilisateur de s'échapper. J'ai travaillé sur AppArmor pendant dix ans, c'est donc le outil que je choisirais en premier, mais les autres sont de bons outils écrits par d'excellents programmeurs.)

Si vous voulez qu'un seul programme s'exécute et ne dérange pas l'utilisateur de quelque façon que ce soit , la meilleure approche consiste à utiliser le pam_exec(8)module, qui ne peut pas être contourné, fonctionne quel que soit le shell et offre une capacité facile à exécuter en tant qu'utilisateur ou en tant qu'utilisateur. compte du programme exécutant l'autorisation. La page de manuel donne l'exemple suivant:

   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.

Cela pourrait être étendu à fonctionner sur auth, account, passwordet sessionactions; sessionserait probablement préférable pour exécuter lors de la connexion. Ajoutez simplement une ligne comme:

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

dans votre /etc/pam.d/sshdfichier de contrôle.

sarnold
la source
On dirait que le pam_execmodule est exactement ce que je recherche. Merci!
houbysoft
2
ATTENTION, si la commande que vous exécutez se termine avec un code de sortie non nul, votre connexion échouera et vous pourriez être verrouillé. Une façon de résoudre ce problème est de vous assurer qu'il existe une autre «session facultative» appelée avec un module différent qui réussit toujours.
gflarity
4

Les nouvelles versions d'OpenSSH ont une fonctionnalité de serveur appelée ForceCommand qui donne le contrôle à un script au lieu de l'opération (scp, ssh, ...) que l'utilisateur souhaitait. Le script reçoit la commande d'origine, vous pouvez donc probablement l'enchaîner après avoir fait tout ce que vous devez faire.

Depuis sshd_config (5):

ForceCommand

Force l'exécution de la commande spécifiée par ForceCommand, en ignorant toute commande fournie par le client et ~ / .ssh / rc si elle est présente. La commande est invoquée à l'aide du shell de connexion de l'utilisateur avec l'option -c. Cela s'applique à l'exécution du shell, de la commande ou du sous-système. Il est très utile dans un bloc Match. La commande initialement fournie par le client est disponible dans la variable d'environnement SSH_ORIGINAL_COMMAND. La spécification d'une commande de `` internal-sftp '' forcera l'utilisation d'un serveur sftp in-process qui ne nécessite aucun fichier de support lorsqu'il est utilisé avec ChrootDirectory.

J'ai utilisé cela une fois pour remplacer scp et fournir un téléchargement sécurisé de gemmes sans donner à chaque utilisateur autorisé à télécharger des gemmes un accès interactif dont ils n'avaient pas besoin ou ne voulaient pas.

DigitalRoss
la source
3

Une façon serait d'utiliser syslog-ng comme démon syslog et de le configurer pour exécuter un arrière-plan de script chaque fois qu'une certaine entrée de journal (telle qu'une connexion ssh réussie) correspond.

Janne Pikkarainen
la source
0

Regarde ça:

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

Je ne pense pas qu'il existe un moyen de désactiver cela. Quelqu'un d'autre peut-il vérifier cela?

Rapide
la source
Cela ( /etc/profileou ~/.profile) dépend du shell de l'utilisateur, juste un peu moins que bashrc. Si vos utilisateurs utilisent un bash ou similaire, c'est très bien.
Paŭlo Ebermann