SSH/Gateway: Unterschied zwischen den Versionen
Die Seite wurde neu angelegt: „= Remote Management über SSH-Tunnel = '''Management von IT-Komponenten über einen SSH-Tunnel von beliebigen Lokationen aus''' == Motivation == Über das Int…“ |
K Textersetzung - „Man-Pages“ durch „Man-Page“ |
||
(396 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
'''SSH-Gateway''' - vermittelt verschlüsselte Tunnelverbindungen zwischen SSH-Clients | |||
''' | |||
== | == Beschreibung == | ||
; Teilnehmer bauen aktiv einen Tunnel zum Gateway auf | |||
* | * Keine Portweiterleitungen erforderlich | ||
* | * Keine Namensauflösung der Teilnehmer erforderlich | ||
* | ; Gateway vermittelt den Kontakt | ||
* Gateway ist ein SSH-Server im Internet | |||
* | ; Trennung verschiedener Kunden/Dienstleiter | ||
* Je Tunnel (Kombination aus Kunde/Dienstleiter) ein Zugang | |||
= | ; Szenario | ||
{| class="wikitable sortable" | |||
! Hostname !! Username | |||
|- | |||
| gateway.foxtom.de || sshTnlKunde001 | |||
|- | |||
| kunde001 || support | |||
|- | |||
| support || user | |||
|} | |||
== Gateway == | |||
=== Kunden-Zugang === | |||
==== Tunnel-Benutzerkonto ==== | |||
'''root@gateway#''' useradd --create-home --groups users --shell /bin/bash --comment "Tunnel-User Kunden001" sshTnlKunde001 | |||
<!-- Ist ein Loginshell notwendig?, Ist die Gruppe users erforderlich? --> | |||
== | ==== Passwort vergeben ==== | ||
'''root@gateway#''' passwd sshTnlKunde001 | |||
New password: | |||
Retype new password: | |||
passwd: password updated successfully | |||
==== Zugang testen ==== | |||
'''user@support#''' ssh -p22 sshTnlKunde001@gateway.foxtom.de | |||
sshTnlKunde001@gateway's password: | |||
=== SSH-Server === | |||
; UNIX Sockets | |||
* | Damit sich Kunden nicht mit dem System eines anderen Kunden verbinden können, werden hier UNIX Sockets verwandt. | ||
* Diese besitzen im Gegensatz zu TCP-Ports eine Zugriffssteuerung | |||
Damit der Socket beim Abbau des Tunnels eine neue Socket-Datei erstellt wird, wird die Konfiguration des SSH-Dienstes ergänzt | |||
* | * ein erneuter Aufbau des Tunnels ist ansonsten mit dem gleichen Socket-Namen nicht möglich | ||
''/etc/ssh/sshd_config'' | |||
# Specifies whether to remove an existing Unix-domain socket file for local or remote port forwarding before creating a new one. | |||
# Specifies whether to remove an existing Unix-domain socket file | |||
StreamLocalBindUnlink yes | StreamLocalBindUnlink yes | ||
== Kunden-Rechner == | |||
=== Tunnel-Benutzerkonto === | |||
=== | '''root@kunde001#''' useradd -m -G users -s /bin/bash kunde001Tnl | ||
root@ | |||
=== SSH-Key erzeugen === | |||
'''root@kunde001#''' sudo -u support -i | |||
'''support@kunde001$''' ssh-keygen -f /home/support/.ssh/gateway -t ecdsa | |||
support@ | |||
Keine Passphrase eingeben (Enter) | |||
=== Public-Key übertragen === | |||
'''support@kunde001$''' ssh-copy-id -p22 -i /home/support/.ssh/gateway.foxtom.de.pub sshTnlKunde001@gateway.foxtom.de | |||
support@ | === Public-Key-Zugang testen === | ||
'''support@kunde001$''' ssh -i /home/support/.ssh/gateway.foxtom.de -p22 sshTnlKunde001@gateway.foxtom.de | |||
# [[SSH/Fingerprint |Fingerprint vergleichen]] | |||
# Bestätigung durch Eingabe von "yes" | |||
Fehlermeldung "PTY allocation request failed on channel 0" und die Verbindung wird abgebrochen. Das ist beabsichtigt. | |||
=== Automatisierung === | |||
==== Systemd konfigurieren ==== | |||
; Systemd-Service-Unit | |||
''/etc/systemd/system/ssh-reverse@.service'' | |||
[Unit] | [Unit] | ||
Description=Reverse SSH Tunnel Service | Description=Reverse SSH Tunnel Service | ||
Zeile 160: | Zeile 82: | ||
User=support | User=support | ||
Environment="GWSOCK=40%I" | Environment="GWSOCK=40%I" | ||
Environment="GWUSER= | Environment="GWUSER=sshTnlKunde001" | ||
Environment="GWHOST=gateway | Environment="GWHOST=gateway" | ||
Environment="SSHKEY=/home/support/.ssh/gateway | Environment="SSHKEY=/home/support/.ssh/gateway" | ||
ExecStart=/usr/bin/ssh -NTC -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -o StrictHostKeyChecking=no -i ${SSHKEY} -R ${GWSOCK}:localhost:%I ${GWUSER}@${GWHOST} | ExecStart=/usr/bin/ssh -NTC -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -o StrictHostKeyChecking=no -i ${SSHKEY} -R ${GWSOCK}:localhost:%I ${GWUSER}@${GWHOST} | ||
Zeile 172: | Zeile 94: | ||
WantedBy=multi-user.target | WantedBy=multi-user.target | ||
Durch das @ im Namen der Unit können verschiedene Instanzen | Durch das @ im Namen der Unit-Datei können verschiedene Instanzen (also Tunnel) erstellt werden: | ||
'''root@kunde001#''' systemctl daemon-reload | |||
'''root@kunde001#''' systemctl start ssh-reverse@22.service | |||
'''root@kunde001#''' systemctl start ssh-reverse@443.service | |||
* Der Port des Tunnels auf dem Gateway wird auf "40%I" gesetzt wobei %I dem Instanznamen (hier 22 und 443) entspricht | |||
* Hier ergibt das auf dem Gateway TCP-Sockets mit den Ports 4022 und 40443. | |||
; Parameter für Instanzen | |||
* Drop-In-Files | |||
''/etc/systemd/system/ssh-reverse@22.service.d/tunnel.conf'' | |||
[Service] | [Service] | ||
# Port of the tunnel at the remote gateway | # Port of the tunnel at the remote gateway | ||
Zeile 192: | Zeile 112: | ||
Environment="GWUSER=ssh-kunde1" | Environment="GWUSER=ssh-kunde1" | ||
# remote gateway | # remote gateway | ||
##Environment="GWHOST=gateway | ##Environment="GWHOST=gateway" | ||
# Location of the SSH key | # Location of the SSH key | ||
##Environment="SSHKEY=/home/support/.ssh/gateway | ##Environment="SSHKEY=/home/support/.ssh/gateway" | ||
''/etc/systemd/system/ssh-reverse@443.service.d/tunnel.conf'' | |||
[Service] | [Service] | ||
# Port of the tunnel at the remote gateway | # Port of the tunnel at the remote gateway | ||
Zeile 204: | Zeile 123: | ||
Environment="GWUSER=ssh-kunde1" | Environment="GWUSER=ssh-kunde1" | ||
# remote gateway | # remote gateway | ||
##Environment="GWHOST=gateway | ##Environment="GWHOST=gateway" | ||
# Location of the SSH key | # Location of the SSH key | ||
##Environment="SSHKEY=/home/support/.ssh/gateway | ##Environment="SSHKEY=/home/support/.ssh/gateway" | ||
* Hier werden die auf dem Gateway verwendeten Sockets angepasst, statt den TCP-Ports werden verschiedene UNIX-Sockets verwendet. | |||
* Außerdem wird ein anderer User auf dem Gateway verwendet. | * Außerdem wird ein anderer User auf dem Gateway verwendet. | ||
[[Kategorie:SSH]] | |||
=== | == Support-Rechner == | ||
=== Public-Key-Zugang === | |||
==== Public-Key übertragen ==== | |||
'''user@support#''' ssh-copy-id -p22 sshTnlKunde001@gateway.foxtom.de | |||
user@ | ==== Public-Key-Zugang testen ==== | ||
'''user@support#''' ssh -p22 sshTnlKunde001@gateway.foxtom.de | |||
'''sshTnlKunde001@gateway:~$''' exit | |||
== Anwendung == | |||
=== Public-Key-Zugang === | |||
'''support@kunde001$''' ssh -i /home/support/.ssh/gateway.foxtom.de.pub -p22 sshTnlKunde001@gateway.foxtom.de | |||
# Fingerprint vergleichen | |||
# Bestätigung durch Eingabe von "yes" | |||
'''"PTY allocation request failed on channel 0"''' | |||
Fehlermeldung und die Verbindung wird abgebrochen, das ist beabsichtigt. | |||
=== Tunnel starten === | |||
'''user@support$''' ssh -nNT -L 10022:localhost:10001 sshTnlKunde001@gateway | |||
Damit wird ein Tunnel vom lokalen Port 10022 zum Port 10001 auf dem Gateway erstellt | Damit wird ein Tunnel vom lokalen Port 10022 zum Port 10001 auf dem Gateway erstellt | ||
=== Tunnelaufbau === | |||
; Manueller Aufbau | |||
'''support@debian01:~$''' ssh -N -T -C -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -o StrictHostKeyChecking=no -i '''${SSHKEY}''' -R '''${GWSOCK}''':localhost:'''${LOCALPORT}''' '''${GWUSER}'''@'''${GWHOST}''' | |||
{| class="wikitable sortable" | |||
|- | |||
! Optionen !! Bedeutung | |||
|- | |||
| '''-N''' || Keinen Befehl in der Ferne ausführen | |||
|- | |||
| '''-T''' || Deaktiviert Pseudo-Terminal-Zuweisung | |||
|- | |||
| '''-C''' || Komprimierung sämtlicher Daten | |||
|- | |||
| '''-o ServerAliveInterval=60''' || | |||
|- | |||
| '''-o ExitOnForwardFailure=yes''' || | |||
|- | |||
| '''-o StrictHostKeyChecking=no''' || | |||
|- | |||
| '''-i ${SSHKEY}''' ||absoluter Pfad zum SSH-Key, z. B. ~/.ssh/gateway | |||
|- | |||
| '''-R ${GWSOCK}:localhost:${LOCALPORT}''' || Reverse Tunnel erstellt, um vom Gateway aus auf den Kundenrechner zugreifen zu können | |||
|} | |||
{| class="wikitable sortable" | |||
|- | |||
! Parameter !! Bedeutung | |||
|- | |||
| '''${SSHKEY}''' || Der komplette Pfad zum SSH-Key, z. B. ~/.ssh/gateway | |||
|- | |||
| '''${GWSOCK}''' || Der Socket, welcher auf dem Gateway für den Tunnel verwendet wird | |||
* Diesen muss man dort ansprechen, um sich mit dem Zielsystem zu verbinden | |||
* Werden mehrere Tunnel zum Gateway aufgebaut (was recht wahrscheinlich ist), muss jeweils ein anderer Socket verwendet werden | |||
* Ein Socket kann ein TCP- oder ein UNIX-Socket sein. Ein TCP-Socket ist einfach eine Port-Nummer | |||
* Da zum Tunnelaufbau normale User (nicht root) genutzt werden, können dabei nur Ports über 1024 verwendet werden. Bei einem UNIX-Socket muss dessen kompletter Pfad angegeben werden, z. B. "/home/ssh-kunde1/zielsystem3.socket" (nicht "~/zielsystem3.socket") | |||
|- | |||
| '''${LOCALPORT}''' || | |||
* Das ist der Port, mit welchem der Tunnel auf dem Zielsystem verbunden wird | |||
* Soll über den Tunnel eine SSH-Sitzung aufgebaut werden, nimmt man den Port 22. Läuft auf dem Zielsystem ein Webserver und dieser soll über den Tunnel erreichbar sein, wird Port 443 genommen (für verschlüsselte Seiten). | |||
|- | |||
| '''${GWUSER}''' || | |||
* Der User auf dem Gateway | |||
* In unserem Beispiel also "sshTnlKunde001" oder "ssh-kunde1". [FIXME] | |||
|- | |||
| '''${GWHOST}''' || | |||
* Der Hostname des Gateways, also z. B. "gateway". | |||
|} | |||
; Beispiel | |||
$ ssh -N -T -C -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -o StrictHostKeyChecking=no -i ~/.ssh/gateway.foxtom.de -R 227:localhost:22 -p22 sshTnlKunde001@gateway.foxtom.de | |||
== Sicherheit == | |||
; Angriffsmöglichkeiten | |||
Es wird ein Tunnel durch die Firewall gebohrt, welche das Netzwerk mit dem Zielsystem schützt | |||
; Risiken | |||
Angreifer erlangt Zugriff auf das Gateway | |||
* könnte von dort alle zu managenden Zielsysteme erreichen | |||
* Das Zielsystem und das dahinter liegende Netzwerk ist dann nur noch durch die Sicherheitsmechanismen geschützt, welche die über den Tunnel erreichbare Anwendung auf dem Zielsystem bietet (z. B. SSH- oder Webserver). | |||
; Gateway gut absichern | |||
Das ist gar nicht so anspruchsvoll | |||
* weil es sich beim Gateway um ein Minimalsystem handelt | |||
* welches vergleichsweise einfach upgedatet und sicher konfiguriert werden kann | |||
; Sicherheitsmaßnahmen auf dem Zielsystem | |||
* laufende Updates | |||
* kein root-logins zulassen | |||
* starke Passwörter | |||
; Bewertung | |||
Bei Einhaltung dieser Maßnahmen die Sicherheit im Vergleich zu anderen Varianten (proprietäre Fernwartungstools, Port-Forwarding durch Firewalls) als höher einzuschätzen | |||
; Zusätzliche Absicherung | |||
* [[fail2ban]] | |||
* Durch die Supporter benutzte SSH-Schlüssel auf Smartcard ablegen | |||
* Die können z. B. , wie unter "[http://www.unitas-network.de/support/wiki/smartcards/ssh-login-mit-openpgp-card/ SSH-Login mit OpenPGP Card]" beschrieben, auf einer Smartcard abgelegt werden | |||
== Siehe auch == | |||
= Links = | {{Special:PrefixIndex/{{BASEPAGENAME}}}} | ||
== | === Dokumentation === | ||
== | ==== RFC ==== | ||
==== Man-Page ==== | |||
==== Info-Pages ==== | |||
=== Links === | |||
==== Projekt ==== | |||
==== Weblinks ==== | |||
# http://www.unitas-network.de/support/wiki/management/remote-management-mit-ssh-tunnel/ | # http://www.unitas-network.de/support/wiki/management/remote-management-mit-ssh-tunnel/ | ||
[[Kategorie:SSH]] |
Aktuelle Version vom 6. November 2024, 12:40 Uhr
SSH-Gateway - vermittelt verschlüsselte Tunnelverbindungen zwischen SSH-Clients
Beschreibung
- Teilnehmer bauen aktiv einen Tunnel zum Gateway auf
- Keine Portweiterleitungen erforderlich
- Keine Namensauflösung der Teilnehmer erforderlich
- Gateway vermittelt den Kontakt
- Gateway ist ein SSH-Server im Internet
- Trennung verschiedener Kunden/Dienstleiter
- Je Tunnel (Kombination aus Kunde/Dienstleiter) ein Zugang
- Szenario
Hostname | Username |
---|---|
gateway.foxtom.de | sshTnlKunde001 |
kunde001 | support |
support | user |
Gateway
Kunden-Zugang
Tunnel-Benutzerkonto
root@gateway# useradd --create-home --groups users --shell /bin/bash --comment "Tunnel-User Kunden001" sshTnlKunde001
Passwort vergeben
root@gateway# passwd sshTnlKunde001 New password: Retype new password: passwd: password updated successfully
Zugang testen
user@support# ssh -p22 sshTnlKunde001@gateway.foxtom.de sshTnlKunde001@gateway's password:
SSH-Server
- UNIX Sockets
Damit sich Kunden nicht mit dem System eines anderen Kunden verbinden können, werden hier UNIX Sockets verwandt.
- Diese besitzen im Gegensatz zu TCP-Ports eine Zugriffssteuerung
Damit der Socket beim Abbau des Tunnels eine neue Socket-Datei erstellt wird, wird die Konfiguration des SSH-Dienstes ergänzt
- ein erneuter Aufbau des Tunnels ist ansonsten mit dem gleichen Socket-Namen nicht möglich
/etc/ssh/sshd_config
# Specifies whether to remove an existing Unix-domain socket file for local or remote port forwarding before creating a new one. StreamLocalBindUnlink yes
Kunden-Rechner
Tunnel-Benutzerkonto
root@kunde001# useradd -m -G users -s /bin/bash kunde001Tnl
SSH-Key erzeugen
root@kunde001# sudo -u support -i support@kunde001$ ssh-keygen -f /home/support/.ssh/gateway -t ecdsa
Keine Passphrase eingeben (Enter)
Public-Key übertragen
support@kunde001$ ssh-copy-id -p22 -i /home/support/.ssh/gateway.foxtom.de.pub sshTnlKunde001@gateway.foxtom.de
Public-Key-Zugang testen
support@kunde001$ ssh -i /home/support/.ssh/gateway.foxtom.de -p22 sshTnlKunde001@gateway.foxtom.de
- Fingerprint vergleichen
- Bestätigung durch Eingabe von "yes"
Fehlermeldung "PTY allocation request failed on channel 0" und die Verbindung wird abgebrochen. Das ist beabsichtigt.
Automatisierung
Systemd konfigurieren
- Systemd-Service-Unit
/etc/systemd/system/ssh-reverse@.service
[Unit] Description=Reverse SSH Tunnel Service ConditionPathExists=|/usr/bin After=network.target [Service] User=support Environment="GWSOCK=40%I" Environment="GWUSER=sshTnlKunde001" Environment="GWHOST=gateway" Environment="SSHKEY=/home/support/.ssh/gateway" ExecStart=/usr/bin/ssh -NTC -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -o StrictHostKeyChecking=no -i ${SSHKEY} -R ${GWSOCK}:localhost:%I ${GWUSER}@${GWHOST} # Restart every >2 seconds to avoid StartLimitInterval failure RestartSec=3 Restart=always [Install] WantedBy=multi-user.target
Durch das @ im Namen der Unit-Datei können verschiedene Instanzen (also Tunnel) erstellt werden:
root@kunde001# systemctl daemon-reload root@kunde001# systemctl start ssh-reverse@22.service root@kunde001# systemctl start ssh-reverse@443.service
- Der Port des Tunnels auf dem Gateway wird auf "40%I" gesetzt wobei %I dem Instanznamen (hier 22 und 443) entspricht
- Hier ergibt das auf dem Gateway TCP-Sockets mit den Ports 4022 und 40443.
- Parameter für Instanzen
- Drop-In-Files
/etc/systemd/system/ssh-reverse@22.service.d/tunnel.conf
[Service] # Port of the tunnel at the remote gateway Environment="GWSOCK=/home/ssh-kunde1/ziel3-ssh.socket" # User at gateway to create the tunnel Environment="GWUSER=ssh-kunde1" # remote gateway ##Environment="GWHOST=gateway" # Location of the SSH key ##Environment="SSHKEY=/home/support/.ssh/gateway"
/etc/systemd/system/ssh-reverse@443.service.d/tunnel.conf
[Service] # Port of the tunnel at the remote gateway Environment="GWSOCK=/home/ssh-kunde1/ziel3-https.socket" # User at gateway to create the tunnel Environment="GWUSER=ssh-kunde1" # remote gateway ##Environment="GWHOST=gateway" # Location of the SSH key ##Environment="SSHKEY=/home/support/.ssh/gateway"
- Hier werden die auf dem Gateway verwendeten Sockets angepasst, statt den TCP-Ports werden verschiedene UNIX-Sockets verwendet.
- Außerdem wird ein anderer User auf dem Gateway verwendet.
Support-Rechner
Public-Key-Zugang
Public-Key übertragen
user@support# ssh-copy-id -p22 sshTnlKunde001@gateway.foxtom.de
Public-Key-Zugang testen
user@support# ssh -p22 sshTnlKunde001@gateway.foxtom.de sshTnlKunde001@gateway:~$ exit
Anwendung
Public-Key-Zugang
support@kunde001$ ssh -i /home/support/.ssh/gateway.foxtom.de.pub -p22 sshTnlKunde001@gateway.foxtom.de
- Fingerprint vergleichen
- Bestätigung durch Eingabe von "yes"
"PTY allocation request failed on channel 0"
Fehlermeldung und die Verbindung wird abgebrochen, das ist beabsichtigt.
Tunnel starten
user@support$ ssh -nNT -L 10022:localhost:10001 sshTnlKunde001@gateway
Damit wird ein Tunnel vom lokalen Port 10022 zum Port 10001 auf dem Gateway erstellt
Tunnelaufbau
- Manueller Aufbau
support@debian01:~$ ssh -N -T -C -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -o StrictHostKeyChecking=no -i ${SSHKEY} -R ${GWSOCK}:localhost:${LOCALPORT} ${GWUSER}@${GWHOST}
Optionen | Bedeutung |
---|---|
-N | Keinen Befehl in der Ferne ausführen |
-T | Deaktiviert Pseudo-Terminal-Zuweisung |
-C | Komprimierung sämtlicher Daten |
-o ServerAliveInterval=60 | |
-o ExitOnForwardFailure=yes | |
-o StrictHostKeyChecking=no | |
-i ${SSHKEY} | absoluter Pfad zum SSH-Key, z. B. ~/.ssh/gateway |
-R ${GWSOCK}:localhost:${LOCALPORT} | Reverse Tunnel erstellt, um vom Gateway aus auf den Kundenrechner zugreifen zu können |
Parameter | Bedeutung |
---|---|
${SSHKEY} | Der komplette Pfad zum SSH-Key, z. B. ~/.ssh/gateway |
${GWSOCK} | Der Socket, welcher auf dem Gateway für den Tunnel verwendet wird
|
${LOCALPORT} |
|
${GWUSER} |
|
${GWHOST} |
|
- Beispiel
$ ssh -N -T -C -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -o StrictHostKeyChecking=no -i ~/.ssh/gateway.foxtom.de -R 227:localhost:22 -p22 sshTnlKunde001@gateway.foxtom.de
Sicherheit
- Angriffsmöglichkeiten
Es wird ein Tunnel durch die Firewall gebohrt, welche das Netzwerk mit dem Zielsystem schützt
- Risiken
Angreifer erlangt Zugriff auf das Gateway
- könnte von dort alle zu managenden Zielsysteme erreichen
- Das Zielsystem und das dahinter liegende Netzwerk ist dann nur noch durch die Sicherheitsmechanismen geschützt, welche die über den Tunnel erreichbare Anwendung auf dem Zielsystem bietet (z. B. SSH- oder Webserver).
- Gateway gut absichern
Das ist gar nicht so anspruchsvoll
- weil es sich beim Gateway um ein Minimalsystem handelt
- welches vergleichsweise einfach upgedatet und sicher konfiguriert werden kann
- Sicherheitsmaßnahmen auf dem Zielsystem
- laufende Updates
- kein root-logins zulassen
- starke Passwörter
- Bewertung
Bei Einhaltung dieser Maßnahmen die Sicherheit im Vergleich zu anderen Varianten (proprietäre Fernwartungstools, Port-Forwarding durch Firewalls) als höher einzuschätzen
- Zusätzliche Absicherung
- fail2ban
- Durch die Supporter benutzte SSH-Schlüssel auf Smartcard ablegen
- Die können z. B. , wie unter "SSH-Login mit OpenPGP Card" beschrieben, auf einer Smartcard abgelegt werden