Zum Inhalt springen

SSH/Gateway: Unterschied zwischen den Versionen

Aus Foxwiki
K Textersetzung - „z. B. “ durch „beispielsweise “
 
(109 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
Ein '''SSH-Gateway''' soll einen problemlosen sicheren Zugriff auf entfernte Rechner ermöglichen
'''SSH-Gateway''' - vermittelt verschlüsselte Tunnelverbindungen zwischen SSH-Clients


== Beschreibung ==
== Beschreibung ==
* Supporter und Kunde bauten aktiv einen SSH-Tunnel zum SSH-Gateway auf
; Teilnehmer bauen aktiv einen Tunnel zum Gateway auf
** Gateway ist ein SSH-Server im Internet
* Keine Portweiterleitungen erforderlich
** SSH-Gateway vermittelt den Kontakt zum Support-Rechner
* Keine Namensauflösung der Teilnehmer erforderlich
* Keine Firewall-Anpassungen am Client erforderlich
; Gateway vermittelt den Kontakt
* Keine Namensauflösung des Clients erforderlich
* Gateway ist ein SSH-Server im Internet
; Trennung verschiedener Kunden/Dienstleiter
* Je Tunnel (Kombination aus Kunde/Dienstleiter) ein Zugang


=== Szenario ===
; Szenario
; Gateway
{| class="wikitable sortable"
* Hostname: ''gateway.foxtom.de''
! Hostname !! Username
* Port: ''2227''
|-
* Username: ''sshTnlKunde001''
| 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? -->


; Kundenrechner
==== Passwort vergeben ====
* Hostname: ''kunde001''
'''root@gateway#''' passwd sshTnlKunde001
* Username: ''support''
New password:
Retype new password:
passwd: password updated successfully


; Support-Rechner
==== Zugang testen ====
* Hostname: ''support''
'''user@support#''' ssh -p22 sshTnlKunde001@gateway.foxtom.de
* Username: ''user''
sshTnlKunde001@gateway's password:


== Konfiguration ==
=== SSH-Server ===
=== Gateway ===
; UNIX Sockets
; Nutzung von UNIX Sockets
Damit sich Kunden nicht mit dem System eines anderen Kunden verbinden können, werden hier UNIX Sockets verwandt.
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
* Diese besitzen im Gegensatz zu TCP-Ports eine Zugriffssteuerung
Zeile 31: Zeile 45:
* ein erneuter Aufbau des Tunnels ist ansonsten mit dem gleichen Socket-Namen nicht möglich
* ein erneuter Aufbau des Tunnels ist ansonsten mit dem gleichen Socket-Namen nicht möglich


'''/etc/ssh/sshd_config'''
''/etc/ssh/sshd_config''
  # Specifies whether to remove an existing Unix-domain socket file
  # Specifies whether to remove an existing Unix-domain socket file for local or remote port forwarding before creating a new one.
# for local or remote port forwarding before creating a new one.
StreamLocalBindUnlink yes
  '''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
 
# [[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]
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


==== Kunden-Zugang ====
Durch das @ im Namen der Unit-Datei können verschiedene Instanzen (also Tunnel) erstellt werden:
; Trennung verschiedener Kunden/Dienstleiter
'''root@kunde001#''' systemctl daemon-reload
Auf dem Gateway je Tunnel (Kombination aus Kunde/Dienstleiter) ein Zugang angelegen
  '''root@kunde001#''' systemctl start ssh-reverse@22.service
===== Tunnel-Benutzerkonto =====
'''root@kunde001#''' systemctl start ssh-reverse@443.service
  '''root@gateway#''' useradd --create-home --groups users --shell /bin/bash --comment "Tunnel-User Kunden001" sshTnlKunde001


<!-- Ist ein Loginshell notwendig?, Ist die Gruppe users erforderlich? -->
* 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.


===== Passwort vergeben =====
; Parameter für Instanzen
'''root@gateway#''' passwd sshTnlKunde001
* Drop-In-Files
New password:
Retype new password:
passwd: password updated successfully


===== Zugang testen =====
''/etc/systemd/system/ssh-reverse@22.service.d/tunnel.conf''
  '''user@support#''' ssh -p2227 sshTnlKunde001@gateway.foxtom.de
[Service]
  sshTnlKunde001@gateway's password:
# 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"


=== Kunden-Rechner ===
''/etc/systemd/system/ssh-reverse@443.service.d/tunnel.conf''
==== Tunnel-Benutzerkonto ====
[Service]
  '''root@kunde001#''' useradd -m -G users -s /bin/bash kunde001Tnl
# 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"


==== SSH-Key erzeugen ====
* Hier werden die auf dem Gateway verwendeten Sockets angepasst, statt den TCP-Ports werden verschiedene UNIX-Sockets verwendet.
'''root@kunde001#''' sudo -u support -i
* Außerdem wird ein anderer User auf dem Gateway verwendet.
'''support@kunde001$''' ssh-keygen -f /home/support/.ssh/gateway -t ecdsa


Passphrase nicht verwenden (Enter)
[[Kategorie:SSH]]


== Support-Rechner ==
=== Public-Key-Zugang ===
==== Public-Key übertragen ====
==== Public-Key übertragen ====
  '''support@kunde001$''' ssh-copy-id -p2227 -i /home/support/.ssh/gateway.foxtom.de.pub sshTnlKunde001@gateway.foxtom.de
  '''user@support#''' ssh-copy-id -p22 sshTnlKunde001@gateway.foxtom.de


==== Public-Key-Zugang testen ====
==== Public-Key-Zugang testen ====
  '''support@kunde001$''' ssh -i /home/support/.ssh/gateway.foxtom.de -p2227 sshTnlKunde001@gateway.foxtom.de
  '''user@support#''' ssh -p22 sshTnlKunde001@gateway.foxtom.de
'''sshTnlKunde001@gateway:~$''' exit


# [[ssh:fingerprint |Fingerprint vergleichen]]
== 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"
# Bestätigung durch Eingabe von "yes"
Fehlermeldung "PTY allocation request failed on channel 0" und die Verbindung wird abgebrochen. Das ist beabsichtigt.


==== Tunnelaufbau ====
'''"PTY allocation request failed on channel 0"'''
'''Beispiel'''
 
  '''support@debian01:~$''' ssh -NTC -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -o StrictHostKeyChecking=no -i ~/.ssh/gateway.foxtom.de -R 22277:localhost:2227 -p2227 sshTnlKunde001@gateway.foxtom.de
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


'''Manueller Aufbau'''
=== Tunnelaufbau ===
  '''support@kunde001$''' ssh -NTC -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -o StrictHostKeyChecking=no -i '''${SSHKEY}''' -R '''${GWSOCK}''':localhost:'''${LOCALPORT}''' '''${GWUSER}'''@'''${GWHOST}'''
; 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"
{| class="wikitable sortable"
Zeile 97: Zeile 176:
| '''-o StrictHostKeyChecking=no''' ||
| '''-o StrictHostKeyChecking=no''' ||
|-
|-
| '''-i ''' ||
| '''-i ${SSHKEY}''' ||absoluter Pfad zum SSH-Key, beispielsweise  ~/.ssh/gateway
|-
|-
| '''-R''' ||  wird ein reverse Tunnel erstellt, um vom Gateway aus auf den Kundenrechner zugreifen zu können
| '''-R ${GWSOCK}:localhost:${LOCALPORT}''' ||  Reverse Tunnel erstellt, um vom Gateway aus auf den Kundenrechner zugreifen zu können
|}
|}


Zeile 106: Zeile 185:
! Parameter !! Bedeutung
! Parameter !! Bedeutung
|-
|-
| '''${SSHKEY}''' || Der komplette Pfad zum SSH-Key, z.B. ~/.ssh/gateway
| '''${SSHKEY}''' || Der komplette Pfad zum SSH-Key, beispielsweise  ~/.ssh/gateway
|-
|-
| '''${GWSOCK}''' || Der Socket, welcher auf dem Gateway für den Tunnel verwendet wird
| '''${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
* Diesen muss man dort ansprechen, um sich mit dem Zielsystem zu verbinden
* Werden mehrere Tunnel zum Gateway aufgebaut (was recht wahrscheinlich ist), muss natürlich für jeden ein anderer Socket verwendet werden
* 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
* 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")
* 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, beispielsweise  "/home/ssh-kunde1/zielsystem3.socket" (nicht "~/zielsystem3.socket")
|-
|-
| '''${LOCALPORT}''' ||
| '''${LOCALPORT}''' ||
Zeile 123: Zeile 202:
|-
|-
| '''${GWHOST}''' ||
| '''${GWHOST}''' ||
* Der Hostname des Gateways, also z.B. "gateway".
* Der Hostname des Gateways, also beispielsweise  "gateway".
|}
|}


 
; Beispiel
=== Support-Rechner ===
$ 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
==== Public-Key-Zugang ====
===== Public-Key übertragen =====
'''user@support#''' ssh-copy-id -p'''2227''' sshTnlKunde001@gateway.foxtom.de
 
===== Public-Key-Zugang testen =====
'''user@support#''' ssh -p'''2227''' sshTnlKunde001@gateway.foxtom.de
'''sshTnlKunde001@gateway:~$''' exit
 
==== 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
 
==== Verbindung zum Zielrechner ====
'''user@support$''' ssh -p 10022 admin@localhost
 
"admin" ist ein Nutzer auf dem Zielsystem, über welchen der Support abgewickelt wird.
 
== Anwendungen ==


== Sicherheit ==
== Sicherheit ==
=== Public-Key-Zugang ===
; Angriffsmöglichkeiten
'''support@kunde001$''' ssh -i /home/support/.ssh/gateway.foxtom.de.pub -p2227 sshTnlKunde001@gateway.foxtom.de
Es wird ein Tunnel durch die Firewall gebohrt, welche das Netzwerk mit dem Zielsystem schützt
# Fingerprint vergleichen
# Bestätigung durch Eingabe von "yes"
 
'''"PTY allocation request failed on channel 0"'''
 
Fehlermeldung und die Verbindung wird abgebrochen, das ist beabsichtigt.


=== Allgemein ===
; Risiken
Es wird ein Tunnel durch die Firewall gebohrt, welche das Netzwerk mit dem Zielsystem schützt
Angreifer erlangt Zugriff auf das Gateway
* Das schafft definitiv neue Angriffsmöglichkeiten auf das Netzwerk
* könnte von dort alle zu managenden Zielsysteme erreichen
* Hier muss man, wie bei allen Fernwartungszugängen, zwischen dem Komfortgewinn und dem Sicherheitsverlust abwägen.
* 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 (beispielsweise  SSH- oder Webserver).


Ein Angreifer müsste Zugriff auf das Gateway erlangen und könnte von dort alle zu managenden Zielsysteme erreichen
; Gateway gut absichern
* 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).
Das ist gar nicht so anspruchsvoll
* weil es sich beim Gateway um ein Minimalsystem handelt
* welches vergleichsweise einfach upgedatet und sicher konfiguriert werden kann


Es ist also zum einen wichtig, das Gateway gut abzusichern
; Sicherheitsmaßnahmen auf dem Zielsystem
* Das ist gar nicht so anspruchsvoll, weil es sich beim Gateway um ein Minimalsystem handelt, welches vergleichsweise einfach upgedatet und sicher konfiguriert werden kann
* laufende Updates
* Zum anderen sollten auch auf dem Zielsystem die üblichen Sicherheitsmaßnahmen durchgeführt werden (laufende Updates, sichere Passwö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.
* kein root-logins zulassen
* starke Passwörter


Empfehlenswert ist eine zusätzliche Absicherung der durch die Supporter benutzten SSH-Schlüssel
; Bewertung
* 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.
Bei Einhaltung dieser Maßnahmen die Sicherheit im Vergleich zu anderen Varianten (proprietäre Fernwartungstools, Port-Forwarding durch Firewalls) als höher einzuschätzen


== Dokumentation ==
; Zusätzliche Absicherung
=== Siehe auch ===
* [[fail2ban]]
* Durch die Supporter benutzte SSH-Schlüssel auf Smartcard ablegen
* Die können beispielsweise , wie unter "[https://www.unitas-network.de/support/wiki/smartcards/ssh-login-mit-openpgp-card/ SSH-Login mit OpenPGP Card]" beschrieben, auf einer Smartcard abgelegt werden


== Links ==
== Siehe auch ==
=== Weblinks ===
# http://www.unitas-network.de/support/wiki/management/remote-management-mit-ssh-tunnel/


=== Einzelnachweise ===
{{Special:PrefixIndex/{{BASEPAGENAME}}/}}
<references />
=== Dokumentation ===
==== RFC ====
==== Man-Page ====
==== Info-Pages ====
=== Links ===
==== Projekt ====
==== Weblinks ====
# https://www.unitas-network.de/support/wiki/management/remote-management-mit-ssh-tunnel/


== Testfragen ==
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 1''
<div class="mw-collapsible-content">'''Antwort1'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 2''
<div class="mw-collapsible-content">'''Antwort2'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 3''
<div class="mw-collapsible-content">'''Antwort3'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 4''
<div class="mw-collapsible-content">'''Antwort4'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 5''
<div class="mw-collapsible-content">'''Antwort5'''</div>
</div>


[[Kategorie:Netzwerk:Sicherheit]]
[[Kategorie:SSH]]
[[Kategorie:ssh]]
[[Kategorie:Entwurf]]

Aktuelle Version vom 28. April 2025, 10:38 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, beispielsweise ~/.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, beispielsweise ~/.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, beispielsweise "/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 beispielsweise "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 (beispielsweise 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 beispielsweise , 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. https://www.unitas-network.de/support/wiki/management/remote-management-mit-ssh-tunnel/