Hinzufügen eines Benutzers, der Skripte nur remote ausführen kann

Hinzufügen eines Benutzers, der Skripte nur remote ausführen kann

Ich möchte einen Benutzer erstellen, der nur eines tun kann: über SSH ein Skript (und Befehlszeilenargumente für das Skript) angeben, das sich in einem bestimmten Ordner befindet (für die Zwecke dieser Frage nennen wir es so /local/remote_only_scripts/foo), und dieses Skript ausführen und seine Ausgabe zurückgeben lassen.

Um es klar zu sagen, hier sind einige Beispiele für Dinge, die der Benutzer nicht tun dürfen soll:

  • Melden Sie sich lokal beim Konto an. Die Anmeldeanwendung ist /bin/login. Es handelt sich nicht um ein Skript im /local/remote_only_scripts/fooOrdner und sollte daher nicht vom Benutzer aufgerufen werden.
  • Melden Sie sich remote beim Konto an. Die erneute Anmeldung (wird das von SSH aufgerufen?) ist kein Skript im entsprechenden Ordner.
  • Listet den Inhalt des Verzeichnisses auf. ls befindet sich in /bin/ls. Es ist kein Skript im entsprechenden Verzeichnis.
  • Bearbeiten Sie eine Datei in diesem Verzeichnis. Emacs, vi, gedit und die meisten anderen Editoren sind keine Skripte in diesem Verzeichnis.
  • Zeigen Sie den Inhalt einer Datei in diesem Verzeichnis an.
  • Führen Sie eine Datei in diesem Verzeichnis aus, für deren Ausführung er keine Berechtigung hat.

Beachten Sie, dass dieseBeispieleEs gibt viele andere Aktionen, die der Benutzer nicht ausführen können soll. Wenn Sie eine Aktion in Erwägung ziehen, fragen Sie sich: „Wird dies von einem Skript in ausgeführt /local/remote_only_scripts/foo?“ Wenn die Antwort Nein lautet, sollte der Benutzer sie nicht ausführen können. Wenn die Antwort Ja lautet, sollte der Benutzer sie ausführen können.

PS: Lassen Sie mich klarstellen, was ich mit „Benutzer hinzufügen“ meine. Ich meine nicht, einen Benutzer zu einem SSH-Subsystem hinzuzufügen. Vielmehr meine ich, einen Benutzer zum Computersystem hinzuzufügen. Ich habe beispielsweise ein System, auf dem Debian Stable läuft. Ich nenne es bei seiner Adresse www.hg.bar.com. Ich möchte einen Benutzer hinzufügen (über kuser, users-admin oder useradd oder auf ähnliche Weise) und ihn hg_guest nennen. hg_guest kann sich nicht lokal anmelden oder irgendetwas in der obigen Liste tun. Alles, was hg_guest tun kann, ist, Skripte „remote“ auszuführen. Ich sagte, er sollte dies über SSH tun können, aber wenn ich jetzt darüber nachdenke, könnte ihm die Erlaubnis, SSH zu verwenden, vielleicht auch eine lokale Anmeldung ermöglichen, sodass ein anderer Mechanismus erforderlich sein könnte.

Antwort1

Da ist einBefehlOption in der Datei authorized_keys. Diese Option scheint genau das zu tun, was Sie wollen.

Beachten Sie, dass es sich nicht um eine Chroot- oder eingeschränkte Shell handelt. Es erlaubt nur die Ausführung dieser Befehle über SSH. In Ihrem Beispiel wäre es:

ssh somehost /local/remote_only_scripts/foo

Für diese authorized_keys-Datei:

command="/local/remote_only_scripts/foo",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ...public key... 

Wenn Sie nicht möchten, dass sich Ihr Benutzer lokal anmelden kann, gibt es viele Möglichkeiten. Sie können entweder:

  • Stellen Sie einfach die Shell auf/bin/false(vielleicht brauchst du/bin/trueda ssh einen gültigen Login benötigt)
  • Sperren des Passworts finden Sie unterpasswd -l

BEARBEITEN: Weitere Einschränkungsoptionen hinzugefügt und Erläuterung, wie Sie den lokalen Zugriff entfernen.

Antwort2

Versuchen Sie Folgendes als Anmelde-Shell für den Benutzer:

#!/bin/sh
basedir=/local/remote_only_scripts
while read -p '$ ' prog args; do
    if [ ! -x "$basedir/$prog" ]; then
        echo "Invalid program: $prog"
    else
        case "$prog $args" in
            *\**|*\?*|*\^*|*\&*|*\<*|*\>*|*\|*|*\;*|*\`*|*\[*|*\]*)
                echo "Invalid character in command";;
            *)
                eval "$prog $args"
                echo;; # force a trailing newline after the program
        esac
    fi
done

Sie möchten dies wahrscheinlich auch authorized_keysexplizit in der Datei haben, wie in Corens Antwort; ersetzen Sie hier jedoch '.../foo; durch das Programm. Dadurch werden Befehle von SSH wie sftp, scp, und verhindert ssh hostname command.

Antwort3

Für den unwahrscheinlichen Fall, dass sie nur auf ein Skript zugreifen müssen, funktioniert das bei mir sehr gut. Fügen Sie den Benutzer hinzu und ändern Sie seine Standard-Shell in den Pfad des Skripts. Wenn sie sich über SSH verbinden, wird das Skript ausgeführt und ihre Sitzung geschlossen.

server1:/ # useradd -s "/local/remote_only_scripts/foo/script.sh" hg_guest

server1:/ # grep hg_guest /etc/passwd

hg_guest:x:2002:100::/home/hg_guest:/local/remote_only_scripts/foo/script.sh

verwandte Informationen