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é aux commandes multiples? Par exemple. en ayant une expression régulière là-bas, ou en modifiant un autre fichier de configuration?
Non. Ce n'est pas une commande "autorisée", mais une commande "forcée" (comme ForceCommand option).
La seule possibilité est d'utiliser différentes clés pour différentes commandes ou de lire les paramètres de stdin
.
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'il peut évaluer.
Par exemple. mettre 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 dans ~/.ssh/authorized_keys
avec
command="/home/user/.ssh/allowed-commands.sh",…
Dans le grand SSH, The Secure Shell: The Definitive Guide livre par 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
L'utiliser dans votre .authorized_keys
fichier 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:
D'autres approches utilisent par exemple un Shell restreint pour l'utilisateur donné ou utiliser 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.
n 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 s'exprimerait de la manière suivante:
command="only systemctl shutdown"
Et un .onlyrules
les fichiers seraient créés 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.