GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bastion-Server:Verwenden Sie die TCP-Weiterleitung VS, indem Sie den privaten Schlüssel auf dem Server platzieren

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:

  1. Bastion-Benutzer erstellen
  2. Root-Anmeldung deaktivieren
  3. Blockieren Sie Hacking-Versuche
  4. Port ändern
  5. Firewall konfigurieren
  6. 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 :)


Linux
  1. Konvertieren Sie den privaten Openssh-Schlüssel in den privaten Ssh2-Schlüssel?

  2. Private Schlüssel über Maschinen hinweg teilen?

  3. Andere Cloud-Server-Nutzungsszenarien

  4. Warum sind < oder > erforderlich, um /dev/tcp

  5. So stellen Sie eine SSH-Verbindung zu einer ec2-Instanz im privaten VPC-Subnetz über einen NAT-Server her

Generieren und Verwenden eines SSH-Schlüssels mit PuTTY

So fügen Sie einem Ubuntu-Server eine private IP hinzu

So fügen Sie einem Debian-Server eine private IP hinzu

Erstellen Sie einen Cloud-Server

Melden Sie sich mit einem privaten SSH-Schlüssel auf einem Windows-Client bei einem Linux-Server an

Verwenden Sie NTP, um die Zeit zu synchronisieren