Datenbank-Server

ID #1122 MySQL für externen Zugriff konfigurieren

Problem:

Auf die MySQL-Datenbank soll nicht nur vom localhost per Script oder phpMyAdmin zugegriffen werden, sondern auch von extern. Z.B. weil man einen eigenen MySQL-Client nutzt, oder die Verbindung mit einem anderen Server haben will, etc.

Die Lösung ist zwei geteilt:
1.) Öffnen von MySQL für externen Zugriff.
2.) User-Berechtigungen so setzten, daß MySQL auch deren externe Logins annimmt.

Lösung:

1. Teil (Konfiguration von MySQL):

Es gibt inzwischen zwei Fälle. Beide werden in der <code>my.cnfcode> in der Sektion <code>[mysqld]code> konfiguriert.

a) Bei älteren MySQL-Versionen war es der Parameter <code>SkipNetworkingcode>. Wenn dieser aktiviert ist, lauscht MySQL lediglich an den localen Sockets. Also muß diese auskommentiert werden:

#SkipNetworking

b) Neuere Versionen bringen den Parameter <code>bind-addresscode> mit. Damit kann man eine IP angeben, an der gelauscht wird, bzw. den Parameter deaktivieren. Also eine der folgenden Einstellungen wählen:

bind-address 0.0.0.0       # deaktiviert
bind-address 127.0.0.1 # nur localhost
bind-address 192.168.0.100 # nur über die locale IP
# (sinnvoll innerhalb einer DMZ)

Sollte die my.cnf verändert worden sein, so muß auch der MySQL-Daemon davon in Kenntnis gesetzt werden:

/etc/init.d/mysql restart

Testen ob der Zugriff von Extern funktioniert:
In eine DOS-Box oder beliebig anderen externen Server folgendes eintippen:

telnet meine-domain.tld 3306

Sollte ein <code>Verbinden fehlgeschlagencode> kommen, so stimmt hier noch etwas nicht. (Z.B. Firewall, Router, etc.). Bei Erfolg kommt ein häßliches Zeichenwirrwarr. Einfach paarmal auf die Enter-Taste tippen und Ihr seit wieder drausen.

2. Teil (User-Berechtigung):

Nun müssen die User dafür frei geschaltet werden. Anwender von Confixx oder Plesk können dies einfach in der Admin-Oberfläche erledigen. Per Hand sieht es (anhand des Beispiel-DB-Users 'huschi') so aus:

#In der Shell/Putty:
mysql -uroot -p mysql
#root-Passwort eingeben
#nun sind wir im MySQL-Client, der nur noch SQL-Befehle versteht:
update user set host='%' where user='huschi';
update db set host='%' where user='huschi';
flush privileges;
exit;

Dies kann man natürlich auch per phpMyAdmin erledigen.
Wichtig zu wissen:
Die Tabelle <code>mysql.usercode> ist zuständig für die allgemeinen Benutzerrechte.
Und <code>mysql.dbcode> regelt den Zugriff auf spezielle Datenbanken.
Als weiterer Tip: nimmt niemals den User <code>rootcode> oder unter Plesk <code>admincode> für den externen Zugang!
Warum: a) Sie sind leicht bei BruteForce-Attacken zu erraten und b) wer diesen Zugang knackt hat gleich alle Rechte die man unter MySQL nur haben kann.

Fehlersuche:

An die Fehlersuche geht man einfach logisch ran:

  1. Lauscht <code>mysqldcode> auch extern am richtigen Port?
    Dazu nutzt man <code>netstatcode> auf dem Server und/oder <code>telnet MEINE.IP 3306code> von einem externen Computer.
  2. Kann sich der neu erstellte User einloggen?
    Testen auf dem Server mit <code>mysql -u USER -p DATENBANKcode>.
    Das Selbe von einem externen Rechner mit installiertem MySQL(-Client).
 

sozial Bookmarking
Bookmarken bei YIGG Bookmarken bei Mister-Wong Bookmarken bei Icio Bookmarken bei del.icio.us Bookmarken bei Technorati Bookmarken bei Furl Bookmarken bei Spurl Bookmarken bei Yahoo Bookmarken bei Google

vom 2006-08-11 13:19, zuletzt 2008-01-02 08:50     Artikel ausdrucken Artikel weiterempfehlen Als PDF-Datei anzeigen

Dieser Inhalt ist unter der Creative-Commons Lizenz lizensiert.

Probleme bitte im Server-Support-Forum diskutieren.

überflüssig 1 2 3 4 5 wertvoll  
Durchschnittliche Bewertung:   4.73 von 5 (26 Bewertungen)

Artikel kommentieren

Kommentar von amir (2006-08-11 12:56:44):
hallo huschi,
Genau wie du beschrieben hast, habe ich auch gemacht... funzt aber nicht!!!
host ist auf (%) geändert ...
OS: Suse9.3 + plesk 8
woran kann das liegen? (port?)

Kommentar von nh2 (2007-02-24 18:42:28):
Bei mir funktioniert es jetzt. Ich musste nicht nur "/etc/init.d/mysql reload" benutzen, sondern auch "/etc/init.d/mysql restart".

Kommentar von André (2009-01-13 12:54:06):
Noch eine FEHLERQUELLE:
Firewall Port Einstellungen überprüft?

Danke!

Kommentar von kaktus (2010-01-09 13:42:27):
Beim Strato VSERVER reicht es im Plesk in der Firewall Einstellung von Plesk die Optionen der MYSQL zu ändern.


Dann noch die Datenbankrechte für den User anpassen, von welchem Host er zugriff haben darf.

Kommentar von Andreas (2012-01-18 17:51:35):
genau was ich gesucht habe. Vielen Dank!

Kommentar von Jeff (2012-05-14 01:51:23):
Hier steckt ein wichtiger Fehler/Missverständnis im Artikel!

bind-address erlaubt die Angabe 0.0.0.0 und das deaktiviert den Server nicht etwa, wie es angegeben ist. Der Server bindet bei dieser Angabe an ALLE IP Adressen.

Aus der Mysql-Doku:
"If the address is 0.0.0.0, the server accepts TCP/IP connections on all server host IPv4 interfaces."

Kommentar von meXX (2012-11-29 11:17:39):
hi,

folgendes szeneario wir haben 2 Webserver reine Apache / PHP Server - und 1. Datenbankserver.

Wie verbinden wir am Sichersten dorthin , damit der port 3306 kein

Kommentar von meXx (2012-11-29 11:18:54):
hi,

da dürfte was abhanden gekommen sein , wie verbinden wir zu dem mysql server mittels der 2 server via php damit KEIN Portscanner sagt 3306 ist offen mittels bad handshake?

Kommentar von huschi (2012-11-29 13:16:46):
@meXx:
Entweder eigenes Netzwerkkabel für den DB-Server ziehen (sowieso empfehlenswert) oder die Firewall des DB-Servers entsprechend konfigurieren, dass sie nur Connections von den Webserver annimmt.
MySQL selbst hat keine Sicherheitsmechanismen dieser Art. Warum auch, es kann ja die Firewall.

huschi.