SSH/Gateway: Unterschied zwischen den Versionen

Aus Foxwiki
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:
= Remote Management über SSH-Tunnel =
'''SSH-Gateway''' - vermittelt verschlüsselte Tunnelverbindungen zwischen SSH-Clients
'''Management von IT-Komponenten über einen SSH-Tunnel von beliebigen Lokationen aus'''


== Motivation ==
== Beschreibung ==
Über das Internet können Management, Support und Wartung von IT-Systemen jederzeit und unabhängig vom Standort durchgeführt werden
; Teilnehmer bauen aktiv einen Tunnel zum Gateway auf
* Das spart Zeit und Kosten
* Keine Portweiterleitungen erforderlich
* Aus diesem Grund wurden spezielle Fernwartungstools wie z.B. TeamViewer oder ISL Online entwickelt
* Keine Namensauflösung der Teilnehmer erforderlich
* Gegen deren Einsatz sprechen aber evtl
; Gateway vermittelt den Kontakt
* Sicherheitsbedenken, Funktionalität auf weniger verbreiteten Betriebssystemen oder auch die Kosten
* Gateway ist ein SSH-Server im Internet
* Eine Alternative wird im Folgenden vorgestellt.
; Trennung verschiedener Kunden/Dienstleiter
* Je Tunnel (Kombination aus Kunde/Dienstleiter) ein Zugang


== Funktionsprinzip ==
; Szenario
Um auf ein internes IT-System (im Firmennetz oder zuhause) von außerhalb zuzugreifen, gibt es verschiedene Möglichkeiten
{| class="wikitable sortable"
* Dazu gehören die o.g
! Hostname !! Username
* Fernwartungstools oder auch ein VPN. Alle erstellen einen abgesicherten Tunnel, über welchen die Daten übertragen werden
|-
* Auch die hier beschriebene Lösung nutzt einen Tunnel, und zwar einen über das SSH-Protokoll
| gateway.foxtom.de || sshTnlKunde001
* Ein von außen (über das Internet) initiierter Zugriff würde ein Öffnen der Firewall erfordern und ist daher meist nicht gewünscht
|-
* Deswegen baut, so wie das andere Fernwartungstools auch machen, das zu managende Zielsystem selbst aktiv eine Verbindung zu einem Gateway im Internet auf
| kunde001 || support
* Auf diesem Gateway muß lediglich ein SSH-Server laufen, was bei den meisten üblichen Linux-Distributionen der Standard ist.
|-
| support || user
|}


Der Supporter baut mit seinem Support-Client selbst auch einen SSH-Tunnel zum Gateway auf und hat darüber dann Zugriff auf das zu managende Zielsystem.
== 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? -->


== Sicherheitsbetrachtungen ==
==== Passwort vergeben ====
Es wird ein Tunnel durch die Firewall gebohrt, welche das Netzwerk mit dem Zielsystem schützt
'''root@gateway#''' passwd sshTnlKunde001
* Das schafft definitiv neue Angriffsmöglichkeiten auf das Netzwerk
New password:
* Hier muß man, wie bei allen Fernwartungszugängen, zwischen dem Komfortgewinn und dem Sicherheitsverlust abwägen.
Retype new password:
passwd: password updated successfully


Ein potentieller Angreifer müßte Zugriff auf das Gateway erlangen und könnte von dort alle zu managenden Zielsysteme erreichen
==== Zugang testen ====
* Das Zielsystem und das dahinter liegende Netzwerk ist dann nur noch durch die Sicherheitsmechanismen geschützt, welche die über den Tunnel errreichbare Anwendung auf dem Zielsystem bietet (z.B. SSH- oder Webserver).
'''user@support#''' ssh -p22 sshTnlKunde001@gateway.foxtom.de
sshTnlKunde001@gateway's password:


Es ist also zum einen wichtig, das Gateway gut abzusichern
=== SSH-Server ===
* Das ist gar nicht so anspruchsvoll, weil es sich beim Gateway um ein Minimalsystem handelt, welches vergleichsweise einfach upgedatet und sicher konfiguriert werden kann
; UNIX Sockets
* Zum anderen sollten auch auf dem Zielsystem die üblichen Sicherheitsmaßnahmen durchgeführt werden (laufende Updates, sichere Paßwörter usw.). Insgesamt ist bei Einhaltung dieser Maßnahmen die Sicherheit im Vergleich zu anderen Varianten (proprietäre Fernwartungstools, Port-Forwarding durch Firewalls) als höher einzuschätzen.
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


Empfehlenswert ist eine zusätzliche Absicherung der durch die Supporter benutzten SSH-Schlüssel
Damit der Socket beim Abbau des Tunnels eine neue Socket-Datei erstellt wird, wird die Konfiguration des SSH-Dienstes ergänzt
* 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.
* ein erneuter Aufbau des Tunnels ist ansonsten mit dem gleichen Socket-Namen nicht möglich


== Parameter ==
''/etc/ssh/sshd_config''
Als Beispiel für diese Anleitung werden folgende Parameter angenommen:* '''Allgemein:'''
  # Specifies whether to remove an existing Unix-domain socket file for local or remote port forwarding before creating a new one.
** Linux-Systeme: getestet mit Gentoo Linux und OpenSSH, sollte aber sinngemäß mit jeder Distribution oder auch mit *BSD funktionieren
* '''Gateway:'''
** Hostname: gateway.example.de
** Benutzer, unter welchem die Tunnel erstellt werden: sshtunnel(oder verschiedene)
* '''zu managendes Gerät (Zielsystem):'''
** Hostname: mgmtdest.example.de
** Benutzer, unter welchem die Tunnel erstellt werden: support
 
== Konfiguration ==
=== Gateway ===
Als Gateway kann ein beliebiger Linux-Server im Internet dienen
* Ein SSH-Server wird dort bereits aktiv sein
* Für den Tunnel-Aufbau wird ein separater User angelegt:
 
root@gateway# useradd --create-home \
                      --groups users \
                      --shell /bin/bash \
                      sshtunnel
root@gateway# passwd --lock sshtunnel
 
Durch "passwd --lock" wird ein Login mit Paßwort gesperrt, SSH-Schlüssel funktionieren noch.
 
Die Supporter sollten nun unter diesem User ihren SSH-Key hinterlegen
* Außerdem sollte die paßwortbasierte Authentifizierung auch am SSH-Server abgeschaltet werden.
 
Sollen auf dem Gateway verschiedene Nutzergruppen mit Zugriff auf unterschiedliche Zielsystem existieren (mehrere Kunden,verschiedene Dienstleister oder ähnliche Szenarien), empfiehlt es sich, für jede Kombination aus Supportern und Zielsystemen einen eigenen Tunnelnutzer anzulegen:
 
root@gateway# useradd --create-home \
                      --groups users \
                      --shell /bin/bash \
                      --uid 3001 \
                      --comment "User für Tunnel zu Systemen vom Kunden1" \
                      ssh-kunde1
root@gateway# passwd --lock ssh-kunde1
 
Das Verbinden des vom Zielsystem kommenden Tunnels mit dem des Supporters geschieht eigentlich über einen TCP-Port
* Der Supporter gibt beim Aufbau des Tunnels den gleichen Port auf dem Gateway an, den das Zielsystem für seinen Tunnel nutzt
* Da TCP-Ports über keine Zugriffssteuerung verfügen, könnte sich beim o.g
* Szenario mit mehreren Nutzergruppen z.B. auch der Kunde1 mit dem SSH-Schlüssel seines Zielsystems mit dem Tunnel zum Zielsystem des Kunden2 verbinden
* Um das zu verhindern, bietet sich die Nutzung von UNIX Sockets an
* Diese sind nur für den jeweiligen Tunnel-User erreichbar.
 
Bei Nutzung von UNIX Sockets sollte die Konfiguration des SSH-Daemons wie folgt ergänzt werden:
 
  # Specifies whether to remove an existing Unix-domain socket file
# for local or remote port forwarding before creating a new one.
  StreamLocalBindUnlink yes
  StreamLocalBindUnlink yes


Ohne diesen Eintrag wir des Socket beim Abbau des Tunnels nicht gelöscht, wonach der Tunnel nicht wieder mit dem gleichen Socket-Namen aufgebaut werden könnte.
== Kunden-Rechner ==
 
=== Tunnel-Benutzerkonto ===
=== Zielsystem Linux ===
  '''root@kunde001#''' useradd -m -G users -s /bin/bash kunde001Tnl
Für den Tunnelaufbau zum Gateway wird ein separater User verwendet:
 
  root@mgmtdest# useradd -m -G users -s /bin/bash support
 
Nach Login als dieser neue User wird ein SSH-Key für den Tunnel erzeugt (als Name wird im Beispiel der FQDN des Gateways genutzt, das ist aber nicht zwingend):
 
root@mgmtdest# sudo -u support -i
support@mgmtdest$ ssh-keygen -f ~/.ssh/gateway.example.de -t ecdsa
 
Eine Passphrase wird nicht verwendet (nur Enter drücken).
 
Der öffentliche Schlüssel muß nun auf dem Gateway der Datei ~/.ssh/authorized_keys des Tunnel-Users hinzugefügt werden
* Angezeigt werden kann der Schlüssel mittels:
 
support@mgmtdest$ cat ~/.ssh/gateway.example.de.pub
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGFrouMZKE6ozpWLj+xH3mONc6LWL3ZbnFbpL7sMKAjMSiTlBzek0doEHrh9VvTmKce4pmHK9ilkI4ILFw7t+sk= support@mgmtdest
 
Auf dem Gateway wird als der dortige Tunnel-User der Schlüssel wie folgt eingefügt:


  sshtunnel@gateway$ echo command=\"\",no-pty ecdsa-sha2-nistp256 \
=== SSH-Key erzeugen ===
AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBB\
  '''root@kunde001#''' sudo -u support -i
GFrouMZKE6ozpWLj+xH3mONc6LWL3ZbnFbpL7sMKAjMSiTlBzek0doE\
  '''support@kunde001$''' ssh-keygen -f /home/support/.ssh/gateway -t ecdsa
Hrh9VvTmKce4pmHK9ilkI4ILFw7t+sk= \
  support@mgmtdest \
>>~/.ssh/authorized_keys


Durch das Voranstellen von ''command="",no-pty'' kann ein User mit diesem Key auf dem Gateway kein Kommando ausführen und kein Terminal öffnen.
Keine Passphrase eingeben (Enter)


Zurück auf dem Zielsystem wird nun zum Test und zur Aufnahme als "known host" eine SSH-Verbindung zum Gateway aufgebaut:
=== Public-Key übertragen ===
'''support@kunde001$''' ssh-copy-id -p22 -i /home/support/.ssh/gateway.foxtom.de.pub sshTnlKunde001@gateway.foxtom.de


  support@mgmtdest$ ssh -i ~/.ssh/gateway.example.de sshtunnel@gateway.example.de
=== Public-Key-Zugang testen ===
  '''support@kunde001$''' ssh -i /home/support/.ssh/gateway.foxtom.de -p22 sshTnlKunde001@gateway.foxtom.de


Nach Vergleich des angezeigten Fingerprints und Bestätigung durch Eingabe von "yes" erscheint eine Fehlermeldung "PTY allocation request failed on channel 0" und die Verbindung wird wieder abgebrochen
# [[SSH/Fingerprint |Fingerprint vergleichen]]
* Das ist so gewollt.
# Bestätigung durch Eingabe von "yes"
Fehlermeldung "PTY allocation request failed on channel 0" und die Verbindung wird abgebrochen. Das ist beabsichtigt.


Der Tunnel kann nun mit folgendem Kommando aufgebaut werden:
=== Automatisierung ===
 
==== Systemd konfigurieren ====
ssh -NTC\
; Systemd-Service-Unit  
  -o ServerAliveInterval=60
  -o ExitOnForwardFailure=yes
  -o StrictHostKeyChecking=no\
  -i ${SSHKEY}
  -R ${GWSOCK}:localhost:${LOCALPORT}\
  ${GWUSER}@${GWHOST}
 
Durch den Parameter "-R" wird ein reverse Tunnel erstellt, denn es soll ja aus Richtung Gateway auf das Zielsystem zugegriffen werden können
* Die verwendeten Variablen haben folgende Bedeutung:* ${SSHKEY}: der komplette Pfad zum SSH-Key, z.B. ~/.ssh/gateway.example.de
* ${GWSOCK}: Der Socket, welcher auf dem Gateway für den Tunnel verwendet wird
* Diesen muß man dort ansprechen, um sich mit dem Zielsystem zu verbinden
* Werden mehrere Tunnel zum Gateway aufgebaut (was recht wahrscheinlich ist), muß natürlich für jeden 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 muß dessen kompletter Pfad angegeben werden, z.B. "/home/ssh-kunde1/zielsystem3.socket". Das darf nicht mit "~/zielsystem3.socket" abgekürzt werden
*
* ${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 "sshtunnel" oder "ssh-kunde1".
* ${GWHOST}: Der Hostname des Gateways, also z.B. "gateway.example.de".
 
Soll der Tunnel automatisch beim Booten gestartet werden, erstellen wir für Systemd-Systeme eine passende Service-Unit:
 
'''/etc/systemd/system/ssh-reverse@.service'''


''/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=sshtunnel"
  Environment="GWUSER=sshTnlKunde001"
  Environment="GWHOST=gateway.example.de"
  Environment="GWHOST=gateway"
  Environment="SSHKEY=/home/support/.ssh/gateway.example.de"
  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, also mehrere Tunnel erstellt werden
Durch das @ im Namen der Unit-Datei können verschiedene Instanzen (also Tunnel) erstellt werden:
* Z.B. einer für SSH und einer für HTTPS:
'''root@kunde001#''' systemctl daemon-reload
'''root@kunde001#''' systemctl start ssh-reverse@22.service
'''root@kunde001#''' systemctl start ssh-reverse@443.service


root@mgmtdest# systemctl daemon-reload
* Der Port des Tunnels auf dem Gateway wird auf "40%I" gesetzt wobei %I dem Instanznamen (hier 22 und 443) entspricht
root@mgmtdest# systemctl start ssh-reverse@22.service
* Hier ergibt das auf dem Gateway TCP-Sockets mit den Ports 4022 und 40443.
root@mgmtdest# systemctl start ssh-reverse@443.service


Der Port des Tunnels auf dem Gateway wird auf "40%I" gesetzt wobei %I dem Instanznamen (im Beispiel 22 und 443) entspricht
; Parameter für Instanzen
* Im Beispiel ergibt das auf dem Gateway TCP-Sockets mit den Ports 4022 und 40443.
* Drop-In-Files
 
Die Parameter für die einzelnen Instanzen können und sollten über Drop-In-Files angepaßt werden, z.B.:
 
'''/etc/systemd/system/ssh-reverse@22.service.d/tunnel.conf:'''


''/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.example.de"
  ##Environment="GWHOST=gateway"
  # Location of the SSH key
  # Location of the SSH key
  ##Environment="SSHKEY=/home/support/.ssh/gateway.example.de"
  ##Environment="SSHKEY=/home/support/.ssh/gateway"
 
'''/etc/systemd/system/ssh-reverse@443.service.d/tunnel.conf:'''


''/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.example.de"
  ##Environment="GWHOST=gateway"
  # Location of the SSH key
  # Location of the SSH key
  ##Environment="SSHKEY=/home/support/.ssh/gateway.example.de"
  ##Environment="SSHKEY=/home/support/.ssh/gateway"


In diesen Beispielen werden die auf dem Gateway verwendeten Sockets angepaßt, statt den TCP-Ports verden verschiedene UNIX-Sockets verwendet
* 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.


=== Zielsystem Windows ===
[[Kategorie:SSH]]
''Wird noch getestet...''


=== Supportclient Linux ===
== Support-Rechner ==
Als normaler User, dessen SSH-Key beim Tunnel-User auf dem Gateway ("sshtunnel") hinterlegt ist, wird der Tunnel zum Gateway wie folgt aufgebaut:
=== Public-Key-Zugang ===
==== Public-Key übertragen ====
'''user@support#''' ssh-copy-id -p22 sshTnlKunde001@gateway.foxtom.de


  user@supportclient$ ssh -nNT -L 10022:localhost:10001 \
==== Public-Key-Zugang testen ====
                        sshtunnel@gateway.example.de
  '''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
* Hat das Zielsystem, wie im Beispiel, einen reverse Tunnel zum Gateway von seinem lokalen Port 22 auf den Port 10001 auf dem Gateway gestartet, kann man nun vom Supportclient auf das Zielsystem mit SSH zugreifen:


  user@supportclient$ ssh -p 10022 admin@localhost
=== 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.&nbsp;B.&nbsp; ~/.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.&nbsp;B.&nbsp; ~/.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.&nbsp;B.&nbsp; "/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.&nbsp;B.&nbsp; "gateway".
|}


"admin" ist ein Nutzer auf dem Zielsystem, über welchen der Support abgewickelt wird.
; 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


Wird der Tunnel vom Zielsystem aus auf dem Gateway mit dem UNIX-Socket "" erstellt, wird der Tunnel vom Support-Client zum Gateway stattdessen so aufgebaut:
== Sicherheit ==
; Angriffsmöglichkeiten
Es wird ein Tunnel durch die Firewall gebohrt, welche das Netzwerk mit dem Zielsystem schützt


user@supportclient$ ssh -nNT -L 10022:/home/ssh-kunde1/ziel3-ssh.socket \
; Risiken
                        sshtunnel@gateway.example.de
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.&nbsp;B.&nbsp; SSH- oder Webserver).


Ist ein Zugriff mittels Browser auf das Zielsystem notwendig, wird ein zweiter Tunnel zum Gateway erstellt:
; 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


user@supportclient$ ssh -nNT -L 10443:localhost:10002 \
; Sicherheitsmaßnahmen auf dem Zielsystem
                        sshtunnel@gateway.example.de
* laufende Updates
* kein root-logins zulassen
* starke Passwörter


Bzw
; Bewertung
* bei einem UNIX-Socket:
Bei Einhaltung dieser Maßnahmen die Sicherheit im Vergleich zu anderen Varianten (proprietäre Fernwartungstools, Port-Forwarding durch Firewalls) als höher einzuschätzen


user@supportclient$ ssh -nNT -L 10443:/home/ssh-kunde1/ziel3-https.socket \
; Zusätzliche Absicherung
                        sshtunnel@gateway.example.de
* [[fail2ban]]
* Durch die Supporter benutzte SSH-Schlüssel auf Smartcard ablegen
* Die können z.&nbsp;B.&nbsp;, 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


Wird nun im Browser [https://localhost:10443/ https://localhost:10443] eingegeben, ist man direkt mit dem Webserver auf dem Zielsystem verbunden.
== Siehe auch ==


= Links =
{{Special:PrefixIndex/{{BASEPAGENAME}}}}
== Intern ==
=== Dokumentation ===
== Extern ==
==== 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
  1. Fingerprint vergleichen
  2. 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
  1. Fingerprint vergleichen
  2. 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
  • 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 "SSH-Login mit OpenPGP Card" beschrieben, auf einer Smartcard abgelegt werden

Siehe auch

Dokumentation

RFC

Man-Page

Info-Pages

Links

Projekt

Weblinks

  1. http://www.unitas-network.de/support/wiki/management/remote-management-mit-ssh-tunnel/