Die Sicherheit von Daten ist für jede Organisation von entscheidender Bedeutung. Dies ist ein wichtiger Aspekt, der das Design der Datenbankumgebung stark beeinflussen kann. Bei der Entscheidung, welche MySQL-Variante Sie verwenden möchten, müssen Sie die Sicherheitsfunktionen berücksichtigen, die von den verschiedenen Serveranbietern verfügbar sind. In diesem Blogbeitrag stellen wir Ihnen einen kurzen Vergleich der neuesten Versionen der MySQL Community Edition von Oracle, Percona Server und MariaDB vor:
mysqld Ver 5.7.20-19 for Linux on x86_64 (Percona Server (GPL), Release 19, Revision 3c5d3e5d53c)
mysqld Ver 5.7.21 for Linux on x86_64 (MySQL Community Server (GPL))
mysqld Ver 10.2.12-MariaDB for Linux on x86_64 (MariaDB Server)
Wir werden Centos 7 als Betriebssystem verwenden – bitte beachten Sie, dass die hier präsentierten Ergebnisse auf anderen Distributionen wie Debian oder Ubuntu leicht abweichen können. Wir möchten uns auch auf die Unterschiede konzentrieren und werden die Gemeinsamkeiten nicht behandeln - Percona Server und MariaDB sind Varianten von MySQL, daher werden einige der Sicherheitsfunktionen (z. B. wie Zugriffsrechte von MySQL-Dateien aussehen) zwischen ihnen geteilt.
Anfangssicherheit
Benutzer
Sowohl Percona Server als auch MySQL Community Server werden mit einem zufällig generierten temporären Passwort für den Root-Benutzer geliefert. Sie müssen den Inhalt des Fehlerprotokolls von MySQL überprüfen, um ihn zu finden:
2018-01-19T13:47:45.532148Z 1 [Note] A temporary password is generated for [email protected]: palwJu7uSL,g
Sobald Sie sich anmelden, wird eine Passwortänderung von Ihnen erzwungen:
[[email protected] ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.21
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> select * from mysql.user;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
Das Passwort muss stark genug sein, dies wird durch das validate_password-Plugin erzwungen:
mysql> alter user [email protected] identified by 'password123.';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> alter user [email protected] identified by 'password123.A';
Query OK, 0 rows affected (0.00 sec)
MariaDB generiert kein zufälliges Root-Passwort und bietet passwortlosen Zugriff auf das Root-Konto von (und nur von) localhost.
[[email protected] ~]# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 12
Server version: 10.2.12-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)]> SELECT CURRENT_USER();
+----------------+
| CURRENT_USER() |
+----------------+
| [email protected] |
+----------------+
1 row in set (0.00 sec)
Dies ist während der anfänglichen Bereitstellungsphase kein großes Problem, da der DBA später den Zugriff auf die Datenbank konfigurieren und sichern soll (z. B. durch Ausführen von mysql_secure_installation). Das größere Problem dabei ist, dass eine bewährte Methode von MariaDB nicht durchgesetzt wird. Wenn Sie kein sicheres Passwort für den Root-Benutzer einrichten müssen, kann es sein, dass niemand es später ändert und der passwortlose Zugriff bestehen bleibt. Dann würde dies zu einer ernsthaften Sicherheitsbedrohung werden.
Ein weiterer Aspekt, den wir uns ansehen möchten, ist der anonyme, passwortlose Zugang. Anonyme Benutzer erlauben jedem den Zutritt, es muss kein vordefinierter Benutzer sein. Wenn ein solcher Zugriff passwortlos ist, bedeutet dies, dass sich jeder mit MySQL verbinden kann. Typischerweise hat ein solches Konto nur NUTZUNGS-Berechtigungen, aber selbst dann ist es möglich, einen Status ('\s') zu drucken, der Informationen wie MySQL-Version, Zeichensatz usw. enthält. Wenn außerdem ein 'Test'-Schema verfügbar ist, hat dieser Benutzer die Möglichkeit dazu in dieses Schema schreiben.
Sowohl der MySQL Community Server als auch der Percona-Server haben keine anonymen Benutzer, die in MySQL definiert sind:
mysql> select user, host, authentication_string from mysql.user;
+---------------+-----------+-------------------------------------------+
| user | host | authentication_string |
+---------------+-----------+-------------------------------------------+
| root | localhost | *EB965412B594F67C8EB611810EF8D406F2CF42BD |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+---------------+-----------+-------------------------------------------+
3 rows in set (0.00 sec)
Andererseits ist MariaDB offen für anonymen, passwortlosen Zugriff.
MariaDB [(none)]> select user,host,password from mysql.user;
+------+-----------------------+----------+
| user | host | password |
+------+-----------------------+----------+
| root | localhost | |
| root | localhost.localdomain | |
| root | 127.0.0.1 | |
| root | ::1 | |
| | localhost | |
| | localhost.localdomain | |
+------+-----------------------+----------+
6 rows in set (0.00 sec)
Darüber hinaus ist das „Test“-Schema verfügbar, das es anonymen Benutzern ermöglicht, Schreibvorgänge an die Datenbank zu senden.
[[email protected] ~]# mysql -umyanonymoususer
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 14
Server version: 10.2.12-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)]> use test;
Database changed
MariaDB [test]> CREATE TABLE mytab (a int);
Query OK, 0 rows affected (0.01 sec)
MariaDB [test]> INSERT INTO mytab VALUES (1), (2);
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0
MariaDB [test]> SELECT * FROM mytab;
+------+
| a |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.00 sec)
Dies stellt eine ernsthafte Bedrohung dar und muss aussortiert werden. Andernfalls kann es leicht ausgenutzt werden, um zu versuchen, den Server mit Schreibvorgängen zu überlasten.
Daten in der Transportsicherheit
MySQL Community Server und seine beiden Ableger unterstützen die Verwendung von SSL zum Verschlüsseln von Daten während der Übertragung. Dies ist für Wide Area Networks extrem wichtig, sollte aber auch in einem lokalen Netzwerk nicht übersehen werden. SSL kann sowohl client- als auch serverseitig verwendet werden. Bezüglich der serverseitigen Konfiguration (um beispielsweise den Datenverkehr vom Master zu den Slaves zu verschlüsseln) sieht es auf der ganzen Linie identisch aus. Es gibt jedoch einen Unterschied, wenn es um die clientseitige SSL-Verschlüsselung geht, die in MySQL 5.7 eingeführt wurde. Vor 5.7 musste man SSL-Schlüssel und CAs generieren und sie in den Konfigurationen von Server und Client definieren. So sieht das 10.2-SSL-Setup von MariaDB aus. Sowohl in MySQL Community Server 5.7 als auch in Percona Server 5.7 (das auf MySQL 5.7 basiert) müssen keine Schlüssel vorab generiert werden. Das alles geschieht automatisch im Hintergrund. Alles, was Sie tun müssen, ist, SSL auf Ihrem Client zu aktivieren, indem Sie den richtigen „--ssl-mode“ einstellen. Für den CLI-Client von MySQL ist dies nicht einmal erforderlich, da SSL standardmäßig aktiviert ist:
[[email protected] ~]# mysql -p -h127.0.0.1
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.21 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> \s
--------------
mysql Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using EditLine wrapper
Connection id: 6
Current database:
Current user: [email protected]
SSL: Cipher in use is DHE-RSA-AES256-SHA
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.7.21 MySQL Community Server (GPL)
Protocol version: 10
Connection: 127.0.0.1 via TCP/IP
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
Uptime: 2 days 21 hours 51 min 52 sec
Threads: 1 Questions: 15 Slow queries: 0 Opens: 106 Flush tables: 1 Open tables: 99 Queries per second avg: 0.000
--------------
Andererseits würde MariaDB eine zusätzliche Konfiguration erfordern, da SSL standardmäßig deaktiviert ist:
[[email protected] ~]# mysql -h127.0.0.1
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 18
Server version: 10.2.12-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)]> \s
--------------
mysql Ver 15.1 Distrib 10.2.12-MariaDB, for Linux (x86_64) using readline 5.1
Connection id: 18
Current database:
Current user: [email protected]
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 10.2.12-MariaDB MariaDB Server
Protocol version: 10
Connection: 127.0.0.1 via TCP/IP
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
Uptime: 2 days 22 hours 26 min 58 sec
Threads: 7 Questions: 45 Slow queries: 0 Opens: 18 Flush tables: 1 Open tables: 12 Queries per second avg: 0.000
--------------
Verschlüsselung von ruhenden Daten
Zunächst einmal Backups – es gibt frei verfügbare Backup-Tools wie xtrabackup oder MariaDB Backup (eine Abspaltung von xtrabackup). Diese ermöglichen es, verschlüsselte Backups aller drei MySQL-Varianten zu erstellen, die wir in diesem Blogpost besprechen.
Alle drei Varianten unterstützen die Verschlüsselung der laufenden Datenbank, aber es gibt Unterschiede darin, welche Datenteile verschlüsselt werden.
Der MySQL Community Server unterstützt nur die Verschlüsselung von InnoDB-Tablespaces. Schlüssel, die für die Verschlüsselung verwendet werden, werden in Dateien gespeichert (was nicht den Vorschriften entspricht – Schlüssel sollten in einem Tresor gespeichert werden – etwas, das MySQL Enterprise unterstützt). Percona Server basiert auf MySQL Community Server und unterstützt daher auch die Verschlüsselung von InnoDB-Tablespaces. Kürzlich wurde in Percona Server 5.7.20 die Unterstützung für die Verschlüsselung allgemeiner Tablespaces (im Vergleich zu nur einzelnen in früheren Versionen und der MySQL Community Edition) hinzugefügt. Unterstützung für die Verschlüsselung von Binärprotokollen wurde ebenfalls hinzugefügt. Percona Server wird mit einem keyring_vault-Plug-In geliefert, das zum Speichern von Schlüsseln auf dem Hashicorp Vault-Server verwendet werden kann, wodurch Percona Server 5.7.20 den gesetzlichen Anforderungen in Bezug auf die Verschlüsselung von ruhenden Daten entspricht.
MariaDB 10.2 bietet erweiterte Unterstützung für Data-at-Rest-Verschlüsselung. Zusätzlich zur Tablespace- und Binär-/Relay-Log-Verschlüsselung unterstützt es die Verschlüsselung von InnoDB-Redo-Logs. Derzeit ist es die vollständigere Lösung in Bezug auf die Datenverschlüsselung.
Auditprotokollierung
Alle drei MySQL-Varianten unterstützen Audit-Logging. Ihr Umfang ist ziemlich vergleichbar:Connect- und Disconnect-Ereignisse, ausgeführte Abfragen, aufgerufene Tabellen. Die Protokolle enthalten Informationen darüber, welcher Benutzer an einem solchen Ereignis teilgenommen hat, von welchem Host sich der Benutzer angemeldet hat, wann es passiert ist und ähnliche Informationen. Solche Ereignisse können auch über Syslog protokolliert und auf einem externen Protokollserver gespeichert werden, um Protokollanalyse und -parsing zu ermöglichen.
Datenmaskierung, SQL-Firewall
Alle besprochenen MySQL-Varianten arbeiten mit einer Art Tool, das die Implementierung von Datenmaskierung ermöglicht und in der Lage wäre, den SQL-Verkehr basierend auf einigen Regeln zu blockieren. Datenmaskierung ist eine Methode zum Verschleiern einiger Daten außerhalb der Datenbank, aber bevor sie den Client erreichen. Ein Beispiel wären Kreditkartendaten, die im Klartext in der Datenbank gespeichert sind, aber wenn ein Entwickler solche Daten abfragen möchte, sieht er „xxxxxxxx …“ anstelle von Zahlen. Die Tools, über die wir hier sprechen, sind ProxySQL und MaxScale. MaxScale ist ein Produkt der MariaDB Corporation und ist abonnementbasiert. ProxySQL ist ein kostenloser Datenbank-Proxy. Beide Proxys können mit allen MySQL-Varianten verwendet werden.
Das ist alles für heute Leute. Weitere Informationen finden Sie in diesen 10 Tipps zum Sichern Ihrer MySQL- und MariaDB-Datenbanken.