Will man einer Person die sich mit SSH verbindet nur ein bestimmtes Kommando erlauben geht das, in dem man in .ssh/authorized_keys
das Keyword command=
davor setzt. Das ist besonders praktisch wenn man z.B. nur ein bestimmtes rsync Kommando erlauben möchte. Aber geht das auch mit mehreren Befehlen?
Technisch gesehen steht die SSH „command“ Direktive eigentlich für ForceCommand, heisst es ist nicht ein bestimmtes Kommando erlaubt, sondern das definierte Kommando wird bei jeder SSH Verbindung (als einziges) ausgeführt. Damit kann eigentlich nur ein Kommando „zulassen“. Da aber, dass ursprüngliche Kommando in der Shell Variable $SSH_ORIGINAL_COMMAND
steht, lassen sich mittels einem Wrapper-Script trotzdem mehrere Commands definieren.
Ein solches Wrapper-Script kann beispielsweise so aussehen:
.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
"rsync --server -logDtpre.iLsfxC --delete --numeric-ids . /mnt/backup/")
rsync --server -logDtpre.iLsfxC --delete --numeric-ids . /mnt/backup/
;;
"shutdown -r now")
shutdown -r now
;;
*)
echo "Access denied"
exit 1
;;
esac
Dies lässt jetzt nur ein rsync Kommando zu, oder ein reboot.
Man kann damit auch so menus machen, wie man sie beispielsweise von pfSense kennt:
#!/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
Einbinden tut man das dann einfach in .ssh/authorized_keys wie folgt:
command="/root/.ssh/allowed-commands.sh" ssh-rsa <ssh-key>