Wie deaktiviere ich die lokale SSH-Portweiterleitung?

20

Ich habe einen Server mit Ubuntu und dem OpenSSH-Daemon. Nennen wir es S1.

Ich benutze diesen Server von Client-Rechnern (nennen wir einen von ihnen C1), um einen SSH-Reverse-Tunnel mithilfe von Remote-Port-Forwarding durchzuführen, z.

ssh -R 1234:localhost:23 login@S1

Auf S1 verwende ich die Standarddatei sshd_config. Soweit ich sehen kann, kann sich jeder mit den richtigen Anmeldeinformationen {login, pwd} auf S1 bei S1 anmelden und entweder eine Remote-Portweiterleitung und eine lokale Portweiterleitung durchführen. Solche Anmeldeinformationen könnten in Zukunft ein Zertifikat sein, daher kann sich nach meinem Verständnis jeder, der das Zertifikat ergreift, von einem anderen Ort aus (nicht unbedingt von C1 aus) bei S1 anmelden und somit lokale Portweiterleitungen erstellen.

Das Zulassen der lokalen Portweiterleitung ist für mich zu gefährlich, da damit eine Art öffentlicher Proxy erstellt werden kann. Ich suche nach einer Möglichkeit, nur -L Weiterleitungen zu deaktivieren.

Ich habe Folgendes versucht, aber dies deaktiviert sowohl die lokale als auch die Remote-Weiterleitung:

AllowTcpForwarding No

Ich habe auch folgendes ausprobiert, dies erlaubt nur -L zu SX: 1. Es ist besser als nichts, aber immer noch nicht das, was ich brauche, was eine "keine" Option ist.

PermitOpen SX:1

Also frage ich mich, ob es einen Weg gibt, damit ich allen lokalen Portforwards verbieten kann, etwas zu schreiben wie:

PermitOpen none:none

Ist das Folgende eine nette Idee?

PermitOpen localhost:1
SCO
quelle
Kommen wir also wie immer zur Wurzel: Was ist Ihr eigentliches Problem, warum möchten Sie so etwas für mobile / eingebettete Geräte einrichten, was möchten Sie lösen?
Akira
Das Problem, das hier gelöst werden muss, besteht darin, dass eine Telnet-Sitzung von einem beliebigen Ort aus über das Internet mit einem mit dem Internet verbundenen mobilen / eingebetteten Gerät geöffnet werden kann, wobei berücksichtigt wird, dass das Gerät möglicherweise NAT-fähig ist oder über eine Firewall nicht erreichbar ist aus dem Internet.
SCO
Telnet .. wozu? für das
lochen

Antworten:

16

Jeder mit Anmeldeinformationen kann seine eigene Instanz von sshd aufrufen, die auf einem zufälligen Port ausgeführt wird, und zulassen, was immer er will, einschließlich -L lokaler Weiterleitungen:

% /usr/sbin/sshd -d -f mysshd.config -p 12345

Wenn Sie den Benutzern nicht vertrauen, etwas mit Ihrem Computer zu tun, sollten Sie ihnen nicht erlauben, sich an erster Stelle anzumelden.

(Übrigens ist das -D-Flag auch "Proxy-problematisch")

Akira
quelle
Nun, ich schätze, ich kann zu diesem Zweck ein sehr restriktives Konto einrichten (z. B. den Benutzer an sein Zuhause halten, keine Auflistung, kein Durchsuchen des Dateisystems), so dass er nicht starten und sshd (oder eine sshd-Binärdatei installieren und starten kann). Der Punkt ist, dass die Clients eingebettete Geräte sein sollen. Da sie jedoch wahrscheinlich Zertifikate einbetten und ihr Flash-Memoery gelöscht werden kann, können die Zertifikate auslaufen und es jedem ermöglichen, sich bei S1 anzumelden.
SCO
Wenn Sie ChrootDirectory für diesen bestimmten Benutzer verwenden, ist dies der Trick. Versuchen Sie es!
SCO
1
In authorized_keys setzen Sie command="/sbin/nologin". Dies sollte verhindern, dass Befehle auf dem Server ausgeführt werden.
Justis
Die Aussage "Jeder mit Anmeldeinformationen kann sein eigenes <whatever> aufrufen" ist falsch. sshkann verwendet werden, um eine Verbindung zu Konten herzustellen, die stark eingeschränkte Anmelde-Shells haben, die dies nicht zulassen. Port Forwarding ist eine Sicherheitslücke in solchen eingeschränkten Shells. Zusätzlich zum Ausführen eines zulässigen Befehls kann der Benutzer Tunnel erstellen.
Kaz
3
Zitat aus der sshd_configManpage: Beachten Sie, dass das Deaktivieren der TCP-Weiterleitung die Sicherheit nur verbessert, wenn Benutzern auch der Shell-Zugriff verweigert wird , da sie jederzeit ihre eigenen Weiterleitungen installieren können. (Hervorhebung von mir).
Kaz
17

Eine andere Lösung wäre, die Portweiterleitung nur bestimmten Benutzern zu erlauben:

Von SSH: Die endgültige Anleitung

Die Portweiterleitung kann in sshd global aktiviert oder deaktiviert werden. Dies geschieht mit dem serverweiten Konfigurationsschlüsselwort AllowTcpForwarding in / etc / sshd_config. Das Schlüsselwort kann den Wert yes (Standardeinstellung, Weiterleitung aktivieren) oder no (Weiterleitung deaktivieren) haben:

# SSH1, SSH2, OpenSSH
AllowTcpForwarding no

Darüber hinaus bietet SSH2 die folgenden Optionen:

# SSH2 only
AllowTcpForwardingForUsers
AllowTcpForwardingForGroups

Die Syntax ist dieselbe wie für die Optionen AllowUsers und AllowGroups. [Abschnitt 5.5.2.1, „Kontozugriffskontrolle“] Sie geben eine Liste von Benutzern oder Gruppen an, die die Portweiterleitung verwenden dürfen. Der Server lehnt es ab, Portweiterleitungsanforderungen für andere Personen zu berücksichtigen. Beachten Sie, dass sich diese auf das Zielkonto der SSH-Sitzung beziehen, nicht auf den Client-Benutzernamen (der häufig nicht bekannt ist).

...

Es ist wichtig zu wissen, dass die Anweisungen in diesem Abschnitt die Portweiterleitung nicht tatsächlich verhindern, es sei denn, Sie deaktivieren auch interaktive Anmeldungen und schränken ein, welche Programme auf der Remote-Seite ausgeführt werden dürfen. Ansonsten können sachkundige Benutzer einfach ihre eigene Portweiterleitungsanwendung über die SSH-Sitzung ausführen. Diese Einstellungen allein mögen eine ausreichende Abschreckung in einer nicht-technischen Community sein, aber sie werden niemanden aufhalten, der weiß, was sie tut.

Christian
quelle
1
Grundsätzlich habe ich auf S1 nur einen Benutzer eingerichtet. In diesem speziellen Fall reicht AFAIU mit AllowTcpForwardingForUsers / AllowTcpForwardingForGroups nicht aus, oder? Das Verbieten der interaktiven Anmeldung ist eine gute Idee, da Benutzer dann keine Binärdateien mehr starten können. Aber jeder Client darf trotzdem die -L-Syntax verwenden, oder? Die besten Optionen wären vorerst: 1 / Interaktive Anmeldung deaktivieren, 2 / PermitOpen mit einem falschen Hostnamen: port. Habe ich etwas verpasst ?
SCO
Am besten überprüfen Sie dies, indem Sie das Setup ausprobieren.
Christian
Ich kann diese Optionen in der kostenlosen OpenSSH-Software nicht sehen. Ein Google für AllowTcpForwardingForUsersenthüllt, dass es in einer konfiguriert sshd2_configist, die in einigen kommerziellen Programmen verwendet wird. Sehen Sie sich eine der Antworten an: superuser.com/questions/384643/…
Kaz
^ OpenSSH hat MatchBlöcke in der Konfiguration. Sie können Matchauf Benutzer und Gruppen, und schließen Sie die AllowTcpForwardinginnerhalb.
Kaz
2

Es gibt jetzt eine Option, um nur lokale / Remote-Weiterleitung zuzulassen.

AllowTcpForwarding Gibt an, ob die TCP-Weiterleitung zulässig ist. Die verfügbaren Optionen sind "Ja" oder "Alle", um die TCP-Weiterleitung zuzulassen, "Nein", um die TCP-Weiterleitung zu verhindern, "Lokal", um die lokale Weiterleitung (aus der Sicht von ssh (1)) zuzulassen, oder "Remote", um die Remote- Weiterleitung zuzulassen nur nachsenden . Der Standardwert ist "Ja". Beachten Sie, dass das Deaktivieren der TCP-Weiterleitung die Sicherheit nur verbessert, wenn Benutzern auch der Shell-Zugriff verweigert wird, da sie jederzeit ihre eigenen Weiterleitungen installieren können.

Wie bereits erwähnt, sollten Sie die Shell auch auf nologin setzen.

Markus Rathgeb
quelle
0

Meine Lösung für dieses Problem war das Hinzufügen von: PermitOpen fo.local: 80 im Hauptabschnitt von sshd_config.

Dies lehnt einfach jede Anfrage nach lokaler Weiterleitung ab, mit Ausnahme von fo.local: 80.

MrMisu
quelle
0

Ich suche nach einer Möglichkeit, nur -L Weiterleitungen zu deaktivieren

Wenn ich Sie richtig verstehe, haben Ihre Benutzer vollständigen Shell-Zugriff, möchten jedoch nicht, dass sie Verbindungen zum Rest des Netzes herstellen können.

Die von SSH zugelassene "lokale Portweiterleitung" ist nur eine der Möglichkeiten, dies zu tun. Andere schließen eine Instanz starten socat, netcatoder jede andere Anzahl von Werkzeugen.

Die beste Möglichkeit, ausgehende und eingehende Verbindungen in Linux zu steuern, ist Netfilter, auch bekannt als IPTables.

Es verfügt über ein spezielles Modul namens owner ( ipt_owner), mit dem Sie verschiedene Eigenschaften des Paketerstellers für lokal generierte Pakete abgleichen können. Es gilt in den OUTPUTund POSTROUTINGKetten.

Sie können damit ausgehende Pakete ablehnen, die von bestimmten Benutzergruppen generiert wurden, und somit jede Art von Portweiterleitung und nicht nur die -LOption von SSH deaktivieren.

Tobia
quelle