Befehlsoption "SSH authorized_keys": Mehrere Befehle?

15

Für authorized_keys ist die Option command = "..." verfügbar, mit der eine Taste auf einen einzelnen Befehl beschränkt wird. Gibt es eine Möglichkeit, eine Taste auf mehrere Befehle zu beschränken ? ZB durch einen regulären Ausdruck oder durch Bearbeiten einer anderen Konfigurationsdatei?

dkaeae
quelle

Antworten:

9

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 auszulesen stdin.

Jakuje
quelle
24

Sie können nur einen Befehl pro Taste eingeben, da der Befehl "erzwungen" wird.

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

ZB setzen Sie 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 referenziere es ~/.ssh/authorized_keysmit

command="/home/user/.ssh/allowed-commands.sh",…
hfs
quelle
Nützlich. Es könnte sich lohnen, klarer zu machen, dass sshd selbst SSH_ORIGINAL_COMMAND(per man sshd) hinzufügt , damit es in Skripten verfügbar ist. Um auch ein Beispiel für automatisierte Skripte zu geben, mit denen bestimmte Muster SSH_ORIGINAL_COMMANDausgeführt werden können. Siehe auch unixwars.blogspot.com/2014/12/getting-sshoriginalcommand.html
Cedric Knight
7

In dem großartigen SSH, The Secure Shell: Das definitive Handbuch von O'Reilly, finden Sie in Kapitel 8 ein schönes Beispiel, das mit einem Skript wie dem folgenden erstellt wurde:

#!/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 Ihrer .authorized_keysDatei wie:

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

... gibt Ihnen dies, wenn Sie 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_
quelle
Aber solche Skript im Grunde bricht scp, sftpund all die anderen Dinge könnten Sie einen Tag nützlich finden.
Jakuje
3
@ Jakuje Gilt das nicht für die commandOption im Allgemeinen?
gf_
1

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

Ein anderer Artikel beschreibt ein generisches Skript, das auch Befehlszeilenargumente für die zulässigen Befehle zulässt, sie 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 .onlyrulesmit diesem Inhalt würde eine Datei 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 ein eigenes Skript geschrieben werden muss.

Georg Lehner
quelle
Das Problem beim Ändern der Shell besteht darin, dass sie für alle Anmeldungen gilt, auch für Anmeldungen mit einem Schlüssel, der nicht eingeschränkt werden soll. Wenn Sie sich nur mit der Shell anmelden und keinen Administratorzugriff haben, können Sie Ihre konfigurierte Shell nicht einfach auf das ändern, was Sie möchten. Sie können Ihre authorized_keys-Datei jedoch weiterhin bearbeiten.
Kasperd
Sie können eine "eingeschränkte Shell" alsForcedCommand
Georg Lehner
Für den Fall, dass das verwendete Konto ein normales Benutzerkonto ist und die erforderlichen Aktionen privilegiert sind, könnte man sich bei der Überprüfung auf sudo verlassen und die Befehlsoption authorized_keys auf "sudo $ SSH_ORIGINAL_COMMAND" setzen.
Steve Dee