Wir haben einen öffentlichen Server, der SSH-Verbindungen von mehreren Clients hinter Firewalls akzeptiert.
Jeder dieser Clients erstellt einen Reverse-SSH-Tunnel, indem er den ssh -R
Befehl von seinen Webservern an Port 80 zu unserem öffentlichen Server verwendet.
Der Zielport (auf der Clientseite) des Reverse-SSH-Tunnels ist 80, und der Quellport (auf der Seite des öffentlichen Servers) hängt vom Benutzer ab. Wir planen, für jeden Benutzer eine Karte mit Portadressen zu erstellen.
Zum Beispiel würde Client A seinen Webserver an Port 80 zu unserem Port 8000 tunneln. Client B von 80 bis 8001; Client C von 80 bis 8002.
Client A: ssh -R 8000:internal.webserver:80 clienta@publicserver
Client B: ssh -R 8001:internal.webserver:80 clientb@publicserver
Client C: ssh -R 8002:internal.webserver:80 clientc@publicserver
Grundsätzlich versuchen wir, jeden Benutzer an einen Port zu binden und ihm nicht zu erlauben , zu anderen Ports zu tunneln.
Wenn wir die Forward-Tunneling-Funktion von SSH mit verwenden ssh -L
, können wir mithilfe der permitopen=host:port
Konfiguration zulassen, welcher Port getunnelt wird . Es gibt jedoch kein Äquivalent für den umgekehrten SSH-Tunnel.
Gibt es eine Möglichkeit, Reverse-Tunneling-Ports pro Benutzer einzuschränken?
quelle
Antworten:
Da Sie " Nicht zulassen" fett gedruckt haben, möchten Sie vermutlich eine Art Laufzeit-Zurückweisung auf der SSH-Clientseite, die die Portbindung verhindert. Also habe ich den Quellcode für Sie ausgegraben:
serverloop.c:
Wie Sie sehen, gibt es leider nicht viele Bedingungen, die eine Portweiterleitung außer den Standardbedingungen verhindern.
Ich wollte den gleichen Vorschlag für die Verwendung
mod_owner
iniptables
mir empfehlen , aber Jeff hat mich geschlagen.Ihre sauberste Lösung würde nur darin bestehen, diese Datei zu ändern (Sie können beispielsweise
pw->pw_uid
die UID des Benutzers abrufen und diese dem richtigen Port zuordnen) und Ihren SSH-Server neu zu kompilieren. Dies hängt jedoch davon ab, wie gut Sie damit vertraut sind .quelle
Mein Vorschlag ist die Verwendung von SELinux. Sie müssen Benutzerprofile konfigurieren, mit denen die Ports geöffnet werden können. Der
sshd
Prozess teilt die Berechtigungen des Benutzers auf, bevor ein Port zum Weiterleiten geöffnet wird, sodass alle auf die Prozesse des Benutzers angewendeten Funktionen erzwungen werdensshd
. Beachten Sie, dass Sie sich auf alle Benutzerprozesse beschränken müssen, da dies einmalnetcat
zum Weiterleiten eines anderen Ports verwendet werden kann. Ich werde später versuchen, die richtige Syntax für Sie zu finden (oder jeder andere Benutzer kann sie gerne für mich bearbeiten).Alternativ können Sie versuchen, zu verwenden
iptables
.Dies hindert sie jedoch nicht daran, den Port zu öffnen und einen anderen Benutzer zu verweigern.
quelle