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

Datenbanksicherheitsüberwachung für MySQL und MariaDB

Der Datenschutz ist einer der wichtigsten Aspekte bei der Verwaltung einer Datenbank. Abhängig von der Organisationsstruktur, ob Sie Entwickler, Systemadministrator oder DBA sind, müssen Sie, wenn Sie die Produktionsdatenbank verwalten, Daten auf unbefugten Zugriff und Nutzung überwachen. Der Zweck der Sicherheitsüberwachung ist zweifach. Erstens, um nicht autorisierte Aktivitäten in der Datenbank zu identifizieren. Und zweitens, um zu überprüfen, ob Datenbanken und ihre Konfigurationen auf unternehmensweiter Basis mit Sicherheitsrichtlinien und -standards konform sind.

In diesem Artikel werden wir die Sicherheitsüberwachung in zwei Kategorien einteilen. Einer wird sich auf die Prüfung von MySQL- und MariaDB-Datenbankaktivitäten beziehen. In der zweiten Kategorie geht es um die Überwachung Ihrer Instanzen auf potenzielle Sicherheitslücken.

Auf Abfrage- und Verbindungsrichtlinien basierende Überwachung

Kontinuierliche Überwachung ist eine zwingende Aufgabe für die Überwachung Ihrer Datenbankumgebung. Indem Sie Ihre Datenbank prüfen, können Sie für durchgeführte Aktionen oder aufgerufene Inhalte Rechenschaft ablegen. Darüber hinaus kann die Prüfung einige kritische Systemkomponenten umfassen, z. B. diejenigen, die mit Finanzdaten verbunden sind, um eine genaue Reihe von Vorschriften wie SOX oder die EU-DSGVO-Verordnung zu unterstützen. Normalerweise wird dies erreicht, indem Informationen über DB-Operationen in der Datenbank in einer externen Protokolldatei protokolliert werden.

Standardmäßig ist die Überwachung in MySQL oder MariaDB deaktiviert. Sie erreichen dies, indem Sie zusätzliche Plugins installieren oder alle Abfragen mit dem Parameter query_log erfassen. Die allgemeine Abfrageprotokolldatei ist eine allgemeine Aufzeichnung dessen, was MySQL durchführt. Der Server zeichnet einige Informationen in diesem Protokoll auf, wenn Clients eine Verbindung herstellen oder trennen, und er protokolliert jede von Clients empfangene SQL-Anweisung. Aufgrund von Leistungsproblemen und fehlenden Konfigurationsoptionen ist general_log keine gute Lösung für Sicherheitsüberprüfungszwecke.

Wenn Sie MySQL Enterprise verwenden, können Sie das Plug-in MySQL Enterprise Audit verwenden, das eine Erweiterung der proprietären MySQL-Version ist. Das Plug-in „MySQL Enterprise Audit Plugin“ ist nur mit MySQL Enterprise verfügbar, einem kommerziellen Angebot von Oracle. Percona und MariaDB haben ihre eigenen Open-Source-Versionen des Audit-Plugins erstellt. Schließlich kann das McAfee-Plugin für MySQL auch mit verschiedenen Versionen von MySQL verwendet werden. In diesem Artikel konzentrieren wir uns auf die Open-Source-Plugins, obwohl die Enterprise-Version von Oracle die robusteste und stabilste zu sein scheint.

Eigenschaften von MySQL-Open-Source-Audit-Plugins

Während die Open-Source-Audit-Plug-ins die gleiche Aufgabe erfüllen wie das Enterprise-Plug-in von Oracle – sie erzeugen Ausgaben mit Datenbankabfragen und -verbindungen – gibt es einige wesentliche architektonische Unterschiede.

MariaDB Audit Plugin – Das MariaDB Audit Plugin funktioniert mit MariaDB, MySQL (ab Version 5.5.34 und 10.0.7) und Percona Server. MariaDB enthält das Audit-Plug-in standardmäßig ab den Versionen 10.0.10 und 5.5.37 und kann in jeder Version ab MariaDB 5.5.20 installiert werden. Es ist das einzige Plugin, das Oracle MySQL, Percona Server und MariaDB unterstützt. Es ist auf Windows- und Linux-Plattformen verfügbar. Versionen ab 1.2 sind am stabilsten, und es kann riskant sein, Versionen darunter in Ihrer Produktionsumgebung zu verwenden.

McAfee MySQL Audit Plugin – Dieses Plugin verwendet keine MySQL-Audit-API. Es wurde kürzlich aktualisiert, um MySQL 5.7 zu unterstützen. Einige Tests zeigen, dass API-basierte Plugins möglicherweise eine bessere Leistung bieten, aber Sie müssen dies mit Ihrer Umgebung überprüfen.

Percona Audit Log Plugin – Percona bietet eine Open-Source-Audit-Lösung, die mit Percona Server 5.5.37+ und 5.6.17+ als Teil des Installationsprozesses installiert wird. Im Vergleich zu anderen Open-Source-Plugins hat dieses Plugin mehr Ausgabefunktionen, da es XML, JSON und Syslog ausgibt.

Da es einige interne Hooks zum Server hat, um mit dem Plugin von Oracle funktionskompatibel zu sein, ist es nicht als eigenständiges Plugin für andere Versionen von MySQL verfügbar.

Plugin-Installation basierend auf MariaDB-Audit-Erweiterung

Die Installation von Open-Source-MySQL-Plugins ist für MariaDB-, Percona- und McAfee-Versionen ziemlich ähnlich.
Percona und MariaDB fügen ihre Plugins als Teil der standardmäßigen Server-Binärdateien hinzu, sodass Plugins nicht separat heruntergeladen werden müssen. Die Percona-Version unterstützt offiziell nur ihren eigenen Fork von MySQL, daher gibt es keinen direkten Download von der Website des Anbieters (wenn Sie dieses Plugin mit MySQL verwenden möchten, müssen Sie das Plugin von einem Percona-Serverpaket beziehen). Wenn Sie das MariaDB-Plugin mit anderen Forks von MySQL verwenden möchten, finden Sie es unter https://downloads.mariadb.com/Audit-Plugin/MariaDB-Audit-Plugin/. Das McAfee-Plugin ist unter https://github.com/mcafee/mysql-audit/wiki/Installation.

verfügbar

Bevor Sie mit der Plugin-Installation beginnen, können Sie überprüfen, ob das Plugin im System vorhanden ist. Der Speicherort des dynamischen Plugins (erfordert keinen Neustart der Instanz) kann überprüft werden mit:

SHOW GLOBAL VARIABLES LIKE 'plugin_dir';

+---------------+--------------------------+
| Variable_name | Value                    |
+---------------+--------------------------+
| plugin_dir    | /usr/lib64/mysql/plugin/ |
+---------------+--------------------------+

Überprüfen Sie das auf Dateisystemebene zurückgegebene Verzeichnis, um sicherzustellen, dass Sie eine Kopie der Plugin-Bibliothek haben. Wenn Sie server_audit.so oder server_audit.dll nicht in /usr/lib64/mysql/plugin/ haben, wird Ihre MariaDB-Version wahrscheinlich nicht unterstützt und sollte auf die neueste Version aktualisiert werden..

Die Syntax zum Installieren des MariaDB-Plugins lautet:

INSTALL SONAME 'server_audit';

Um installierte Plugins zu überprüfen, müssen Sie Folgendes ausführen:

SHOW PLUGINS;
MariaDB [(none)]> show plugins;
+-------------------------------+----------+--------------------+--------------------+---------+
| Name                          | Status   | Type               | Library            | License |
+-------------------------------+----------+--------------------+--------------------+---------+
| binlog                        | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| mysql_native_password         | ACTIVE   | AUTHENTICATION     | NULL               | GPL     |
| mysql_old_password            | ACTIVE   | AUTHENTICATION     | NULL               | GPL     |
| wsrep                         | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| MRG_MyISAM                    | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| MEMORY                        | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| CSV                           | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| MyISAM                        | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| CLIENT_STATISTICS             | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INDEX_STATISTICS              | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| TABLE_STATISTICS              | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| USER_STATISTICS               | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| PERFORMANCE_SCHEMA            | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| InnoDB                        | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| INNODB_TRX                    | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_LOCKS                  | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_LOCK_WAITS             | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP                    | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
...
| INNODB_MUTEXES                | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_SEMAPHORE_WAITS    | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_TABLESPACES_ENCRYPTION | ACTIVE   | INFORMATION SCHEMA | NULL               | BSD     |
| INNODB_TABLESPACES_SCRUBBING  | ACTIVE   | INFORMATION SCHEMA | NULL               | BSD     |
| Aria                          | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| SEQUENCE                      | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| user_variables                | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| FEEDBACK                      | DISABLED | INFORMATION SCHEMA | NULL               | GPL     |
| partition                     | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| rpl_semi_sync_master          | ACTIVE   | REPLICATION        | semisync_master.so | GPL     |
| rpl_semi_sync_slave           | ACTIVE   | REPLICATION        | semisync_slave.so  | GPL     |
| SERVER_AUDIT                  | ACTIVE   | AUDIT              | server_audit.so    | GPL     |
+-------------------------------+----------+--------------------+--------------------+---------+

Wenn Sie zusätzliche Informationen benötigen, überprüfen Sie die PLUGINS-Tabelle in der information_schema-Datenbank, die detailliertere Informationen enthält.

Eine andere Möglichkeit, das Plug-in zu installieren, besteht darin, das Plug-in in my.cnf zu aktivieren und die Instanz neu zu starten. Ein Beispiel für eine grundlegende Audit-Plugin-Konfiguration von MariaDB könnte sein:

server_audit_events=CONNECT
server_audit_file_path=/var/log/mysql/audit.log
server_audit_file_rotate_size=1073741824
server_audit_file_rotations=8
server_audit_logging=ON
server_audit_incl_users=
server_audit_excl_users=
server_audit_output_type=FILE
server_audit_query_log_limit=1024

Die obige Einstellung sollte in my.cnf platziert werden. Das Audit-Plugin erstellt die Datei /var/log/mysql/audit.log, die bei einer Größe von 1 GB rotiert, und es gibt acht Rotationen, bis die Datei überschrieben wird. Die Datei enthält nur Informationen über Verbindungen.

Derzeit gibt es sechzehn Einstellungen, mit denen Sie das MariaDB-Audit-Plugin anpassen können.

server_audit_events
server_audit_excl_users
server_audit_file_path
server_audit_file_rotate_now
server_audit_file_rotate_size
server_audit_file_rotations
server_audit_incl_users
server_audit_loc_info
server_audit_logging
server_audit_mode
server_audit_output_type
Server_audit_query_log_limit
server_audit_syslog_facility
server_audit_syslog_ident
server_audit_syslog_info
server_audit_syslog_priority

Darunter finden Sie Optionen zum Einschließen oder Ausschließen von Benutzern, zum Festlegen verschiedener Protokollierungsereignisse (CONNECT oder QUERY) und zum Umschalten zwischen Datei und Syslog.

Um sicherzustellen, dass das Plugin beim Serverstart aktiviert wird, müssen Sie
plugin_load=server_audit=server_audit.so in Ihren my.cnf-Einstellungen setzen. Eine solche Konfiguration kann zusätzlich durch server_audit=FORCE_PLUS_PERMANENT geschützt werden, wodurch die Deinstallationsoption des Plugins deaktiviert wird.

UNINSTALL PLUGIN server_audit;

ERROR 1702 (HY000):
Plugin 'server_audit' is force_plus_permanent and can not be unloaded

Hier sind einige Beispieleinträge, die vom MariaDB-Audit-Plugin erstellt wurden:

20180817 20:00:01,slave,cmon,cmon,31,0,DISCONNECT,information_schema,,0
20180817 20:47:01,slave,cmon,cmon,17,0,DISCONNECT,information_schema,,0
20180817 20:47:02,slave,cmon,cmon,19,0,DISCONNECT,information_schema,,0
20180817 20:47:02,slave,cmon,cmon,18,0,DISCONNECT,information_schema,,0
20180819 17:19:19,slave,cmon,cmon,12,0,CONNECT,information_schema,,0
20180819 17:19:19,slave,root,localhost,13,0,FAILED_CONNECT,,,1045
20180819 17:19:19,slave,root,localhost,13,0,DISCONNECT,,,0
20180819 17:19:20,slave,cmon,cmon,14,0,CONNECT,mysql,,0
20180819 17:19:20,slave,cmon,cmon,14,0,DISCONNECT,mysql,,0
20180819 17:19:21,slave,cmon,cmon,15,0,CONNECT,information_schema,,0
20180819 17:19:21,slave,cmon,cmon,16,0,CONNECT,information_schema,,0
20180819 19:00:01,slave,cmon,cmon,17,0,CONNECT,information_schema,,0
20180819 19:00:01,slave,cmon,cmon,17,0,DISCONNECT,information_schema,,0

Schemaänderungsbericht

Wenn Sie nur DDL-Änderungen nachverfolgen müssen, können Sie den ClusterControl Operational Report on Schema Change verwenden. Der Schema Change Detection Report zeigt alle DDL-Änderungen an Ihrer Datenbank. Diese Funktionalität erfordert einen zusätzlichen Parameter in der ClusterControl-Konfigurationsdatei. Wenn dies nicht gesetzt ist, sehen Sie die folgenden Informationen:schema_change_detection_address is not set in /etc/cmon.d/cmon_1.cnf. Sobald dies eingerichtet ist, kann eine Beispielausgabe wie folgt aussehen:

Es kann mit einem Zeitplan eingerichtet und die Berichte per E-Mail an die Empfänger gesendet werden.

ClusterControl:Betriebsbericht planen

MySQL-Datenbank-Sicherheitsbewertung

Paket-Upgrade-Check

Zunächst beginnen wir mit Sicherheitskontrollen. Mit MySQL-Patches auf dem neuesten Stand zu sein, trägt dazu bei, Risiken im Zusammenhang mit bekannten Schwachstellen im MySQL-Server zu reduzieren. Sie können Ihre Umgebung auf dem neuesten Stand halten, indem Sie das Paket-Repository der Anbieter verwenden. Basierend auf diesen Informationen können Sie Ihre eigenen Berichte erstellen oder Tools wie ClusterControl verwenden, um Ihre Umgebung zu überprüfen und Sie über mögliche Updates zu informieren.

ClusterControl Upgrade Report sammelt Informationen vom Betriebssystem und vergleicht sie mit Paketen, die im Repository verfügbar sind. Der Bericht ist in vier Abschnitte unterteilt; Upgrade-Zusammenfassung, Datenbankpakete, Sicherheitspakete und andere Pakete. Sie können schnell vergleichen, was Sie auf Ihrem System installiert haben, und ein empfohlenes Upgrade oder Patch finden.

ClusterControl:Upgrade-Bericht ClusterControl:Details zum Upgrade-Bericht

Um sie manuell zu vergleichen, können Sie ausführen

SHOW VARIABLES WHERE variable_name LIKE "version";

Mit Sicherheitsbulletins wie:
https://www.oracle.com/technetwork/topics/security/alerts-086861.html
https://nvd.nist.gov/view/vuln/search- results?adv_search=true&cves=on&cpe_vendor=cpe%3a%2f%3aoracle&cpe_produ
https://www.percona.com/doc/percona-server/LATEST/release-notes/release-notes_index.html
https://downloads.mariadb.org/mariadb/+releases/
https://www.cvedetails.com/vulnerability-list/vendor_id-12010/Mariadb.html
https://www. cvedetails.com/vulnerability-list/vendor_id-13000/Percona.html

Oder Anbieter-Repositories:

Auf Debian

sudo apt list mysql-server

Auf RHEL/Centos

yum list | grep -i mariadb-server

Konten ohne Passwort

Leere Passwörter ermöglichen es einem Benutzer, sich ohne Verwendung eines Passworts anzumelden. 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. Glücklicherweise hat sich dies in MySQL 5.7 geändert. Schließlich kommt es nur mit einem Root-Konto, das das Passwort verwendet, das Sie bei der Installation wählen.

Legen Sie für jede von der Prüfprozedur zurückgegebene Zeile ein Kennwort fest:

SELECT User,host
FROM mysql.user
WHERE authentication_string='';

Darüber hinaus können Sie ein Plug-in zur Kennwortvalidierung installieren und eine sicherere Richtlinie implementieren:

INSTALL PLUGIN validate_password SONAME 'validate_password.so';

SHOW VARIABLES LIKE 'default_password_lifetime';
SHOW VARIABLES LIKE 'validate_password%';

Ein guter Anfang kann sein:

plugin-load=validate_password.so
validate-password=FORCE_PLUS_PERMANENT
validate_password_length=14
validate_password_mixed_case_count=1
validate_password_number_count=1
validate_password_special_char_count=1
validate_password_policy=MEDIUM

Natürlich hängen diese Einstellungen von Ihren geschäftlichen Anforderungen ab.

Fernzugriffsüberwachung

Das Vermeiden der Verwendung von Platzhaltern in Hostnamen hilft bei der Kontrolle der spezifischen Standorte, von denen aus ein bestimmter Benutzer eine Verbindung zur Datenbank herstellen und mit ihr interagieren kann.

Sie sollten sicherstellen, dass sich jeder Benutzer nur von bestimmten Hosts aus mit MySQL verbinden kann. Sie können immer mehrere Einträge für denselben Benutzer definieren, dies sollte dazu beitragen, den Bedarf an Wildcards zu reduzieren.

Führen Sie die folgende SQL-Anweisung aus, um diese Empfehlung zu bewerten (stellen Sie sicher, dass keine Zeilen zurückgegeben werden):

SELECT user, host FROM mysql.user WHERE host = '%';

Datenbank testen

Die MySQL-Standardinstallation enthält eine unbenutzte Datenbank namens Test, und die Testdatenbank steht 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 - und Schreibvorgänge würden zusätzlichen Overhead verursachen und die Datenbankleistung verringern. Es wird empfohlen, die Testdatenbank zu löschen. Um festzustellen, ob die Testdatenbank vorhanden ist, führen Sie Folgendes aus:

SHOW DATABASES LIKE 'test';

Wenn Sie feststellen, dass die Testdatenbank vorhanden ist, könnte dies daran liegen, dass das Skript mysql_secure_installation, das die Testdatenbank (sowie andere sicherheitsrelevante Aktivitäten) löscht, nicht ausgeführt wurde.

DATEN INFILE LADEN

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. Der Parameter local_infile bestimmt, ob Dateien, die sich auf dem Computer des MySQL-Clients befinden, geladen oder über LOAD DATA INFILE oder SELECT local_file.

ausgewählt werden können

Dies kann möglicherweise dabei helfen, Dateien zu lesen, auf die der Client Zugriff hat – beispielsweise könnte man auf einem Anwendungsserver auf alle Daten zugreifen, auf die der HTTP-Server Zugriff hat. Um dies zu vermeiden, müssen Sie local-infile=0 in my.cnf setzen.

Führen Sie die folgende SQL-Anweisung aus und stellen Sie sicher, dass das Feld Value auf OFF gesetzt ist:

SHOW VARIABLES WHERE Variable_name = 'local_infile';

Auf unverschlüsselte Tablespaces überwachen

Ab MySQL 5.7.11 unterstützt InnoDB die Datenverschlüsselung für Tabellen, die in Datei-pro-Tabelle-Tablespaces gespeichert sind. Diese Funktion bietet Verschlüsselung im Ruhezustand für physische Tablespace-Datendateien. Um zu überprüfen, ob Ihre Tabellen verschlüsselt wurden, führen Sie Folgendes aus:

mysql> SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES
       WHERE CREATE_OPTIONS LIKE '%ENCRYPTION="Y"%';

+--------------+------------+----------------+
| TABLE_SCHEMA | TABLE_NAME | CREATE_OPTIONS |
+--------------+------------+----------------+
| test         | t1         | ENCRYPTION="Y" |
+--------------+------------+----------------+

Als Teil der Verschlüsselung sollten Sie auch die Verschlüsselung des Binärlogs in Betracht ziehen. Der MySQL-Server schreibt viele Informationen in Binärlogs.

Validierung der Verschlüsselungsverbindung

In einigen Setups sollte die Datenbank nicht über das Netzwerk zugänglich sein, wenn jede Verbindung lokal über den Unix-Socket verwaltet wird. In solchen Fällen können Sie die Variable „skip-networking“ in my.cnf hinzufügen. Skip-Networking hindert MySQL daran, TCP/IP-Verbindungen zu verwenden, und unter Linux wäre nur Unix-Socket möglich.

Dies ist jedoch eine eher seltene Situation, da es üblich ist, über das Netzwerk auf MySQL zuzugreifen. Sie müssen dann überwachen, dass Ihre Verbindungen verschlüsselt sind. MySQL unterstützt SSL als Mittel zum Verschlüsseln des Datenverkehrs sowohl zwischen MySQL-Servern (Replikation) als auch zwischen MySQL-Servern und -Clients. Wenn Sie den Galera-Cluster verwenden, sind ähnliche Funktionen verfügbar – sowohl die Kommunikation innerhalb des Clusters als auch Verbindungen mit Clients können mit SSL verschlüsselt werden. Um zu überprüfen, ob Sie die SSL-Verschlüsselung verwenden, führen Sie die folgenden Abfragen aus:

SHOW variables WHERE variable_name = 'have_ssl'; 
select ssl_verify_server_cert from mysql.slave_master_info;

Das war es fürs Erste. Dies ist keine vollständige Liste. Lassen Sie uns wissen, ob Sie heute andere Überprüfungen Ihrer Produktionsdatenbanken durchführen.