Sicherer MySQL-Server
Verschlusssache
Freie Datenbank
Sicherer MySQL-Server
Bereits seit vielen Jahren behauptet sich die freie relationale Datenbank MySQL auf den Spitzenplätzen, wenn es um die Auswahl einer Datenbanklösung für Netzwerk- und Internet-Applikationen geht. Lamp-Systeme spielen hier eine wichtige Rolle. Von Haus aus bietet der MySQL-Server eine Fülle unterschiedlicher Sicherheitsfeatures, die dem geschulten Administrator eine Vielzahl von Schutzmöglichkeiten für die sensiblen Daten zur Verfügung stellen. Dieser Artikel zeigt, wie Sie die Funktionen richtig nutzen und so vor bösen Überraschungen geschützt sind.
Richtig installiert?
Sicherer MySQL-Server
Bereits bei der Installation des MySQL-Servers sollte man die Augen offen halten. Während die Windows-Setup-Routine den Server schnell und bequem installiert und anschließend die notwendigen Grundeinstellungen abfragt, muss der Linux-User mehr auf der Hut sein. Der Zugriff auf den MySQL-Server ist durch Login und Passwort geschützt. Unter Windows wird das Passwort für den MySQL-Superuser root bereits bei der Installation abgefragt. Bei einer Linux-Installation muss das Passwort selbst festgelegt werden. Ohne weitere Hervorhebung gibt das Setup-Skript zwar einen entsprechenden Hinweis aus. Wer diesen jedoch überliest, wiegt sich in falscher Sicherheit. Sowohl für Windows als auch für Linux lässt sich das root-Passwort wie folgt ändern:
mysql mysql ?u root
mysql> UPDATE user SET Password=PASS WORD('mein_pwd') WHERE user='root';
Damit das neue Passwort nicht im Klartext in der Datenbank gespeichert ist, wird die Funktion PASSWORD zur Verschlüsselung verwendet. Um die Änderungen für den Server zu aktivieren, wird zum Abschluss
mysql> flush privileges;
aufgerufen. Ein alternativer Weg zum Setzen des root-Passworts ist der Aufruf des Kommandos
mysqladmin -u root password "mein_pwd"
in einer Linux-Shell.
Das MySQL-Benutzerkonzept
Sicherer MySQL-Server
Ähnlich wie auf einem Linux-System besitzt der User root für den MySQL-Server uneingeschränkte Zugriffsrechte. Für die Entwicklung einer Web-Applikation, die Zugriff auf die Datenbank benötigt, sollten Sie deshalb weitere Benutzer einrichten, deren Berechtigungen auf einzelne Datenbanken oder Tabellen sowie den Zugriff von bestimmten IP-Adressen beschränkt sind.
MySQL bietet sogar die Möglichkeit, die Berechtigungen auf Spalten einzelner Tabellen zu beschränken. Für die Vergabe und den Entzug von Berechtigungen auf dem MySQL-Server sorgen die Befehle GRANT und REVOKE.
Das Einrichten und Verwalten der Benutzer erfolgt entweder über den MySQL-Client, der von der Konsole beziehungsweise Shell aus aufgerufen wird, oder alternativ über den MySQL-Administrator. Unerfahrenen Usern sei zum Einsatz des MySQL-Administrators geraten, da das grafische Frontend einen höheren Bedienkomfort aufweist.
Globale Berechtigungen
Sicherer MySQL-Server
Wenn Sie globale Berechtigungen sowie Rechte für einzelne Tabellenspalten über den MySQL-Administrator ändern wollen, so müssen unter Linux zuvor die entsprechenden Tabsheets über Tools, Options, File und Preferences aktiviert werden. Bei der Vergabe von Berechtigungen sollte man beachten, dass jeder User nur die Rechte im System eingeräumt bekommt, die er für die Ausführung seiner Aufgaben benötigt. So genügt es, wenn der in einer Web-Applikation verwendete Benutzerzugang zum MySQL-Server über select, insert und update verfügt.
Neben dem Einsatz der grant/revoke-Anweisungen sowie der des MySQL-Administrators besteht zusätzlich die Möglichkeit, die Berechtigungen direkt in den MySQL-Systemtabellen zu ändern.
Nach der Manipulation an diesen Daten werden die neuen Rechte per
mysql> flush privileges;
oder über das Kommando
mysqladmin reload
dem Server bekannt gemacht.
Systemsicherheit
Sicherer MySQL-Server
Neben den Benutzern des MySQL-Servers sollte man auf einem Linux-System auch die Berechtigungen im Auge behalten, mit denen der MySQL-Server-Prozess arbeitet und mit denen die Dateien im Filesystem abgelegt sind. Der MySQL-Server sollte niemals als Benutzer root laufen, sondern über ein eigenes Benutzerkonto verfügen, das keine Administrationsrechte besitzt. Der Eintrag
[mysqld] user=mysql
in der Datei
/etc/my.cnf
legt fest, dass der MySQL-Server als Benutzer mysql gestartet wird. Weiterhin empfiehlt sich ein Blick auf das MySQL-Datenverzeichnis. Hier legt MySQL den kompletten Inhalt aller Tabellen ab. Sämtliche Dateien sollten vor dem Zugriff von Unberechtigten geschützt sein, um so den Datendiebstahl zu verhindern. Der Befehl
ls ?l /var/lib/mysql
zeigt unter Linux sämtliche MySQL-Datenbanken mit den zugehörigen Dateirechten an.
Netzwerkplauderei
Sicherer MySQL-Server
Sowohl die Administration als auch der Zugriff auf die gespeicherten Daten eines MySQL-Servers können lokal oder über das Netzwerk erfolgen. Die Kommunikation zwischen Server und Client über das Netzwerk erfolgt standardmäßig über den TCP-Port 3306. Wer die Möglichkeit hat, den Datenverkehr zwischen Server und Client abzuhören, kann Daten ausspähen und Kenntnis über Logins und Datenstrukturen erlangen. Unter Linux kann man mittels
tcpdump ?l ?i eth0 ?w ? src or dst port 3306 | strings
selbst einmal testen, was der MySQL-Server bei einer Netzwerk-Verbindung alles preisgibt.
Netzwerk-Verbindung trennen
Sicherer MySQL-Server
Sind MySQL-Server und Web-Applikation auf dem gleichen Server installiert, so kann die Netzwerk-Verbindung des Servers komplett deaktiviert werden. Hierfür wird der MySQL-Server mit der zusätzlichen Option –skip-networking gestartet. Dazu wird unter Linux die Datei mysqld_safe editiert. Suchen Sie in dem File nach –skip-locking und fügen sie zusätzlich die Option –skip-networking ein. Mit dem nächsten Neustart steht die Netzwerk-Verbindung für den MySQL-Server nicht mehr zur Verfügung. Unter Linux kann die lokale Kommunikation mit dem Server dann nur noch über den Unix-Socket mysql.sock erfolgen. Auf einem System mit Windows NT, 2000, XP oder 2003 kann nach der Deaktivierung der Netzwerk-Verbindung mittels –skip-networking auf Named Pipes zurückgegriffen werden. Sowohl der Windows- als auch der Linux-Konsolen-Client verwenden beim Zugriff auf einen lokal installierten MySQL-Server als Standard die Named Pipe beziehungsweise den Unix-Socket.
Neben dem kompletten Abschalten der Netzwerk-Verbindungen bietet der MySQL-Server alternativ die Möglichkeit, den Zugriff aus dem Netzwerk auf bestimmte Rechner oder Subnetze zu beschränken. Für jeden Benutzer in der MySQL-Benutzerdatenbank muss daher angegeben werden, von welchen Rechnern aus er welche Berechtigungen besitzt. Bei der Administration der verschiedenen Hosts ist wiederum das MySQL-Administrator-Tool behilflich. Über das Kontextmenü zu einem Benutzer (rechte Maustaste über User drücken) lassen sich neue Rechner zu einem Benutzer hinzufügen. Als zusätzlichen Schutz empfiehlt sich der Einsatz einer Firewall, die sämtliche nicht erwünschten Verbindungen auf den Port des MySQL-Servers blockiert.
Sicher programmieren für MySQL
Sicherer MySQL-Server
Die Sicherheit des MySQL-Servers obliegt nicht nur dem Administrator allein. Jede einzelne Anwendung, die mit dem Server Daten austauscht, muss auf die Sicherheit und Korrektheit der übertragenen Informationen achten.
Um vor böswilligen Manipulationen bei Formulareingaben der Internet Applikation geschützt zu sein, sollte jede Eingabe vor der Übergabe an die Datenbank geprüft werden. In PHP sollte die Funktion mysql_escape_string() genutzt werden, um einen Eingabe-String für die Verarbeitung in MySQL korrekt zu maskieren. Sind MySQL-Server und die Anwendung auf einem Server installiert, so kann wie bereits zuvor beschrieben die Netzwerk-Verbindung des MySQL-Servers deaktiviert werden. Der PHP-Verbindungsbefehl über den Unix-Socket lautet dann:
$link = mysql_connect (':/var/lib/mysql/mysql.sock', 'webapp', 'geheim');
Sind Server und Anwendung auf unterschiedlichen Systemen im Einsatz, besteht die Möglichkeit, den Datenverkehr zwischen beiden Seiten in der aktuellen MySQL-Version über eine sichere SSL-Verbindung zu schützen. Über die PHP-Erweiterung mysqli, die unter PHP 5 zur Verfügung steht und derzeit noch als experimentell eingestuft ist, lässt sich eine sichere Verbindung aus der Anwendung heraus aufbauen.
MySQL und Shared Hosting
Sicherer MySQL-Server
Als Mieter eines Shared-Hosting-Pakets mit MySQL-Unterstützung haben Sie wesentlich weniger Sorgen, was die Datenbank-Security betrifft. Aus eigenem Interesse heraus sorgen die Provider dafür, dass hier die Zugriffsmöglichkeiten von vornherein stark eingeschränkt sind und die Sicherheitslevels sich auf einem hohen Niveau bewegen. Vielfach sind Zugriffe nur aus einem Skript heraus möglich, der Remote-Access ist komplett blockiert. Die Rechte des Mieters beschränken sich überwiegend auf eine oder mehrere MySQL-Datenbank-Tabellen.