MySQL absichern

Autor: Christian Ahmer, erstellt: 26.08.2010, zuletzt geändert: 16.09.2014
Kategorien: Mysql, Linux

Es gibt ein paar Dinge, die man als Betreiber einer Website in Verbindung mit einer Datenbank wie MySQL beachten sollte.

Das wichtigste ist: Die Datenbankverbindung nicht mit dem root User herstellen.
Selbst wenn man noch so bedacht darauf ist, entsprechend zu validieren und zu escapen, um SQL Injection abzuwehren, sollte man trotz alledem vor allem die Datenbankverbindung nicht über den Root User initiieren.
Denn sollte es doch einmal ein fieser Hacker schaffen, die Site zu knacken und sich Zugriff zur Datenbank zu verschaffen, dann kann er über die Datenbank standardmäßig als root Benutzer alles tun - das kann so weit gehen, dass er sogar beliebige Dateien in Systemordnern des verändern kann, geschützte Daten stehlen kann und auch den Server komplett löschen kann. Ein einmal so gehacktes System ist nicht mehr zu gebrauchen und muss neu aufgesetzt werden.

Immer wieder lese ich im Internet von Leuten, denen so etwas tatsächlich schon passiert ist. Das Thema ist aktueller als man denkt.
Viele Hobbyprogrammierer meinen heute, es sei so einfach sich selbst eine Homepage zu basteln, am besten noch mit einem kleinen CMS dabei - aber an richtige Sicherheit denken sehr viele leider eben nicht.
Sicherheit fängt aber schon bei der Systemkonfiguration an. Und genau da kann man viel rausholen, wenn man Zugriff nur als unprivilegierter zulässt und nicht aus bequemlichkeit alles über den root User laufen lässt.

Lange Rede, so geht's:

1) In der Konsole als root in mysql einloggen (statt pw bitte das richtige Passwort für den root User eingeben):

 

mysql -uroot -ppw

 

2) Neuen Benutzer in mysql anlegen und benötigte Rechte zu allen Tabellen der Datenbank 'Datenbankname' geben.

 

CREATE USER 'benutzer'@'localhost' IDENTIFIED BY 'einpw';

GRANT SELECT ,
INSERT ,
UPDATE ,
DELETE ,
INDEX ,ALTER ON Datenbankname.* TO 'benutzer'@'localhost'
IDENTIFIED BY 'einpw'
WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0
MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

 

Das wichtige hierbei ist, dem User nur eben gerade so viel Berechtigungen zu geben, wie er max. brauchen wird. Soll er keine Datenbanken droppen oder erstellen dürfen, so bekommt er eben auch diese Rechte nicht via GRANT erlaubt.
Und vor allem sollte der User die mysql Datenbank nicht sehen dürfen. Generell sollte der User kein Zugriff zu Datenbanken bekommen, die ihn nichts angehen.

Wichtiges zu PhpMyAdmin:
MySQL kann man bequem via PhpMyAdmin verwalten, das ist ein sehr gutes, wenn nicht sogar das beste Verwaltungstool für diese Datenbank. Das sollte man aber bitte nur auf dem Entwicklersystem tun und nicht auf dem Live Server.
Auf Live Servern empfiehlt es sich, mysql nur via localhost anzusprechen und keinen Remotezugriff auf die DB zu erlauben um einfach Risiken zu minimieren.

In der Konfiguration von mysql kann man einstellen, dass der Port 3306, welcher standardmäßig nach außen offen ist, nur via localhost erreichbar ist.
Dazu schreibt man (je nach Betriebssystem) in der /etc/mysql/my.cnf:

 

bind-address = 127.0.0.1

 

Nach einem Neustart der Datenbank sollte auf der öffentlichen IP des Servers der Port 3306 nicht mehr geöffnet sein.

Überprüfen kann man das z.B. mit dem Portscanner Tool nmap:

 

nmap 192.168.0.10 (bitte ersetzen durch jeweilige IP)

 

Ist der Port offen, erscheint etwa so etwas in der Ausgabe:

 

PORT     STATE SERVICE
80/tcp   open  http
443/tcp  open  https
3306/tcp open  mysql

 

Ist er geschlossen, würde das so aussehen:

 

PORT     STATE SERVICE
80/tcp   open  http
443/tcp  open  https

 

Wenn man diese Punkte beachtet, dann sollte der Server zumindest hinsichtlich der Datenbank weniger Gefahr laufen, gekapert zu werden.

Datenbankwartung:
Die weitere Wartung der Datenbanken sollte idealerweise abgesichert funktionieren. Da gibt es mehrere Möglichkeiten:
Die besten zwei will ich kurz nennen:

1) PhpMyAdmin via https:// Verbindung (wenn es unbedingt PhpMyAdmin auf dem Live Server sein muss)

2) Verbindung via SSH Sitzung. Daten Im / Export direkt auf der Kommandozeile via mysql oder mysqldump.
Diese Methode ist zwar nicht ganz so luxuriös, ist aber Methode 1 vorzuziehen, da man hier auch mit sehr großen Datenbanken arbeiten kann, ohne dass man Angst haben muss, dass mitten im Import PhpMyAdmin abstürzt, weil eine übergroße Datenbank verwendet wurde, welche sich nicht via PHP vollständig hochladen lässt.