Self-Hosted Datenbanken

MySQL und MariaDB: Externen Datenbankbenutzer für den Remote-Zugriff einrichten

Nicht jede Anwendung läuft auf demselben Server wie die Datenbank. In diesem Beitrag erfahren Sie, wie Sie in MySQL und MariaDB einen Benutzer für externe Zugriffe einrichten, welche Konfigurationen dafür notwendig sind und wie Sie die Verbindung sicher absichern.

4 min Lesezeit
Grafik: MySQL & MariaDB: Remote-Zugriff sicher einrichten

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:

  1. Ein passender Benutzer mit korrektem Host-Eintrag.
  2. Die Vergabe der erforderlichen Datenbankrechte.
  3. 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.