Immer wenn von Anwendungssicherheit die Rede ist, denken die Leute daran, Anwendungen gegen einige der häufigsten Angriffe wie Injektion, fehlerhafte Authentifizierung, Offenlegung sensibler Daten und dergleichen zu schützen. Obwohl diese Angriffe weit verbreitet sind, reicht es jedoch nicht aus, zu wissen, wie Sie Ihre Anwendung allein vor ihnen schützen können – insbesondere, wenn Sie MySQL ausführen. Heute werden wir uns eine andere Seite der Sicherheit ansehen – wir werden untersuchen, wie man MySQL richtig sichert.
Da die MySQL-Sicherheit eine ziemlich große Sache ist, behandeln Sie diesen Beitrag als Beginn einer Reihe von Beiträgen zu MySQL-Sicherheitsmaßnahmen. Wir werden nicht alles abdecken, aber dieser Beitrag sollte die Grundlage für einige der Sicherheitsmaßnahmen von MySQL bilden.
Warum müssen Sie MySQL sichern?
Zunächst einmal müssen wir die Frage beantworten, warum wir MySQL sichern wollen. Schließlich sollten wir sicher sein, wenn wir unsere Anwendung gegen die am weitesten verbreiteten Bedrohungen absichern, oder? Ja und nein.
Sehen Sie, wenn Sie Ihre Anwendung gegen bestimmte Angriffe sichern, stellen Sie sicher, dass die Angreifer es schwerer haben, die Verteidigung Ihrer Anwendung zu durchdringen - um Ihre Datenbank jedoch zu schützen, wird sie vor solchen Angriffen geschützt nicht ausreichend sein. Das Sichern Ihrer Datenbank könnte der letzte Strohhalm sein, der Ihre Anwendung (und Ihre Datenbank!) vor der Zerstörung bewahren könnte.
Wie sichere ich MySQL?
Nun zur brennenden Frage. Wie sichert man eigentlich MySQL?
Wenn Sie über die Sicherheit Ihrer MySQL-Instanz(en) nachdenken, sollten Sie eine breite Palette möglicher Optionen in Betracht ziehen. Glücklicherweise sind einige dieser Optionen nicht einmal auf MySQL beschränkt, was bedeutet, dass sie auch in anderen Szenarien anwendbar sind! Beginnen wir mit den allgemeinen Dingen.
MySQL-Sicherheit - Allgemein
Beachten Sie beim Sichern von MySQL, dass es sicherheitsbasierte Zugriffskontrolllisten (ACLs) für Operationen verwendet, die von Benutzern ausgeführt werden (Zugriffskontrolllisten sind eine Liste von Berechtigungen, die einem Objekt zugeordnet sind). So kümmern Sie sich um einige der grundlegendsten Sicherheitsprobleme:
- Sichern Sie das anfängliche MySQL-Konto – das ist sehr offensichtlich, aber Sie sollten sicherstellen, dass das Root-Konto ein Passwort hat. Das Root-Konto kann ein Passwort haben oder auch nicht, wenn MySQL zum ersten Mal installiert wird - Sie können das Passwort herausfinden, indem Sie das Fehlerprotokoll überprüfen, und es dann in ein stärkeres ändern, wenn Sie möchten. Alle anderen Konten sollten ebenfalls Passwörter haben.
- Speichern Sie niemals Passwörter in MySQL-Datenbanken im Klartext - verwenden Sie eine Einweg-Hashing-Funktion wie BCrypt.
- Gewähren Sie keinem Benutzer Zugriff auf die Benutzertabelle in der MySQL-Datenbank (der Root-Benutzer ist eine Ausnahme).
Machen Sie sich außerdem mit der Zugriffskontrolle und Kontoverwaltung in MySQL vertraut. Dieses Thema verdient ein ganzes Buch für sich, aber die grundlegenden Dinge, die Sie wissen sollten, umfassen:
- Zugriffskontrolle in MySQL;
- Erstellen, Ändern und Entfernen von Benutzern;
- Erteilen und Widerrufen von Privilegien für und von Benutzern;
- Wissen, wie man überprüft, welche Privilegien zugewiesen sind;
- Welche Kontokategorien sind;
- Was reservierte Konten sind;
- Was Rollen sind;
- So funktioniert die Passwortverwaltung;
- So funktioniert die Kontosperrung;
- Ein Blick auf die von MySQL angebotenen Sicherheits-Plugins;
- Wissen, wie man MySQL-Backups sichert.
Was die MySQL-Sicherheit betrifft, sollten auch Backups abgedeckt werden.
Jetzt werden wir uns jede dieser Optionen genauer ansehen.
Zugriffskontrolle in MySQL
- Wie bereits oben erwähnt, geben Sie keinem Konto außer dem root-Konto Zugriff auf die Benutzertabelle in der mysql-Datenbank;
- Stellen Sie sicher, dass alle vorhandenen MySQL-Konten nur die Berechtigungen verwenden, die sie zum Ausführen ihrer Aktionen unbedingt benötigen.
Erstellen, Ändern und Entfernen von Benutzern in MySQL
In MySQL können Benutzer erstellt werden, indem die Abfrage CREATE USER ausgeführt wird:
CREATE USER ‘demouser’@’localhost’ IDENTIFIED BY ‘password’;
Benutzer können durch Ausführen der ALTER USER-Abfrage geändert werden – die Abfrage ermöglicht Ihnen viele verschiedene Dinge, einschließlich Sperren und Entsperren von Konten, Anforderung einer Verbindung des Kontos über SSL, Einrichtung der maximalen Anzahl von Verbindungen pro Stunde, Verwerfen alter Passwörter usw. Hier ist eine Beispielabfrage, die Ihr eigenes Passwort ändern kann:
ALTER USER USER() IDENTIFIED BY ‘password’;
Benutzer können entfernt werden, indem Sie die DROP USER-Abfrage ausführen:
DROP USER ‘demouser’@’localhost’;
Gewähren und Widerrufen von Berechtigungen für und von Benutzern in MySQL
Die GRANT-Anweisung muss entweder Berechtigungen oder Rollen erteilen. Die ON-Anweisung kann Ihnen sagen, ob Privilegien oder Rollen gewährt werden. Die folgende Abfrage gewährt Berechtigungen:
GRANT ALL ON demo_db.* TO ‘demouser’@’localhost’;
Die folgende Abfrage gewährt Rollen:
GRANT ‘demo_role’ TO ‘demouser’@’localhost’;
GRANT sollte mit Query OK antworten, 0 Zeilen betroffen.
Um Benutzern bestimmte Berechtigungen zu entziehen, verwenden Sie die REVOKE-Anweisung (der Hostnamen-Teil des Kontonamens ist standardmäßig „%“):
REVOKE SELECT ON *.* FROM ‘demouser’@’localhost’;
Um alle Privilegien zu widerrufen, kann REVOKE ALL verwendet werden:
REVOKE ALL PRIVILEGES ON *.* FROM ‘demouser’@’localhost’;
Vielleicht möchten Sie ein FLUSH PRIVILEGES erteilen; -Anweisung, nachdem Sie die obigen Schritte ausgeführt haben.
Überprüfen, welche Berechtigungen in MySQL zugewiesen sind
- Um zu überprüfen, welche Privilegien zugewiesen sind, erteilen Sie SHOW GRANTS; Aussage.
- Für jede ausgegebene Anfrage bestimmt der Server den Vorgang, den Sie ausführen möchten, und prüft dann, ob Ihre Berechtigungen ausreichen, um den betreffenden Vorgang auszuführen.
- Der Server verwendet die user- und db-Tabellen in der mysql-Datenbank, um die Zugriffskontrolle sicherzustellen.
- Die Tabellen user und global_grants gewähren globale Privilegien.
Der Rest der Optionen wird in kommenden Beiträgen behandelt.
Zusammenfassung
In Bezug auf die MySQL-Sicherheit haben Sie eine sehr große Auswahl an Optionen. Die Optionen umfassen grundlegende Sicherheitsmaßnahmen, die auf so ziemlich alle Anwendungen anwendbar sind, aber einige der Optionen sind ziemlich spezifisch für MySQL. Denken Sie daran, dass noch nicht alle verfügbaren Optionen behandelt wurden - sie werden auch in den kommenden Ausgaben der MySQL-Sicherheitsserie behandelt.