Option de commande SSH authorized_keys: plusieurs commandes?

17

Les clés autorisées ont une option command = "..." qui restreint une clé à une seule commande. Existe-t-il un moyen de restreindre une clé à plusieurs commandes? Par exemple, en ayant une expression régulière là-bas, ou en modifiant un autre fichier de configuration?

dkaeae
la source

Réponses:

9

Non. Ce n'est pas une commande "autorisée", mais une commande "forcée" (comme option ForceCommand ).

La seule possibilité est d'utiliser différentes touches pour différentes commandes ou de lire des paramètres stdin.

Jakuje
la source
27

Vous ne pouvez avoir qu'une seule commande par touche, car la commande est «forcée».

Mais vous pouvez utiliser un script wrapper. La commande appelée obtient la ligne de commande d'origine en tant que variable d'environnement $SSH_ORIGINAL_COMMAND, qu'elle peut évaluer.

Par exemple, mettez ceci dans ~/.ssh/allowed-commands.sh:

#!/bin/sh
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.

case "$SSH_ORIGINAL_COMMAND" in
    "systemctl restart cups")
        systemctl restart cups
        ;;
    "shutdown -r now")
        shutdown -r now
        ;;
    *)
        echo "Access denied"
        exit 1
        ;;
esac

Référencez-le ensuite ~/.ssh/authorized_keysavec

command="/home/user/.ssh/allowed-commands.sh",…
hfs
la source
1
Utile. Il peut être utile de préciser que c'est sshd lui-même qui ajoute SSH_ORIGINAL_COMMAND(per man sshd) afin qu'il soit disponible dans les scripts. Aussi pour donner un exemple de scripts automatisés qui permettent à certains modèles de SSH_ORIGINAL_COMMANDs'exécuter. Voir aussi unixwars.blogspot.com/2014/12/getting-sshoriginalcommand.html
Cedric Knight
7

Dans le grand SSH, The Secure Shell: The Definitive Guide book by O'Reilly, dans le chapitre huit, il y a un bel exemple donné en utilisant un script comme le suivant:

#!/bin/sh

/bin/echo "Welcome!
Your choices are:
1       See today's date
2       See who's logged in
3       See current processes
q       Quit"

/bin/echo "Your choice:"

read ans

while [ "$ans" != "q" ]
do
   case "$ans" in
      1)
         /bin/date
         ;;
      2)
         /usr/bin/who
         ;;
      3)
         /usr/bin/top
         ;;
      q)
         /bin/echo "Goodbye"
         exit 0
         ;;
      *)
         /bin/echo "Invalid choice '$ans': please try again"
         ;;
   esac
   /bin/echo "Your choice:"
   read ans
done
exit 0

Utiliser ceci dans votre .authorized_keysfichier comme:

command="/path/to/your/script.sh" <ssh-key>

... vous donne ceci lorsque vous faites ssh:

Welcome!
Your choices are:
1       See today's date
2       See who's logged in
3       See current processes
q       Quit
Your choice:
gf_
la source
Mais un tel script tombe en panne scp, sftpet toutes les autres choses que vous pourriez trouver utiles un jour.
Jakuje
3
@Jakuje N'est-ce pas valable pour l' commandoption en général?
gf_
1

D'autres approches utilisent par exemple un shell restreint pour l'utilisateur donné ou utilisent un wrapper qui restreint les commandes à tous les fichiers / scripts trouvés dans un répertoire spécifique, permettant ainsi d'augmenter la liste des commandes sans changer le wrapper.

Un autre article décrit un script générique, qui permet également des arguments de ligne de commande aux commandes autorisées, mais permet de les verrouiller avec des règles exprimées sous forme d'expressions régulières.

Cet exemple serait exprimé de la manière suivante:

command="only systemctl shutdown"

Et un .onlyrulesfichier serait créé avec ce contenu:

\:^systemctl restart cups$:{p;q}
\:^shutdown -r now$:{p;q}

L'avantage de cette approche «unique» est qu'il n'est pas nécessaire d'écrire des scripts individuels pour chaque utilisateur et situation.

Georg Lehner
la source
Le problème avec la modification du shell est qu'il s'appliquera à toutes les connexions, même celles avec une clé qui n'est pas destinée à être restreinte. De plus, si vous ne connectez que le shell et aucun accès administrateur, vous ne pouvez pas simplement changer votre shell configuré en ce que vous voulez. Mais vous pouvez toujours modifier votre fichier authorized_keys.
kasperd
Vous pouvez utiliser un "shell restreint" commeForcedCommand
Georg Lehner
Il me vient à l'esprit, pour la situation où le compte utilisé est un compte d'utilisateur normal, et les actions requises sont privilégiées, que l'on pourrait s'appuyer sur sudo pour effectuer la vérification, et définir l'option de commande authorized_keys sur "sudo $ SSH_ORIGINAL_COMMAND"?
Steve Dee