MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

Zehn Tipps zum Erzielen von MySQL- und MariaDB-Sicherheit

Die Sicherheit von Daten hat heutzutage höchste Priorität. Manchmal wird es durch externe Vorschriften wie PCI-DSS oder HIPAA erzwungen, manchmal liegt es daran, dass Ihnen die Daten Ihrer Kunden und Ihr Ruf am Herzen liegen. Es gibt zahlreiche Sicherheitsaspekte, die Sie im Auge behalten müssen – Netzwerkzugriff, Betriebssystemsicherheit, Berechtigungen, Verschlüsselung und so weiter. In diesem Blogbeitrag geben wir Ihnen 10 Tipps, worauf Sie achten sollten, wenn Sie Ihr MySQL- oder MariaDB-Setup sichern.

1. Benutzer ohne Passwort entfernen

MySQL wurde früher mit einer Reihe vorgefertigter Benutzer geliefert, von denen sich einige ohne Passwort oder, noch schlimmer, mit anonymen Benutzern mit der Datenbank verbinden können. Dies hat sich in MySQL 5.7 geändert, das standardmäßig nur mit einem Root-Konto ausgestattet ist, das das von Ihnen bei der Installation gewählte Passwort verwendet. Dennoch gibt es MySQL-Installationen, die von früheren Versionen aktualisiert wurden, und diese Installationen behalten die alten Benutzer bei. Außerdem enthält MariaDB 10.2 auf Centos 7 anonyme Benutzer:

MariaDB [(none)]> select user, host, password from mysql.user where user like '';
+------+-----------------------+----------+
| user | host                  | password |
+------+-----------------------+----------+
|      | localhost             |          |
|      | localhost.localdomain |          |
+------+-----------------------+----------+
2 rows in set (0.00 sec)

Wie Sie sehen können, sind diese nur auf den Zugriff von localhost beschränkt, aber trotzdem möchten Sie solche Benutzer nicht haben. Obwohl ihre Privilegien eingeschränkt sind, können sie dennoch einige Befehle ausführen, die möglicherweise weitere Informationen über die Datenbank anzeigen – beispielsweise kann die Version helfen, weitere Angriffsvektoren zu identifizieren.

[[email protected] ~]# mysql -uanonymous_user
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 19
Server version: 10.2.11-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> SHOW GRANTS\G
*************************** 1. row ***************************
Grants for @localhost: GRANT USAGE ON *.* TO ''@'localhost'
1 row in set (0.00 sec)
MariaDB [(none)]> \s
--------------
mysql  Ver 15.1 Distrib 10.2.11-MariaDB, for Linux (x86_64) using readline 5.1
Connection id:        19
Current database:
Current user:        [email protected]
SSL:            Not in use
Current pager:        stdout
Using outfile:        ''
Using delimiter:    ;
Server:            MariaDB
Server version:        10.2.11-MariaDB MariaDB Server
Protocol version:    10
Connection:        Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /var/lib/mysql/mysql.sock
Uptime:            12 min 14 sec
Threads: 7  Questions: 36  Slow queries: 0  Opens: 17  Flush tables: 1  Open tables: 11  Queries per second avg: 0.049
--------------

Bitte beachten Sie, dass Benutzer mit sehr einfachen Passwörtern fast so unsicher sind wie Benutzer ohne Passwort. Passwörter wie „password“ oder „qwerty“ sind nicht wirklich hilfreich.

2. Straffer Fernzugriff

Zunächst einmal ist der Fernzugriff für Superuser – dies wird standardmäßig bei der Installation der neuesten MySQL (5.7) oder MariaDB (10.2) erledigt – nur lokaler Zugriff verfügbar. Dennoch ist es ziemlich üblich, dass Superuser aus verschiedenen Gründen verfügbar sind. Die häufigste, wahrscheinlich weil die Datenbank von Menschen verwaltet wird, die ihre Arbeit erleichtern wollen, also würden sie Fernzugriff auf ihre Datenbanken hinzufügen. Dies ist kein guter Ansatz, da der Fernzugriff es einfacher macht, potenzielle (oder verifizierte) Sicherheitslücken in MySQL auszunutzen – Sie müssen nicht zuerst eine Verbindung zum Host herstellen.

Ein weiterer Schritt:Stellen Sie sicher, dass jeder Benutzer nur von bestimmten Hosts aus eine Verbindung zu MySQL herstellen kann. Sie können immer mehrere Einträge für denselben Benutzer definieren ([email protected], [email protected]), dies sollte dazu beitragen, die Notwendigkeit von Platzhaltern ([email protected]’%’) zu reduzieren.

3. Testdatenbank entfernen

Die Testdatenbank steht standardmäßig allen Benutzern zur Verfügung, insbesondere den anonymen Benutzern. Solche Benutzer können Tabellen erstellen und in sie schreiben. Dies kann möglicherweise selbst zu einem Problem werden - alle Schreibvorgänge würden zusätzlichen Overhead verursachen und die Datenbankleistung verringern. Derzeit ist nach der Standardinstallation nur MariaDB 10.2 auf Centos 7 davon betroffen – Oracle MySQL 5.7 und Percona Server 5.7 haben das „Test“-Schema nicht verfügbar.

[[email protected] ~]# mysql -uanonymous_user
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 13
Server version: 10.2.11-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> SHOW GRANTS\G
*************************** 1. row ***************************
Grants for @localhost: GRANT USAGE ON *.* TO ''@'localhost'
1 row in set (0.00 sec)
MariaDB [(none)]> USE test;
Database changed
MariaDB [test]> CREATE TABLE testtable (a INT);
Query OK, 0 rows affected (0.01 sec)
MariaDB [test]> INSERT INTO testtable VALUES (1), (2), (3);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0
MariaDB [test]> SELECT * FROM testtable;
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

Natürlich kann es trotzdem vorkommen, dass Ihr MySQL 5.7 von früheren Versionen aktualisiert wurde, in denen das „test“-Schema nicht entfernt wurde – Sie sollten sich darum kümmern und prüfen, ob Sie es erstellt haben.

4. Verschleierung des Zugriffs auf MySQL

Es ist allgemein bekannt, dass MySQL auf Port 3306 läuft und sein Superuser „root“ heißt. Um die Sache noch schwieriger zu machen, ist es ganz einfach, dies zu ändern. Bis zu einem gewissen Grad ist dies ein Beispiel für Sicherheit durch Verschleierung, aber es kann zumindest automatisierte Versuche stoppen, Zugriff auf den „Root“-Benutzer zu erhalten. Um den Port zu ändern, müssen Sie my.cnf bearbeiten und die Variable „port“ auf einen anderen Wert setzen. Benutzer sollten nach der Installation von MySQL einen neuen Superuser erstellen (ALLE GRANTIEREN … MIT GRANT-OPTION) und dann vorhandene ‚[email protected]‘-Konten entfernen.

5. Netzwerksicherheit

Idealerweise wäre MySQL nicht über das Netzwerk verfügbar und alle Verbindungen würden lokal über den Unix-Socket abgewickelt. In einigen Setups ist dies möglich – in diesem Fall können Sie die Variable „skip-networking“ in my.cnf hinzufügen. Dadurch wird MySQL daran gehindert, irgendeine TCP/IP-Kommunikation zu verwenden, unter Linux wäre nur Unix-Socket verfügbar (Named Pipes und Shared Memory auf Windows-Hosts).

Meistens ist eine so strenge Sicherheit jedoch nicht machbar. In diesem Fall müssen Sie eine andere Lösung finden. Erstens können Sie Ihre Firewall verwenden, um Datenverkehr nur von bestimmten Hosts zum MySQL-Server zuzulassen. Zum Beispiel Anwendungshosts (obwohl sie in Ordnung sein sollten, MySQL über Proxys zu erreichen), die Proxy-Schicht und vielleicht ein Verwaltungsserver. Andere Hosts in Ihrem Netzwerk benötigen wahrscheinlich keinen direkten Zugriff auf den MySQL-Server. Dadurch werden Angriffsmöglichkeiten auf Ihre Datenbank eingeschränkt, falls einige Hosts in Ihrem Netzwerk kompromittiert werden.

Wenn Sie Proxys verwenden, die den Abgleich regulärer Ausdrücke für Abfragen zulassen, können Sie damit den SQL-Datenverkehr analysieren und verdächtige Abfragen blockieren. Höchstwahrscheinlich sollten Ihre Anwendungshosts nicht „DELETE * FROM your_table;“ ausführen. regelmäßig. Wenn es notwendig ist, einige Daten zu entfernen, kann es manuell lokal auf der MySQL-Instanz ausgeführt werden. Sie können solche Regeln mit etwas wie ProxySQL erstellen:solche Abfragen blockieren, umschreiben, umleiten. MaxScale bietet Ihnen auch die Möglichkeit, Abfragen basierend auf regulären Ausdrücken zu blockieren.

6. Audit-Plugins

Wenn Sie daran interessiert sind, Daten darüber zu sammeln, wer was wann ausgeführt hat, stehen mehrere Audit-Plugins für MySQL zur Verfügung. Wenn Sie MySQL Enterprise verwenden, können Sie MySQL Enterprise Audit verwenden, das eine Erweiterung von MySQL Enterprise ist. Percona und MariaDB haben auch ihre eigene Version von Audit-Plugins. Schließlich kann das McAfee-Plugin für MySQL auch mit verschiedenen Versionen von MySQL verwendet werden. Im Allgemeinen sammeln diese Plugins mehr oder weniger dieselben Daten – Verbindungs- und Trennungsereignisse, ausgeführte Abfragen, aufgerufene Tabellen. All dies enthält Informationen darüber, welcher Benutzer an einem solchen Ereignis teilgenommen hat, von welchem ​​​​Host aus es sich angemeldet hat, wann es passiert ist und so weiter. Die Ausgabe kann XML oder JSON sein, daher ist es viel einfacher, sie zu parsen als allgemeine Protokollinhalte (obwohl die Daten ziemlich ähnlich sind). Solche Ausgaben können auch an Syslog und darüber hinaus an eine Art Protokollserver zur Verarbeitung und Analyse gesendet werden.

7. LOAD DATA LOCAL INFILE deaktivieren

Wenn sowohl der Server als auch der Client die Möglichkeit haben, LOAD DATA LOCAL INFILE auszuführen, kann ein Client Daten aus einer lokalen Datei auf einen Remote-MySQL-Server laden. Dies kann möglicherweise dabei helfen, Dateien zu lesen, auf die der Client Zugriff hat – beispielsweise könnte man auf einem Anwendungsserver auf jede Datei zugreifen, auf die der HTTP-Server Zugriff hat. Um dies zu vermeiden, müssen Sie local-infile=0 in my.cnf

setzen

8. Dateirechte

Sie müssen bedenken, dass die MySQL-Sicherheit auch von der Konfiguration des Betriebssystems abhängt. MySQL speichert Daten in Form von Dateien. Der MySQL-Server schreibt viele Informationen in Protokolle. Manchmal enthalten diese Informationen Daten - zum Beispiel langsames Abfrageprotokoll, allgemeines Protokoll oder Binärprotokoll. Sie müssen sicherstellen, dass diese Informationen sicher und nur für Benutzer zugänglich sind, die darauf zugreifen müssen. Typischerweise bedeutet dies, dass nur der Root und der Benutzer, unter dessen Rechten MySQL läuft, Zugriff auf alle MySQL-bezogenen Dateien haben sollten. Meistens handelt es sich um einen dedizierten Benutzer namens „mysql“. Sie sollten die MySQL-Konfigurationsdateien und alle von MySQL generierten Protokolle überprüfen und sicherstellen, dass sie für andere Benutzer nicht lesbar sind.

9. SSL und Verschlüsselung von Daten während der Übertragung

Personen am Zugriff auf Konfigurations- und Protokolldateien zu hindern, ist eine Sache. Das andere Problem besteht darin, sicherzustellen, dass Daten sicher über das Netzwerk übertragen werden. Mit Ausnahme von Setups, bei denen alle Clients lokal sind und Unix-Socket verwenden, um auf MySQL zuzugreifen, verlassen Daten, die eine Ergebnismenge für eine Abfrage bilden, in den meisten Fällen den Server und werden über das Netzwerk an den Client übertragen. Daten können auch zwischen MySQL-Servern übertragen werden, beispielsweise über Standard-MySQL-Replikation oder innerhalb eines Galera-Clusters. Der Netzwerkverkehr kann ausspioniert werden, und dadurch würden Ihre Daten offengelegt.

Um dies zu verhindern, ist es möglich, SSL zum Verschlüsseln des Datenverkehrs sowohl server- als auch clientseitig zu verwenden. Sie können eine SSL-Verbindung zwischen einem Client und einem MySQL-Server herstellen. Sie können auch eine SSL-Verbindung zwischen Ihrem Master und Ihren Slaves oder zwischen den Knoten eines Galera-Clusters erstellen. Dadurch wird sichergestellt, dass alle übertragenen Daten sicher sind und nicht von einem Angreifer ausspioniert werden können, der sich Zugang zu Ihrem Netzwerk verschafft hat.

In der MySQL-Dokumentation wird ausführlich beschrieben, wie Sie die SSL-Verschlüsselung einrichten. Wenn Sie es zu umständlich finden, kann ClusterControl Ihnen dabei helfen, mit ein paar Klicks eine sichere Umgebung für die MySQL-Replikation oder den Galera-Cluster bereitzustellen:

10. Verschlüsselung ruhender Daten

Das Sichern von Daten während der Übertragung mit SSL-Verschlüsselung löst das Problem nur teilweise. Sie müssen sich auch um ruhende Daten kümmern – alle Daten, die in der Datenbank gespeichert sind. Die Verschlüsselung von ruhenden Daten kann auch eine Anforderung für Sicherheitsvorschriften wie HIPAA oder PCI DSS sein. Eine solche Verschlüsselung kann auf mehreren Ebenen implementiert werden – Sie können die gesamte Festplatte verschlüsseln, auf der die Dateien gespeichert sind. Sie können nur die MySQL-Datenbank über die in den neuesten Versionen von MySQL oder MariaDB verfügbaren Funktionen verschlüsseln. Die Anwendung kann auch eine Verschlüsselung implementieren, sodass sie die Daten verschlüsselt, bevor sie in der Datenbank gespeichert werden. Jede Option hat ihre Vor- und Nachteile:Die Festplattenverschlüsselung kann nur helfen, wenn die Festplatten physisch gestohlen werden, aber die Dateien auf einem laufenden Datenbankserver nicht verschlüsselt würden. Die MySQL-Datenbankverschlüsselung löst dieses Problem, kann jedoch den Zugriff auf Daten nicht verhindern, wenn das Root-Konto kompromittiert ist. Die Verschlüsselung auf Anwendungsebene ist am flexibelsten und sichersten, aber dann verlieren Sie die Leistung von SQL – es ist ziemlich schwierig, verschlüsselte Spalten in WHERE- oder JOIN-Klauseln zu verwenden.

Alle Varianten von MySQL bieten eine Art Data-at-Rest-Verschlüsselung. MySQL von Oracle verwendet Transparent Data Encryption, um InnoDB-Tablespaces zu verschlüsseln. Dies ist im kommerziellen MySQL Enterprise-Angebot verfügbar. Es bietet eine Option zum Verschlüsseln von InnoDB-Tablespaces, andere Dateien, die ebenfalls Daten in irgendeiner Form speichern (z. B. Binärlogs, allgemeines Log, Slow-Query-Log), werden nicht verschlüsselt. Dadurch kann die Toolchain (MySQL Enterprise Backup, aber auch xtrabackup, mysqldump, mysqlbinlog) mit einem solchen Setup korrekt funktionieren.

Ab MySQL 5.7.11 unterstützt die Community-Version von MySQL auch die InnoDB-Tablespace-Verschlüsselung. Der Hauptunterschied zum Enterprise-Angebot besteht in der Art und Weise, wie die Schlüssel gespeichert werden – Schlüssel befinden sich nicht in einem sicheren Tresor, was für die Einhaltung gesetzlicher Vorschriften erforderlich ist. Das bedeutet, dass es ab Percona Server 5.7.11 auch möglich ist, InnoDB-Tablespace zu verschlüsseln. Im kürzlich veröffentlichten Percona Server 5.7.20 wurde die Unterstützung für die Verschlüsselung von Binärprotokollen hinzugefügt. Es ist auch möglich, mit dem Hashicorp Vault-Server über ein keyring_vault-Plug-in zu integrieren, das die in der MySQL Enterprise Edition von Oracle verfügbaren Funktionen abgleicht (und sogar erweitert - die binäre Protokollverschlüsselung).

MariaDB hat in 10.1.3 Unterstützung für Datenverschlüsselung hinzugefügt – es handelt sich um eine separate, erweiterte Implementierung. Es gibt Ihnen die Möglichkeit, nicht nur InnoDB-Tablespaces, sondern auch InnoDB-Logdateien zu verschlüsseln. Infolgedessen sind die Daten sicherer, aber einige der Tools funktionieren in einer solchen Konfiguration nicht. Xtrabackup funktioniert nicht mit verschlüsselten Redo-Logs – MariaDB hat einen Fork, MariaDB Backup, erstellt, der Unterstützung für MariaDB-Verschlüsselung hinzufügt. Es gibt auch Probleme mit mysqlbinlog.

Unabhängig davon, welche MySQL-Variante Sie verwenden, solange es sich um eine neuere Version handelt, hätten Sie die Möglichkeit, die Verschlüsselung ruhender Daten über den Datenbankserver zu implementieren, um sicherzustellen, dass Ihre Daten zusätzlich gesichert sind.

Das Sichern von MySQL oder MariaDB ist nicht trivial, aber wir hoffen, dass diese 10 Tipps Ihnen dabei helfen werden.

Zusammenfassung

In der heutigen Landschaft hat die Datensicherheit für jeden Datenbankadministrator höchste Priorität. Ganz gleich, ob Ihre Motivation die Einhaltung gesetzlicher Vorschriften oder der Schutz Ihrer Kunden und des Rufs Ihres Unternehmens ist, diese zehn Tipps zur Sicherung Ihrer MySQL- und MariaDB-Datenbanken helfen Ihnen, Ihre Infrastruktur weiter zu sichern, und geben Ihnen ein beruhigendes Gefühl.

Es sind zahlreiche Maßnahmen zu berücksichtigen, um die Sicherheit Ihrer Datenbankinfrastruktur zu gewährleisten. In diesem Beitrag haben wir die Grundlagen wie Datenverschlüsselung, Netzwerkzugriffskontrollen, Benutzerauthentifizierung und -privilegien, Betriebssystemsicherheit und mehr behandelt.

Software zur Automatisierung des Datenbankmanagements, wie ClusterControl, kann ein großartiges Tool sein, das Sie bei Ihren Bemühungen um die allgemeine Datenbanksicherheit unterstützt. Wenn Sie tiefer in die einzelnen Schritte eintauchen möchten, die Sie zum Sichern Ihrer MySQL-Datenbanken unternehmen müssen, lesen Sie unbedingt Teil 1 und Teil 2 unserer Serie zum Sichern von MySQL. Folgen Sie uns auf Twitter, LinkedIn und abonnieren Sie unseren Newsletter für Updates, um über andere Best Practices für das Datenbankmanagement auf dem Laufenden zu bleiben.