Antworten:
Ja, einfach /bin/false
als Shell verwenden und den Benutzer anweisen, den Tunnel-SSH-Prozess zu starten, ohne einen Remote-Befehl auszuführen (dh das -N
Flag für OpenSSH):
ssh -N -L 1234:target-host:5678 ssh-host
/bin/false
eine Shell verfügen , haben Sie keinen Shell-Zugriff, da jede Anmeldesitzung sofort beendet wird.
Fügen Sie in die .ssh / authorized_keys-Datei des Benutzers Folgendes ein:
permitopen="192.168.1.10:3306",permitopen="10.0.0.16:80",no-pty ssh-rsa AAAAB3N...
Im Grunde genommen befinden sich die Steuerelemente also vor dem öffentlichen ssh-Schlüssel des Benutzers, der durch ein Leerzeichen getrennt ist. In diesem Beispiel dürfen Verbindungen, die den spezifischen öffentlichen Schlüssel verwenden, die SSH-Portweiterleitung nur zum MySQL-Server von 192.168.1.10 und zum Webserver von 10.0.0.16 ausführen. Sie erhalten keine Shell (no-pty). Sie fragen speziell nach der Option "no-pty", aber die anderen können auch nützlich sein, wenn der Benutzer nur zu bestimmten Servern tunneln soll.
Weitere Optionen für die Datei authorized_keys finden Sie auf der Manpage für sshd .
Beachten Sie, dass die Benutzererfahrung etwas seltsam aussehen kann: Wenn sie sich einloggen, sieht es so aus, als würde die Sitzung hängen (da sie keine Pty bekommen). Das ist ok. Wenn der Benutzer die Portweiterleitung beispielsweise mit "-L3306: 192.168.1.10: 3306" angegeben hat, ist die Portweiterleitung weiterhin aktiv.
Probieren Sie es auf jeden Fall aus.
no-pty
verhindert nicht den Zugriff auf die Shell, sondern verleiht der Shell lediglich keine Pty. Die Eingabeaufforderung wird nicht angezeigt (dh "scheint zu hängen"), aber Sie können trotzdem einwandfreie Befehle erteilen. Sie benötigen die command="..."
Option in, .ssh/authorized_keys
wenn Sie den Shell-Zugriff von dort aus einschränken möchten.
Geben Sie dem Benutzer eine Shell, mit der er sich nur abmelden kann, z /bin/press_to_exit.sh
#! / bin / bash read -n 1 -p Taste "Drücken Sie eine beliebige Taste, um das Menü zu verlassen"
Auf diese Weise kann er mit aktiven Tunneln so lange eingeloggt bleiben, wie er möchte, aber keine Befehle ausführen. Ctrl-c
trennt die Verbindung.
Weisen Sie eine Shell zu, bei der sich der Benutzer nicht anmelden kann.
z.B
#!/bin/sh
echo "No interactive login available."
sleep 60
exit 0
Dies würde verhindern, dass sie eine Shell-Eingabeaufforderung erhalten, und ihnen eine Zeitüberschreitung von 60 Sekunden gewähren. Wenn 60 Sekunden lang keine Verbindung besteht, wird sie beendet und die Verbindung wird vollständig getrennt (erhöhen Sie die Anzahl entsprechend den Anforderungen).
Sie können auch keinen Remote-Befehl ausführen, da diese Shell sie nicht zulässt.
logout
" auf ein normales Skript .
/sbin/nologin
, die Sie mit einer benutzerfreundlichen Nachricht in anpassen können /etc/nologin.txt
.
Meine Lösung besteht darin, dem Benutzer, der möglicherweise nur Tunneling ausführt , ohne eine interaktive Shell bereitzustellen , diese Shell in / etc / passwd auf / usr / bin / tunnel_shell zu setzen .
Erstellen Sie einfach die ausführbare Datei / usr / bin / tunnel_shell mit einer Endlosschleife .
Nutzen Sie zusätzlich die Option AllowGroups
und Match Group
.
Vollständig erklärt hier: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/
-N
, haben sie Shell-Zugriff. Dies löst das Problem nicht wirklich und ist gefährlich.