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:
- 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. - 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).