web-dev-qa-db-fra.com

SSH - Forcer l'exécution de la commande à la connexion, même sans Shell

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:

  • Définir la commande à /etc/ssh/sshrc.
  • Utilisation de command = "COMMAND" dans .ssh/authorized_keys (man registered_keys)
  • Configuration d'un script avec la commande en tant que shell de l'utilisateur. (chsh -s /sbin/myscript.sh USERNAME)
  • Correspondant à l'utilisateur dans /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.

15
Iacchus

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 - Autorisation cryptée pour un seul paquet

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. 

1. Pour installer sur un Linux Ubuntu:

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:

  1. Éditer /etc/default/fwknop-server
  2. Remplacez la ligne START_DAEMON="no" par START_DAEMON="yes"
  3. Puis lancez:

    Sudo service fwknop-server stop

    Sudo service fwknop-server start

2. Avertissement administrateur sur succès SPA (email, script de basculement, etc.)

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.

3. Plus de ressources sur fwknop

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)

2
Iacchus

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:

  1. l'utilisateur a défini un shell sensible,
  2. que votre script cible est exécutable, et
  3. que votre script a une ligne appropriée Shebang

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
12
Todd A. Jacobs

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)

Usage

  1. Rendre le script ci-dessus exécutable:

chmod +x logwatcher.python3

  1. Ajouter un travail cron pour le démarrer après le redémarrage

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.

1
Iacchus