SSH-Tunnel zu einer Datenbank erstellen
Zugriff von Extern nicht möglich
Bei Mittwald ist der Zugriff auf Datenbanken von Außen aus Sicherheitsgründen bewusst gesperrt. Der Hauptnutzer kann nur vom eigenen Webserver, nicht aber von außerhalb des Mittwald Netzwerks, auf einen Datenbank-Server zugreifen.
Aber dafür gibt es doch die zusätzlichen Benutzer?
Jein. Die zusätzlichen Benutzer erlauben in erster Linie den Zugriff auf einen Datenbank-Server von außerhalb des Mittwald Netzwerks, jedoch unverschlüsselt! Das liegt in der Natur des Ports 3306 über den das nicht ohne weitere Maßnahmen möglich ist. Sicherlich kann man auch seitens MySQL eine TLS-Verschlüsselung aktivieren, jedoch wirkt sich der Overhead meist sehr negativ auf die Performance aus und bremst alle Datenbank-Abfragen unnötig aus. Man kann sagen: Je mehr Datenbank-Verbindungen deine Anwendung öffnet, desto langsamer wird sie. Denn die Verschlüsselung muss für jede Verbindung vorher ausgehandelt werden.
Eine verschlüsselte Verbindung von außen
Hier kommt der SSH-Tunnel ins Spiel. Er erlaubt dem Hauptnutzer nicht nur mehrere Datenbank-Verbindungen von extern, sondern auch eine verschlüsselte Übertragung über den SSH-Port 22. Diese wirkt sich kaum auf die Datenbank-Performance aus. Das wird dadurch erreicht, dass der SSH-Tunnel einmalig zu deinem Webserver aufgebaut wird und bestehen bleibt. Ab dem Zeitpunkt befindest du dich, vereinfacht gesagt, bereits innerhalb unseres Rechenzentrums. Der Datenbank-Server selbst merkt nicht, dass die Anfragen über einen SSH-Tunnel geleitet werden und verrichtet seine Arbeit wie gehabt.
Warum ist bei Mittwald der Port 3306 von außen erreichbar?
In unserer Rechenzentrums-Infrastruktur müssen bestimmte Standard-Ports geöffnet sein, damit Anfragen aus dem Internet zum jeweiligen Serversystem gelangen können. Das gilt bei uns auch für den Datenbank-Port 3306. Aber keine Sorge, dieser wird nur dann benötigt, wenn man mit einem zusätzlichen Datenbank-Benutzer von extern auf eine Datenbank zugreifen möchte − der Hauptbenutzer hat von extern keinen Zugriff!
Voraussetzung: OpenSSH-Client
Damit du überhaupt in den Genuss einer solchen verschlüsselten Verbindung kommen kannst, benötigst du lokal auf deinem Entwicklungsrechner / -server den OpenSSH-Client. Diesen gibt es für alle gängigen Betriebssysteme kostenfrei zum Download.
Unter Linux-Systemen (und ab Windows 10) ist der SSH-Client in den allermeisten Fällen bereits vorinstalliert. Starte dazu das Terminal (Linux/Mac OS) oder „cmd.exe“ / PowerShell unter Windows. Des Weiteren solltest du nun deine SSH-Zugangsdaten zu deinem Projekt bereithalten.
Wenn du über eine GUI auf deine Datenbank zugreifen möchtest, kannst du das mit SSH und Sequel Ace tun. In unserem Beitrag zu Sequel Ace erklären wir dir, wie es funktioniert.
Aufbau eines SSH-Tunnels
Und nun kommt etwas „Konsolen-Magie“. Aber keine Panik, wir schauen uns zusammen an, wie du die Verbindung deinen Bedürfnissen anpasst. Hier ein Beispiel, wie man unter Linux einen SSH-Tunnel zum Webserver aufbaut (unter z. B. Windows 10 funktioniert das übrigens ganz genau so):
ssh -N -L 9000:dbXXXX.mydbserver.com:3306 p100000@p100000.webspaceconfig.de
Solltest du in der Vergangenheit von deinem lokalen Rechner noch keine SSH-Verbindung zu deinem Projekt aufgebaut haben, wird dir SSH u. a. den Fingerprint des Webservers anzeigen und dich fragen, ob du die Verbindung aufbauen möchtest. Das musst du mit der Eingabe „yes“ und der Enter-Taste bestätigen. Anschließend musst du dein SSH-Kennwort für den SSH-Benutzer eingeben (nicht für die Datenbank):
The authenticity of host 'p100000.webspaceconfig.de (XXX.XXX.XXX.XXX)' can't be established.
ED25519 key fingerprint is XXXXXXXXXXXXXXXXXXXXXXXXXXXX
...
...
Are you sure you want to continue connecting (yes/no)? yes
p100000@p100000.webspaceconfig.de's password:
Nachdem du mit „Enter“ bestätigt hast, ist dein SSH-Tunnel bereits aufgebaut. Wundere dich nicht, wenn du nun einen leeren schwarzen Bildschirm siehst, der scheinbar auf eine Eingabe von dir wartet. SSH wird dir keinerlei Rückmeldung geben, wenn die Verbindung erfolgreich hergestellt wurde. Das passiert nur im Fehlerfall (z. B. erneute Kennwort-Eingabe). Beenden kannst du den Tunnel, in dem du „STRG + C“ drückst.
Aber halt: Was bedeuten die Angaben im SSH-Kommando und wie baue ich jetzt die Datenbank-Verbindung auf? Das erkläre ich dir jetzt:
Melde dich zum Newsletter an!
Kommende Releases, neue Features und Tipps rund um dein Hosting − wir bringen dir das Wichtigste in dein Postfach. Abonniere unseren Newsletter und bleib auf dem Laufenden.
Erklärung der Flags
Im Gegensatz zu einer einfachen SSH-Verbindung, wie z. B.
ssh p100000@p100000.webspaceconfig.de
habe ich hier noch die Flags -N und -L, sowie Host- und Port-Angaben hinzugefügt. Damit teile ich SSH mit, dass alles über diese Verbindung weitergeleitet werden soll.
Das -N-Flag sagt aus, dass ich keine Kommandos an den Webserver selbst senden möchte. Schließlich geht es mir ja u. a. um das Tunneln der Verbindung zum Datenbank-Server. Wichtig sind die Angaben hinter dem -L-Flag, die in dieser Form angegeben sind:
9000:dbXXXX.mydbserver.com:3306
Erklärung:
Lokaler Port Doppelpunkt Ziel-Datenbankserver Doppelpunkt Ziel-Port
Als lokalen Port, über den ich mich verbinden möchte, habe ich 9000 gewählt. Im Grunde ist jeder Port möglich, der nicht aktiv von einem lokalen Dienst überwacht wird, so z. B. auch 3306, wenn kein lokaler Datenbank-Server auf diesem Port lauscht. Der Ziel-Datenbank-Server entspricht dem, was ich im Kundencenter wiederfinde. Der Ziel-Port 3306 ist der Standard-Port von MySQL.
Dem geschulten Auge fällt auf, dass ich noch keine Ziel-Datenbank angegeben habe. Das ist auch richtig so, denn dazu komme ich jetzt.
Tipp: Füge an dieses Beispiel das Flag -f an, um die SSH-Verbindung in den Hintergrund zu schicken. Beispiel:
ssh -f -N -L 9000:dbXXXX.mydbserver.com:3306 p100000@p100000.webspaceconfig.de
Aufbau einer MySQL-Verbindung über den SSH-Tunnel
Da der SSH-Tunnel zum Datenbank-Server nun steht, kann ich die Verbindung zu einer Datenbank herstellen. Auf der Konsole nutze ich dafür das mysql-Kommando. Aber auch jede andere lokale Anwendung, die in der Lage ist eine MySQL-Verbindung herzustellen, kann hierfür genutzt werden, wie z. B. eine lokale Entwicklungsumgebung eines CMS oder phpMyAdmin.
mysql -P'9000' -h'127.0.0.1' -u'p100000' -p'DeinGeheimesKennwort' usr_p100000_1
Zu beachten ist hierbei der Port 9000, der über das Flag -P angegeben ist - (nicht zu verwechseln mit dem kleingeschriebenem -p für das Datenbank-Passwort) und der Host (-h), der „localhost“ bzw. dem eigenen Rechner entspricht: 127.0.0.1. Ganz am Ende wird noch der Name der Datenbank angefügt, hier ist das usr_p100000_1.
Tipp: Du solltest dein Datenbank-Kennwort nicht direkt auf der Konsole mit angeben, sondern stattdessen das kleine -p ohne weitere Angabe stehen lassen. Du wirst dann zur Eingabe des Kennworts aufgefordert. Ein Beispiel:
mysql -P'9000' -h'127.0.0.1' -u'p100000' -p'' usr_p100000_1
Und schon wird die lokale MySQL-Verbindung über den Port 9000 durch die verschlüsselte SSH-Verbindung geleitet und gelangt zu dem gewünschten Datenbankserver im Mittwald Rechenzentrum. Es ist im Übrigen egal, ob du für die Datenbank-Verbindung den Hauptbenutzer oder einen zusätzlichen Datenbank-Benutzer verwendest, solange du bei der Verbindung Port und Host entsprechend dem Beispiel angibst.
Mehrere Tunnel zu verschiedenen Datenbank-Servern
Natürlich kannst du auf deinem Entwicklungsrechner auch mehrere SSH-Tunnel zu verschiedenen Datenbank-Servern aufbauen. Dabei solltest du nur darauf achten, dass jedem SSH-Tunnel ein eigener lokaler Port zugewiesen wird (z. B. 9001, 1337, 12345...). Befinden sich gleich mehrere deiner Datenbanken auf dem gleichen Datenbank-Server, ist ein einziger SSH-Tunnel völlig ausreichend. Du kannst dir also merken: ein SSH-Tunnel je Datenbank-Server.
Der umgekehrte Weg − ein SSH-Tunnel von Mittwald nach extern
Wer sich jetzt denkt „Super, dann kann ich ja jetzt auch von meinem Mittwald Webserver einen SSH-Tunnel zu meinen externen Datenbanken aufbauen!“, der wird schnell auf den Boden der Tatsachen zurückgeholt. Denn hierüber würden wir Proxy-Lösungen ermöglichen, welche die Sicherheit und Reputation unserer Server / IP-Adressen gefährden könnten. Daher ist das nicht möglich.
Wenn du interessante Webhosting-Lösungen betreiben möchtest, die einen solchen ausgehenden SSH-Tunnel voraussetzen, melde dich gerne bei unserem Kundenservice!
Nice to know!
Gut möglich, dass du bei einem Anruf in unserem Kundenservice Andrej am Hörer hast. Gemeinsam mit seinen Kolleginnen und Kollegen aus dem Third-Level-Support kümmert er sich um technisch herausfordernde Probleme unserer Kunden. Eins haben sie alle gemeinsam: Wo das Know-How vieler aufhört, fangen sie erst an.