Zum Inhalt springen

SSH/Gateway

Aus Foxwiki

Ein SSH-Gateway soll einen problemlosen sicheren Zugriff auf entfernte Rechner ermöglichen

Beschreibung

  • Supporter und Kunde bauten aktiv einen SSH-Tunnel zum SSH-Gateway auf
    • Gateway ist ein SSH-Server im Internet
    • SSH-Gateway vermittelt den Kontakt zum Support-Rechner
  • Keine Firewall-Anpassungen am Client erforderlich
  • Keine Namensauflösung des Clients erforderlich

Szenario

Gateway
  • Hostname: gateway.foxtom.de
  • Port: 2227
  • Username: sshTnlKunde001
Kundenrechner
  • Hostname: kunde001
  • Username: support
Support-Rechner
  • Hostname: support
  • Username: user

Konfiguration

Gateway

Nutzung von 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-Zugang

Trennung verschiedener Kunden/Dienstleiter

Auf dem Gateway je Tunnel (Kombination aus Kunde/Dienstleiter) ein Zugang angelegen

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 -p2227 sshTnlKunde001@gateway.foxtom.de
sshTnlKunde001@gateway's password:

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

Passphrase nicht verwenden (Enter)

Public-Key übertragen

support@kunde001$ ssh-copy-id -p2227 -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 -p2227 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.

Support-Rechner

Public-Key-Zugang

Public-Key übertragen
user@support# ssh-copy-id -p2227 sshTnlKunde001@gateway.foxtom.de
Public-Key-Zugang testen
user@support# ssh -p2227 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

Tunnelaufbau

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

Manueller Aufbau

support@kunde001$ ssh -NTC -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
-R wird ein 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 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 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".

Automatisierung

Systemd konfigurieren

Systemd-Service-Unit erstellen

/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.

Die Parameter für die Instanzen sollten über Drop-In-Files angepaßt werden:

/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.

Sicherheit

Public-Key-Zugang

support@kunde001$ ssh -i /home/support/.ssh/gateway.foxtom.de.pub -p2227 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.

Dokumentation

Siehe auch

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

Einzelnachweise


Testfragen

Testfrage 1

Antwort1

Testfrage 2

Antwort2

Testfrage 3

Antwort3

Testfrage 4

Antwort4

Testfrage 5

Antwort5