Datenbanken sicher von anderen Servern oder Anwendungen erreichen
MySQL und MariaDB gehören zu den am häufigsten eingesetzten Datenbanksystemen im Linux-Umfeld. In vielen Fällen greifen Anwendungen lokal auf die Datenbank zu. Es gibt jedoch zahlreiche Szenarien, in denen ein externer Zugriff erforderlich ist.
Beispiele hierfür sind:
- Webserver und Datenbankserver laufen auf unterschiedlichen Systemen.
- Mehrere Anwendungen greifen zentral auf dieselbe Datenbank zu.
- Entwickler benötigen direkten Zugriff auf Entwicklungs- oder Testdatenbanken.
- Monitoring- oder Backup-Systeme sollen Datenbankabfragen durchführen.
- Anwendungen in Docker-Containern oder virtuellen Maschinen greifen auf einen separaten Datenbankserver zu.
Standardmäßig sind MySQL und MariaDB aus Sicherheitsgründen so konfiguriert, dass sie ausschließlich lokale Verbindungen akzeptieren. In diesem Beitrag zeigen wir Schritt für Schritt, wie Sie einen sicheren externen Datenbankzugriff einrichten.
Voraussetzungen
Für die Einrichtung benötigen Sie:
- Einen Linux-Server mit MySQL oder MariaDB
- Root-Rechte oder einen administrativen Datenbankbenutzer
- Zugriff auf die Firewall des Servers
- Die IP-Adresse des entfernten Systems
Die folgenden Beispiele funktionieren sowohl mit MySQL als auch mit MariaDB.
Aktuelle Benutzer prüfen
Melden Sie sich zunächst an der Datenbank an:
sudo mysql
oder
mysql -u root -p
Anschließend können Sie die vorhandenen Benutzer anzeigen:
SELECT User, Host FROM mysql.user;
Eine typische Ausgabe könnte so aussehen:
+-------------+-----------+ | User | Host | +-------------+-----------+ | root | localhost | | wordpress | localhost | | backup | localhost | +-------------+-----------+
Hier erkennt man, dass alle Benutzer lediglich lokale Verbindungen akzeptieren.
Neuen Benutzer anlegen
Zugriff von einer bestimmten IP-Adresse
Die sicherste Variante besteht darin, den Zugriff auf eine einzelne IP-Adresse zu beschränken.
Beispiel:
CREATE USER 'webapp'@'192.168.10.25' IDENTIFIED BY 'SehrSicheresPasswort!';
Der Benutzer darf sich nun ausschließlich von der IP-Adresse 192.168.10.25 anmelden.
Zugriff für ein komplettes Netzwerk
Soll ein Benutzer von mehreren Systemen innerhalb eines Netzes zugreifen dürfen, kann ein Platzhalter verwendet werden:
CREATE USER 'webapp'@'192.168.10.%' IDENTIFIED BY 'SehrSicheresPasswort!';
Damit sind Verbindungen aus dem Netzwerk 192.168.10.0/24 möglich.
Zugriff von beliebigen Systemen
Technisch ist auch dies möglich:
CREATE USER 'webapp'@'%' IDENTIFIED BY 'SehrSicheresPasswort!';
Der Platzhalter "%" erlaubt Verbindungen von jeder IP-Adresse.
Für produktive Systeme ist diese Variante jedoch nicht empfehlenswert.
Datenbankrechte vergeben
Nach dem Anlegen des Benutzers besitzt dieser zunächst keinerlei Rechte.
Vollzugriff auf eine Datenbank
GRANT ALL PRIVILEGES ON beispieldb.* TO 'webapp'@'192.168.10.25';
Nur Leserechte vergeben
Für Reporting- oder Auswertungssysteme reichen häufig Leserechte aus:
GRANT SELECT ON beispieldb.* TO 'webapp'@'192.168.10.25';
Individuelle Rechte vergeben
Beispielsweise:
GRANT SELECT, INSERT, UPDATE, DELETE ON beispieldb.* TO 'webapp'@'192.168.10.25';
Rechte übernehmen
Bei älteren Versionen empfiehlt sich anschließend:
FLUSH PRIVILEGES;
Datenbankserver für externe Verbindungen öffnen
Selbst wenn der Benutzer korrekt eingerichtet wurde, blockieren viele Installationen externe Verbindungen weiterhin.
Der Grund liegt in der Konfiguration des Datenbankservers.
Aktuelle Einstellung prüfen
Bei MariaDB:
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
Bei MySQL:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Suchen Sie nach:
bind-address = 127.0.0.1
Diese Einstellung erlaubt ausschließlich lokale Verbindungen.
Externe Verbindungen erlauben
Ändern Sie den Eintrag auf:
bind-address = 0.0.0.0
Dadurch lauscht der Datenbankserver auf allen Netzwerkinterfaces.
Alternativ kann auch eine konkrete Server-IP angegeben werden:
bind-address = 10.0.0.5
Dies ist oft die sicherere Variante.
Datenbankserver neu starten
MariaDB:
sudo systemctl restart mariadb
MySQL:
sudo systemctl restart mysql
Prüfen Sie anschließend den Status:
sudo systemctl status mariadb
oder
sudo systemctl status mysql
Firewall konfigurieren
In vielen Fällen blockiert die Firewall weiterhin den Datenbankport.
Standardmäßig verwendet MySQL und MariaDB Port 3306.
UFW
Zugriff von einer bestimmten IP erlauben:
sudo ufw allow from 192.168.10.25 to any port 3306 proto tcp
Status prüfen:
sudo ufw status
Firewalld
sudo firewall-cmd \ --permanent \ --add-rich-rule='rule family="ipv4" source address="192.168.10.25" port protocol="tcp" port="3306" accept'
Danach:
sudo firewall-cmd --reload
Verbindung testen
Von einem externen Rechner:
mysql -u webapp -p -h 10.0.0.5
oder
mariadb -u webapp -p -h 10.0.0.5
Nach Eingabe des Kennworts sollte die Anmeldung erfolgreich sein.
Typische Fehlermeldungen
Access denied for user
Beispiel:
Access denied for user 'webapp'@'192.168.10.25'
Mögliche Ursachen:
- Benutzer existiert nicht
- Falsches Passwort
- Falscher Host-Eintrag
- Fehlende Berechtigungen
Connection refused
Beispiel:
ERROR 2003 (HY000) Can't connect to MySQL server
Mögliche Ursachen:
- Datenbankdienst läuft nicht
- bind-address falsch gesetzt
- Port wird nicht überwacht
Prüfung:
ss -tulpn | grep 3306
Timeout
Mögliche Ursachen:
- Firewall blockiert
- Routingproblem
- VPN-Verbindung fehlerhaft
Sicherheitsempfehlungen
Der Datenbankport sollte niemals unnötig ins Internet geöffnet werden.
Empfehlungen für produktive Systeme:
- Zugriff nur für bekannte IP-Adressen erlauben
- Keine Verwendung von "%" als Host
- Starke Passwörter einsetzen
- Firewall-Regeln einschränken
- Regelmäßige Updates durchführen
- Datenbankzugriffe protokollieren
- VPN-Verbindungen bevorzugen
Alternative: Zugriff über SSH-Tunnel
In vielen Fällen ist ein SSH-Tunnel die sicherste Lösung.
Verbindung aufbauen:
ssh -L 3306:localhost:3306 user@server
Danach kann lokal gearbeitet werden:
mysql -u webapp -p
Der Datenbankport muss dabei nicht öffentlich erreichbar sein.
Der externe Zugriff auf MySQL oder MariaDB lässt sich mit wenigen Schritten einrichten. Entscheidend sind dabei drei Punkte:
- Ein passender Benutzer mit korrektem Host-Eintrag.
- Die Vergabe der erforderlichen Datenbankrechte.
- Die Freigabe des Datenbankservers und der Firewall.
Für produktive Umgebungen sollte der Zugriff stets auf bekannte IP-Adressen beschränkt und möglichst über VPN oder SSH-Tunnel abgesichert werden. So profitieren Sie von einer flexiblen Datenbankanbindung, ohne unnötige Sicherheitsrisiken einzugehen.