SSH-Tunneling nur Zugriff


31

Ist es möglich, ssh (unter Linux) so zu konfigurieren, dass nur der Tunnelzugriff zugelassen wird? Das heißt, Benutzer können Tunnel einrichten, aber keine Shell- / Zugriffsdateien abrufen.

Antworten:


42

Ja, einfach /bin/falseals Shell verwenden und den Benutzer anweisen, den Tunnel-SSH-Prozess zu starten, ohne einen Remote-Befehl auszuführen (dh das -NFlag für OpenSSH):

ssh -N -L 1234:target-host:5678 ssh-host

Um, wenn der Benutzer nicht verwendet -N, haben sie Shell-Zugriff. Dies löst das Problem nicht wirklich und ist gefährlich.
mlissner

12
@mlissner: Nein, wenn Sie über /bin/falseeine Shell verfügen , haben Sie keinen Shell-Zugriff, da jede Anmeldesitzung sofort beendet wird.
Sven

10

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.


6
Dies ist ein gefährlicher Ratschlag . no-ptyverhindert 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_keyswenn Sie den Shell-Zugriff von dort aus einschränken möchten.
Aleksi Torhamo

@AleksiTorhamo ist richtig, aber dies ist ein Anfang; Sie müssen die Shell auch in / etc / passwd auf / usr / sbin / nologin oder / bin / false setzen, um die Shell vollständig einzuschränken. Ich habe den obigen Eintrag bearbeitet, um ihn zusammen mit Aleksis Ratschlägen wiederzugeben.
Jamieson Becker

4

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-ctrennt die Verbindung.


3
Ich denke, dass der Benutzer zumindest theoretisch in der Lage sein wird, STRG + C im richtigen Moment (zwischen Zeile 1 und 2) zu drücken und eine vollständige Bash-Shell zu erhalten.
Andreas-h

2

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.


4
Die meisten Linux-Installationen bringen dafür schon etwas mit. / sbin / nologin oder / bin / false oder ähnliches.
Rory

1
Was würde Ctrl-C im obigen Beispiel tun?
Arjan

Arjan: Da das Skript als Shell verwendet wird, hätte Strg-C den gleichen Effekt wie " logout" auf ein normales Skript .
Grawity

2
Eigentlich mag ich Earls Antwort mit der Option "-N", aber wenn Sie Ihrem Benutzer eine hilfreiche, freundliche und informative Nachricht geben möchten - und verhindern möchten, dass er überall SSH-Verbindungen hinterlässt - dann ist ein benutzerdefiniertes Skript nett und übersichtlich was es tut
20.

2
@jrg Diese Diskussion ist alt und Sie haben vielleicht Ihre Meinung geändert :) aber IMHO ist es gefährlich, mit handgemachten Shell-Skripten herauszukommen. Es gibt bereits eine /sbin/nologin, die Sie mit einer benutzerfreundlichen Nachricht in anpassen können /etc/nologin.txt.
dr01

0

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 AllowGroupsund Match Group.

Vollständig erklärt hier: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/


2
Der Benutzer ist möglicherweise in der Lage, die ausführbare Datei zu beenden und eine Shell zu verlassen. Sind Sie absolut sicher, dass Ihre ausführbare Datei dies nicht zulässt?
dr01

2
@ dr01 Ehrlich gesagt bin ich mir nicht sicher, ob dies 100% sicher ist. Ich denke, wenn Sie die ausführbare Datei beenden, wird die SSH-Sitzung ebenfalls beendet. Ich werde dies weiter untersuchen und werde es hier vielleicht noch einmal kommentieren.
Daniel W.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.