Dies ist eine Idee für eine Sicherheit. Unsere Mitarbeiter haben Zugriff auf einige Befehle auf einem Linux-Server, jedoch nicht auf alle. Sie sollen zB die Möglichkeit haben, auf eine Protokolldatei zuzugreifen ( less logfile
) oder verschiedene Befehle zu starten ( shutdown.sh
/ run.sh
).
Hintergrundinformation:
Alle Mitarbeiter greifen mit demselben Benutzernamen auf den Server zu: Unser Produkt wird mit "normalen" Benutzerberechtigungen ausgeführt, es ist keine "Installation" erforderlich. Entpacken Sie es einfach in Ihrem Benutzerverzeichnis und führen Sie es aus. Wir verwalten mehrere Server, auf denen unsere Anwendung "installiert" ist. Auf jeder Maschine gibt es einen Benutzer johndoe
. Unsere Mitarbeiter benötigen manchmal Zugriff auf die Anwendung über die Befehlszeile, um auf Protokolldateien zuzugreifen und diese zu überprüfen oder die Anwendung manuell neu zu starten. Nur einige Personen dürfen vollen Befehlszeilenzugriff haben.
Wir verwenden die ppk-Authentifizierung auf dem Server.
Es wäre großartig, wenn Mitarbeiter1 nur auf die Protokolldatei zugreifen kann und Mitarbeiter2 auch X usw. ausführen kann.
Lösung:
Als Lösung verwende ich die command
Option wie in der akzeptierten Antwort angegeben. Ich werde mein eigenes kleines Shell-Skript erstellen, das die einzige Datei ist, die für einige Mitarbeiter ausgeführt werden kann . Das Skript bietet mehrere Befehle, die ausgeführt werden können, aber keine anderen. Ich werde die folgenden Parameter authorized_keys
von wie hier angegeben verwenden :
command="/bin/myscript.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty
ssh-dss AAAAB3....o9M9qz4xqGCqGXoJw= user@host
Das ist genug Sicherheit für uns. Danke, Community!
Antworten:
Sie können Schlüssel auch auf zulässige Befehle beschränken (in der Datei authorized_keys).
Das heißt, der Benutzer würde sich nicht über ssh anmelden und dann einen eingeschränkten Befehlssatz haben, sondern nur diese Befehle über ssh ausführen dürfen (z. B. "ssh somehost bin / showlogfile").
quelle
ssh
folgt derrsh
Tradition, indem das Shell-Programm des Benutzers aus der Kennwortdatei zum Ausführen von Befehlen verwendet wird.Dies bedeutet, dass wir dies lösen können, ohne die
ssh
Konfiguration in irgendeiner Weise einzubeziehen.Wenn Sie nicht möchten, dass der Benutzer Shell-Zugriff hat, ersetzen Sie einfach die Shell dieses Benutzers durch ein Skript. Wenn Sie hineinschauen, werden
/etc/passwd
Sie sehen, dass es ein Feld gibt, das jedem Benutzer einen Shell-Befehlsinterpreter zuweist. Das Skript wird sowohl für die interaktive Anmeldungssh user@host
als auch für Befehle als Shell verwendetssh user@host command arg ...
.Hier ist ein Beispiel. Ich habe einen Benutzer erstellt,
foo
dessen Shell ein Skript ist. Das Skript druckt die Nachrichtmy arguments are:
gefolgt von ihren Argumenten (jeweils in einer separaten Zeile und in spitzen Klammern) und wird beendet. Im Log-In-Fall gibt es keine Argumente. Folgendes passiert:Wenn der Benutzer versucht, einen Befehl auszuführen, sieht dies folgendermaßen aus:
Unsere "Shell" erhält einen
-c
Stilaufruf mit dem gesamten Befehl als ein Argument, genauso wie er/bin/sh
ihn erhalten würde.Wie Sie sehen, können wir das Skript jetzt weiterentwickeln, sodass es den Fall erkennt, wenn es mit einem
-c
Argument aufgerufen wurde , und dann die Zeichenfolge analysiert (z. B. durch Mustervergleich). Die zulässigen Zeichenfolgen können durch rekursives Aufrufen an die reale Shell übergeben werden/bin/bash -c <string>
. Der Ablehnungsfall kann eine Fehlermeldung drucken und beenden (einschließlich des Falls, wenn er-c
fehlt).Sie müssen vorsichtig sein, wie Sie dies schreiben. Ich empfehle, nur positive Übereinstimmungen zu schreiben, die nur sehr spezifische Dinge zulassen, und alles andere zu verbieten.
Hinweis: Wenn
root
dies der Fall ist , können Sie sich weiterhin bei diesem Konto anmelden, indem Sie die Shell imsu
Befehl wie folgt überschreibensu -s /bin/bash foo
. (Ersatzschale Ihrer Wahl.) Nicht-Root kann dies nicht.Hier ist ein Beispielskript: Beschränken Sie den Benutzer darauf, nur
ssh
für dengit
Zugriff auf Repositorys unter zu verwenden/git
.Natürlich vertrauen wir , dass diese Programme Git
git-upload-pack
undgit-receive-pack
haben keine Löcher oder Luken zu entkommen , die Benutzer Zugriff auf das System erhalten.Dies ist mit dieser Art von Beschränkungsschema verbunden. Der Benutzer ist authentifiziert, um Code in einer bestimmten Sicherheitsdomäne auszuführen, und wir beschränken uns darauf, diese Domäne auf eine Unterdomäne zu beschränken. Wenn Sie beispielsweise einem Benutzer erlauben, den
vim
Befehl für eine bestimmte Datei auszuführen , um sie zu bearbeiten, kann der Benutzer einfach eine Shell mit abrufen:!sh[Enter]
.quelle
git-receive-pack '/git/';dd if=/dev/urandom of=/dev/sda
?case
sieht der Missbrauch von Dateimustern, den ich in der Datei begangen habe, für mich nicht korrekt aus./bin/bash -c "$2"
ist unsicher (ähnlich wie SQL Injection funktioniert). Sie können den String mit "magischen Anführungszeichen" wie PHP filtern. Die einfache Möglichkeit, die Sicherheit absolut zu gewährleisten, besteht darin, einen Befehl manuell aufzurufen und die Parameter dann in doppelte Anführungszeichen zu setzen. Weil die Sicherheit des Ganzen dann davon abhängt, dass dieser Befehl das schwächste Glied ist (schwerer zu überprüfen). Am interessantesten zu sehen, wie Ihre Antwort 22 positive Stimmen hat, aber niemand hat dies bemerkt;) Werden Sie Ihre eigene Antwort aktualisieren?set
und dann nur die ersten beiden Wörter daraus entnimmt. Der erste muss ein zulässigergit-
Befehl sein, und der zweite muss ein Pfad sein, der kanonisiert, mit dem zulässigen Präfix verglichen und auch auf Existenz geprüft wird. Können Sie sich eine Möglichkeit vorstellen, dies zu brechen?Was Sie suchen, heißt Restricted Shell . Bash bietet einen solchen Modus, in dem Benutzer nur Befehle ausführen können, die in ihren Ausgangsverzeichnissen vorhanden sind (und sie können nicht in andere Verzeichnisse wechseln), was für Sie möglicherweise gut genug ist.
Ich habe festgestellt, dass dieser Thread sehr anschaulich ist, wenn auch etwas veraltet.
quelle
Sie sollten "rssh", die eingeschränkte Shell, erwerben
Sie können den oben genannten Richtlinien für Einschränkungen folgen. Sie sind alle ziemlich selbsterklärend und einfach zu befolgen. Verstehen Sie die Begriffe "chroot jail" und wie Sie sshd / terminal-Konfigurationen effektiv implementieren und so weiter.
Da die meisten Ihrer Benutzer über sshd auf Ihre Terminals zugreifen, sollten Sie wahrscheinlich auch in sshd_conifg, der Konfigurationsdatei des SSH-Dämons, nachsehen, um bestimmte Einschränkungen über SSH anzuwenden. Seien Sie jedoch vorsichtig. Verstehe richtig, was du zu implementieren versuchst, denn die Auswirkungen falscher Konfigurationen sind wahrscheinlich ziemlich schlimm.
quelle
rssh
wurde von Debian Buster entfernt. Ich denke, die neue Schärfe ist GNU Rush .Warum schreibst du nicht deine eigene Login-Shell? Es wäre ziemlich einfach, Bash dafür zu verwenden, aber Sie können jede Sprache verwenden.
Beispiel in Bash
Verwenden Sie Ihren bevorzugten Editor, um die Datei zu erstellen
/root/rbash.sh
(dies kann ein beliebiger Name oder Pfad sein, sollte aber seinchown root:root
undchmod 700
):Sie müssen diese ausführbare Datei lediglich als Anmeldeshell festlegen. Bearbeiten Sie beispielsweise Ihre
/etc/passwd
Datei und ersetzen Sie Ihre aktuelle Anmeldeshell dieses Benutzers/bin/bash
durch/root/rbash.sh
.Dies ist nur ein einfaches Beispiel, aber Sie können es so weit fortgeschritten machen, wie Sie möchten. Die Idee ist da. Achten Sie darauf, sich nicht auszusperren, indem Sie die Login-Shell Ihres eigenen und einzigen Benutzers ändern. Und testen Sie immer seltsame Symbole und Befehle, um festzustellen, ob sie tatsächlich sicher sind.
Sie können es testen mit :
su -s /root/rbash.sh
.Passen Sie auf , stellen Sie sicher, dass der gesamte Befehl übereinstimmt, und gehen Sie vorsichtig mit Platzhaltern um! Besser ausschließen Bash-Symbole wie
;
,&
,&&
,||
,$
, und Backticks sicher zu sein.Abhängig von der Freiheit, die Sie dem Benutzer geben, wird es nicht viel sicherer. Ich habe festgestellt, dass ich oft nur einen Benutzer erstellen musste, der nur auf wenige relevante Befehle zugreifen kann, und in diesem Fall ist dies wirklich die bessere Lösung. Möchten Sie jedoch mehr Freiheit geben, sind ein Gefängnis und Berechtigungen möglicherweise angemessener. Fehler werden leicht gemacht und erst bemerkt, wenn es schon zu spät ist.
quelle
ln="service httpd restart"
.:${ln[@]}
. Denken Sie dennoch an Sicherheitsprobleme. In einem solchen Fall wäre eine Whitelist nur für alphanumerische Zeichen und Leerzeichen hilfreich. Sie können aber auch einfach:if [[ "$ln" == "restart-httpd"];then service httpd restart;fi
und mit solchen einfachen Befehlen arbeiten./root/rbash.sh: Permission denied
Ich habe auch versucht, chmod 777/root/rbash.sh
zu/etc/shells
? Das hängt von der Verteilung ab. Sie können auch versuchenselinux
, die Nachrichten vorübergehend zu deaktivieren und die Protokollmeldungen auf Hinweise (siehe Zeitstempel) in den Dateien in zu überprüfen/var/log
.Vielleicht möchten Sie sich die Einrichtung eines Gefängnisses ansehen .
quelle
GNU Rush ist möglicherweise der flexibelste und sicherste Weg, dies zu erreichen:
quelle
Eine andere Sichtweise ist die Verwendung von POSIX-ACLs. Sie müssen von Ihrem Dateisystem unterstützt werden. Sie können jedoch alle Befehle unter Linux genau so optimieren, wie Sie es unter Windows tun (nur ohne die schönere Benutzeroberfläche) ). Verknüpfung
Eine andere Sache, die Sie prüfen sollten, ist PolicyKit .
Sie müssen einiges googeln, um alles zum Laufen zu bringen, da dies im Moment definitiv keine Stärke von Linux ist.
quelle
[Offenlegung: Ich habe sshdo geschrieben, das unten beschrieben wird]
Wenn Sie möchten, dass die Anmeldung interaktiv ist, ist das Einrichten einer eingeschränkten Shell wahrscheinlich die richtige Antwort. Wenn es jedoch einen tatsächlichen Befehlssatz gibt, den Sie zulassen möchten (und sonst nichts), und es in Ordnung ist, diese Befehle einzeln über ssh auszuführen (z. B. ssh user @ host cmd arg bla bla), dann ein generisches Befehls-Whitelist-Steuerelement für SSH könnte das sein, was Sie brauchen. Dies ist nützlich, wenn die Befehle auf Client-Seite in Skripten geschrieben sind und der Benutzer den Befehl ssh nicht tatsächlich eingeben muss.
Dafür gibt es ein Programm namens sshdo. Es steuert, welche Befehle über eingehende SSH-Verbindungen ausgeführt werden dürfen. Es steht zum Download zur Verfügung unter:
http://raf.org/sshdo/ (Handbuchseiten hier lesen) https://github.com/raforg/sshdo/
Es verfügt über einen Trainingsmodus, in dem alle versuchten Befehle zugelassen werden, und eine Option --learn, um die Konfiguration zu erstellen, die erforderlich ist, um gelernte Befehle dauerhaft zuzulassen. Dann kann der Trainingsmodus ausgeschaltet werden und andere Befehle werden nicht ausgeführt.
Es gibt auch die Option --unlearn, um das Zulassen von Befehlen zu beenden, die nicht mehr verwendet werden, um die strengsten Berechtigungen beizubehalten, wenn sich die Anforderungen im Laufe der Zeit ändern.
Es ist sehr pingelig, was es erlaubt. Ein Befehl mit Argumenten wird nicht zugelassen. Es können nur vollständige Shell-Befehle zugelassen werden.
Es werden jedoch einfache Muster unterstützt, um ähnliche Befehle darzustellen, die sich nur in den Ziffern unterscheiden, die in der Befehlszeile angezeigt werden (z. B. Sequenznummern oder Datums- / Zeitstempel).
Es ist wie eine Firewall oder ein Whitelisting-Steuerelement für SSH-Befehle.
Und es unterstützt verschiedene Befehle, die für verschiedene Benutzer zulässig sind.
quelle