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

14

Ich möchte einen Benutzer erstellen, der nur eines 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 /local/remote_only_scripts/foo) und dieses Skript ausführen lassen und es wird ausgegeben.

Um einige Beispiele zu verdeutlichen, möchte ich nicht, dass der Benutzer in der Lage ist, Folgendes zu tun:

  • Melden Sie sich lokal beim Konto an. Die Login-Anwendung ist /bin/login. Es ist kein Skript im /local/remote_only_scripts/fooOrdner und sollte vom Benutzer nicht aufgerufen werden.
  • Melden Sie sich remote beim Konto an. Auch hier ist login (heißt das ssh?) Kein Skript im entsprechenden Ordner.
  • Listen Sie den Inhalt des Verzeichnisses auf. ls ist in /bin/ls. Es ist kein Skript im entsprechenden Verzeichnis.
  • Bearbeiten Sie eine Datei in diesem Verzeichnis. emacs, vi, gedit 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, zu deren Ausführung er nicht berechtigt ist.

Beachten Sie, dass dies Beispiele für viele andere Aktionen sind, die der Benutzer nicht ausführen kann. Fragen Sie bei der Prüfung einer Aktion, ob dies von einem Skript in ausgeführt wird /local/remote_only_scripts/foo. Wenn die Antwort nein ist, sollte der Benutzer nicht in der Lage sein, dies zu tun. Wenn die Antwort Ja lautet, sollte der Benutzer in der Lage sein, dies zu tun.

PS: Lassen Sie mich klarstellen, was ich mit "Hinzufügen eines Benutzers" meine. Ich meine nicht das Hinzufügen eines Benutzers zu einem SSH-Subsystem. Eher meine ich das Hinzufügen eines Benutzers zum Computersystem. Zum Beispiel habe ich ein System, auf dem debian stable läuft. Nenne es unter der 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 eine der in der obigen Liste aufgeführten Aktionen ausführen. Alles was hg_guest tun kann, ist Skripte "remote" auszuführen. Ich sagte, er sollte dies über ssh tun können, aber wenn er jetzt darüber nachdenkt, kann er sich möglicherweise mit ssh lokal anmelden, sodass möglicherweise ein anderer Mechanismus erforderlich ist.

HandyGandy
quelle

Antworten:

12

Es gibt einen Befehl Option in authorized_keys - Datei. Diese Option scheint genau das zu tun, was Sie wollen.

Beachten Sie, dass es sich nicht um eine Chroot oder eine eingeschränkte Shell handelt. Es ist erlaubt, nur diese Befehle über ssh auszuführen. Mit 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... 

Es gibt viele Möglichkeiten, wenn Sie nicht möchten, dass sich Ihr Benutzer lokal anmeldet. Du kannst entweder :

  • setze einfach die Shell auf / bin / false (vielleicht brauchst du / bin / true, da ssh ein gültiges Login benötigt)
  • Passwort sperren, siehe passwd -l

BEARBEITEN : Es wurden weitere Einschränkungsoptionen hinzugefügt und klargestellt, wie Sie den lokalen Zugriff entfernen.

Coren
quelle
Ich glaube nicht, dass Sie diesen Befehl in ssh auf der Client-Seite angeben müssen, er ist "erzwungen", damit er immer ausgeführt wird;) Der Benutzer auf der Remote-Site benötigt weiterhin eine gültige Shell, die in / etc / passwd definiert ist.
Jirib
1
Außerdem command=werden die Optionen no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-ptybenötigt, um das Konto wirklich einzuschränken.
Jofel
In Ordnung. Ich wachte mitten in der Nacht auf und beschloss, die Antworten zu überprüfen. Da ich schläfrig bin, werde ich nicht die gesamte Antwort aufnehmen, sondern etwas fragen, was mich verwirrt. Wie verhindert dies, dass sich hg_quest von einem tty aus anmeldet?
HandyGandy
@HandyGandy Dies ist der einfachste Teil. Ich habe 2 Möglichkeiten hinzugefügt, aber ich denke, es gibt noch mehr
Coren
0

Versuchen Sie dies als Login-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 werden dies wahrscheinlich auch authorized_keysexplizit in der Datei haben wollen, wie in Corens Antwort; aber ersetze das '... / foo; mit dem programm hier. Das wird verhindern , dass Befehle von SSH wie sftp, scpund ssh hostname command.

Arcege
quelle
Wenn Sie nur möchten, dass der Benutzer die Befehle aus Ihrem Verzeichnis ausführen kann (und es nicht zu viele gibt), können Sie das "prog" aus der obigen Lektüre entfernen und eine select-Anweisung verwenden, um ein Textmenü mit Auswahlmöglichkeiten anzubieten dieser Programme und dann das Lesen für die Argumente. Ich würde dies auch testen, um sicherzustellen, was passiert, wenn Sie eine Reihe von Strg-Cs an verschiedenen Stellen im Skript eingeben. Möglicherweise möchten Sie auch einen Trap-Befehl.
Joe
0

In der Off-Chance müssen sie nur auf ein Skript zugreifen, das funktioniert wirklich gut für mich. 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 die 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

2bc
quelle