it-swarm.com.de

Befehlsoption SSH Authorized_keys: Mehrere Befehle?

Die autorisierten Schlüssel haben die Option command = "...", die einen Schlüssel auf einen einzelnen Befehl beschränkt. Gibt es eine Möglichkeit, einen Schlüssel auf mehrere Befehle zu beschränken? Z.B. indem Sie dort einen regulären Ausdruck haben oder eine andere Konfigurationsdatei bearbeiten?

17
dkaeae

Nein. Es ist kein "erlaubter" Befehl, sondern ein "erzwungener" Befehl (als ForceCommand Option).

Die einzige Möglichkeit besteht darin, unterschiedliche Tasten für unterschiedliche Befehle zu verwenden oder Parameter aus stdin zu lesen.

9
Jakuje

Sie können nur einen Befehl pro Taste haben, da der Befehl "erzwungen" ist.

Sie können jedoch ein Wrapper-Skript verwenden. Der aufgerufene Befehl erhält die ursprüngliche Befehlszeile als Umgebungsvariable $SSH_ORIGINAL_COMMAND, die es auswerten kann.

Z.B. setze dies in ~/.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

Dann verweise in ~/.ssh/authorized_keys mit

command="/home/user/.ssh/allowed-commands.sh",…
28
hfs

In dem großen Buch SSH, The Secure Shell: The Definitive Guide von O'Reilly wird in Kapitel 8 ein schönes Beispiel mit einem Skript wie dem folgenden gegeben:

#!/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

Verwenden Sie dies in Ihrem .authorized_keys Datei wie:

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

... gibt Ihnen dies, wenn Sie ssh ausführen:

Welcome!
Your choices are:
1       See today's date
2       See who's logged in
3       See current processes
q       Quit
Your choice:
7
gf_

Andere Ansätze verwenden z.B. eine eingeschränkte Shell für den angegebenen Benutzer oder verwenden Sie einen Wrapper, der Befehle auf alle Dateien/Skripte in einem bestimmten Verzeichnis beschränkt und so die Liste der Befehle erweitert, ohne den Wrapper zu ändern.

Ein weiterer Artikel beschreibt ein generisches Skript, das auch Befehlszeilenargumente für die zulässigen Befehle zulässt, diese jedoch mit Regeln sperrt, die als reguläre Ausdrücke ausgedrückt werden.

Dieses Beispiel würde folgendermaßen ausgedrückt:

command="only systemctl shutdown"

Und ein .onlyrules Dateien würden mit folgendem Inhalt erstellt:

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

Der Vorteil dieses "einzigen" Ansatzes besteht darin, dass nicht für jeden Benutzer und jede Situation einzelne Skripte geschrieben werden müssen.

1
Georg Lehner