Je crée un utilisateur restreint sans Shell pour la redirection de port uniquement et je dois exécuter un script lors de la connexion via pubkey, même si l'utilisateur est connecté via ssh -N user@Host
sans demander au serveur SSH de fournir un Shell.
Le script doit avertir l'administrateur des connexions authentifiées avec pubkey. Par conséquent, l'utilisateur qui se connecte ne doit pas pouvoir ignorer l'exécution du script (par exemple, en se connectant avec ssh -N
).
J'ai essayé en vain:
/etc/ssh/sshrc
..ssh/authorized_keys
(man registered_keys)chsh -s /sbin/myscript.sh USERNAME
)/etc/ssh/sshd_config
comme:
Match User MYUSERNAME
ForceCommand "/sbin/myscript.sh"
Tout fonctionne lorsque l'utilisateur demande Shell, mais s'il n'est consigné que pour la redirection de port et sans Shell (ssh -N
), il ne fonctionne pas.
Je suis l'auteur du PO; Je suis arrivé à la conclusion que ce que je devais réaliser n’était pas possible en utilisant SSH uniquement à la date (OpenSSH_6.9p1 Ubuntu-2, OpenSSL 1.0.2d 9 Jul 2015
), mais j’ai trouvé un excellent logiciel qui utilise SPAuthentication chiffrée pour ouvrir le port SSH et sa nouvelle version (à la date de ce post, c’est sa branche maîtresse GitHub) dispose d’une fonctionnalité permettant d’exécuter une commande toujours autorisée par un utilisateur.
FWKNOP définit des règles iptables permettant l’accès à des ports donnés sur un seul paquet crypté envoyé via UDP. Ensuite, après autorisation, il autorise l’accès de l’utilisateur autorisé pendant un laps de temps donné, par exemple 30 secondes, après quoi il ferme le port et laisse la connexion ouverte.
La version actuelle (2.6.0-2.1build1) des référentiels Ubuntu à la date ne permet toujours pas l'exécution de commande en cas de succès de SPA; (veuillez utiliser 2.6.8 depuis GitHub à la place)
Sur la machine cliente:
Sudo apt-get install fwknop-client
Côté serveur:
Sudo apt-get install fwknop-server
Voici un tutoriel sur la configuration des ordinateurs client et serveur https://help.ubuntu.com/community/SinglePacketAuthorization
Puis, après la configuration, côté serveur:
/etc/default/fwknop-server
START_DAEMON="no"
par START_DAEMON="yes"
Puis lancez:
Sudo service fwknop-server stop
Sudo service fwknop-server start
Ainsi, comme indiqué ci-dessus, la version actuelle présente dans les référentiels Ubuntu (2.6.0-2.1build1) ne peut pas exécuter de commande si SPA réussit. Si vous avez besoin de cette fonctionnalité à partir de l'OP, mais que celle-ci sera publiée dans la version de fwknop (2.6.8), comme indiqué ci-dessous:
https://github.com/mrash/fwknop/issues/172
Donc, si vous avez besoin de l’utiliser tout de suite, vous pouvez créer à partir de github branche master avec l’option CMD_CYCLE_OPEN
.
https://help.ubuntu.com/community/SinglePacketAuthorization
https://github.com/mrash/fwknop/ (projet sur GitHub)
http://www.cipherdyne.org/fwknop/ (site du projet)
https://www.digitalocean.com/community/tutorials/how-to-use-fwknop-to-enable-single-packet-authentication-on-ubuntu-12-04 (tutoriel sur la communauté de DO)
L'option ForceCommand s'exécute sans PTY sauf si le client en demande un. En conséquence, vous n’avez pas réellement de shell pour exécuter les scripts comme vous le souhaiteriez. De plus, la page de manuel OpenSSH SSHD_CONFIG (5) indique clairement:
La commande est appelée à l'aide du shell de connexion de l'utilisateur avec l'option -c.
Cela signifie que si vous avez désactivé le shell de connexion de l'utilisateur, ou si vous l'avez défini sur /bin/false
, ForceCommand ne peut pas fonctionner. En admettant que:
les éléments suivants devraient alors fonctionner dans votre fichier global sshd_config une fois correctement modifié avec le nom d'utilisateur et le chemin d'accès complet à votre script personnalisé:
Match User foo
ForceCommand /path/to/script.sh
Je suis l'auteur de l'OP. En outre, vous pouvez implémenter un simple logwatcher comme suit, écrit en python3, qui garde la lecture d’un fichier et exécute une commande lorsque la ligne contient un motif.
logwatcher.python3
#!/usr/bin/env python3
# follow.py
#
# Follow a file like tail -f.
import sys
import os
import time
def follow(thefile):
thefile.seek(0,2)
while True:
line = thefile.readline()
if not line:
time.sleep(0.5)
continue
yield line
if __== '__main__':
logfilename = sys.argv[1]
pattern_string = sys.argv[2]
command_to_execute = sys.argv[3]
print("Log filename is: {}".format(logfilename))
logfile = open(logfilename, "r")
loglines = follow(logfile)
for line in loglines:
if pattern_string in line:
os.system(command_to_execute)
chmod +x logwatcher.python3
crontab -e
Ensuite, écrivez cette ligne et sauvegardez-la après ceci:
@reboot /home/YOURUSERNAME/logwatcher.python3 "/var/log/auth.log" "session opened for user" "/sbin/myscript.sh"
Le premier argument de ce script est le fichier journal à surveiller, et l'argument second est la chaîne à consulter. L'argument third est le script à exécuter lorsque la ligne est trouvée dans un fichier.
Il est préférable d'utiliser quelque chose de plus fiable pour démarrer/redémarrer le script en cas de blocage.