sql >> Databáze >  >> RDS >> MariaDB

Monitorování zabezpečení databáze pro MySQL a MariaDB

Ochrana dat je jedním z nejdůležitějších aspektů správy databáze. Pokud spravujete produkční databázi, musíte v závislosti na organizační struktuře, ať už jste vývojář, správce systému nebo DBA, sledovat data z hlediska neoprávněného přístupu a použití. Účel bezpečnostního sledování je dvojí. Jedna, k identifikaci neoprávněné aktivity v databázi. A za druhé, zkontrolovat, zda jsou databáze a jejich konfigurace v rámci celé společnosti v souladu s bezpečnostními politikami a standardy.

V tomto článku rozdělíme monitorování bezpečnosti do dvou kategorií. Jedna se bude týkat auditování aktivit databází MySQL a MariaDB. Druhá kategorie se bude týkat monitorování vašich instancí kvůli potenciálním bezpečnostním mezerám.

Monitorování založené na zásadách dotazů a připojení

Nepřetržitý audit je nezbytným úkolem pro monitorování vašeho databázového prostředí. Auditováním databáze můžete dosáhnout odpovědnosti za provedené akce nebo přístup k obsahu. Kromě toho může audit zahrnovat některé kritické systémové komponenty, jako jsou ty, které jsou spojeny s finančními údaji na podporu přesného souboru předpisů, jako je SOX nebo nařízení EU GDPR. Obvykle se toho dosáhne protokolováním informací o operacích DB v databázi do externího souboru protokolu.

Ve výchozím nastavení je auditování v MySQL nebo MariaDB zakázáno. Vy a dosáhnete toho instalací dalších pluginů nebo zachycením všech dotazů pomocí parametru query_log. Obecný soubor protokolu dotazů je obecný záznam toho, co MySQL provádí. Server zaznamenává některé informace do tohoto protokolu, když se klienti připojují nebo odpojují, a zaznamenává každý příkaz SQL přijatý od klientů. Kvůli problémům s výkonem a chybějícím možnostem konfigurace není obecný_log dobrým řešením pro účely auditu zabezpečení.

Pokud používáte MySQL Enterprise, můžete použít plugin MySQL Enterprise Audit, který je rozšířením proprietární verze MySQL. Plugin MySQL Enterprise Audit Plugin je k dispozici pouze s MySQL Enterprise, což je komerční nabídka společnosti Oracle. Percona a MariaDB vytvořily své vlastní open source verze auditovacího pluginu. A konečně, McAfee plugin pro MySQL lze také použít s různými verzemi MySQL. V tomto článku se zaměříme na pluginy s otevřeným zdrojovým kódem, ačkoli verze Enterprise od společnosti Oracle se zdá být nejrobustnější a nejstabilnější.

Charakteristiky pluginů MySQL Open Source auditu

Zatímco pluginy auditu s otevřeným zdrojovým kódem dělají stejnou práci jako plugin Enterprise od společnosti Oracle – produkují výstup s databázovým dotazem a připojeními – existují některé velké architektonické rozdíly.

MariaDB Audit Plugin – MariaDB Audit Plugin funguje s MariaDB, MySQL (od verze 5.5.34 a 10.0.7) a Percona Server. MariaDB začala ve výchozím nastavení zahrnovat Audit Plugin od verzí 10.0.10 a 5.5.37 a lze jej nainstalovat v jakékoli verzi od MariaDB 5.5.20. Je to jediný plugin, který podporuje Oracle MySQL, Percona Server a MariaDB. Je k dispozici na platformě Windows a Linux. Verze počínaje 1.2 jsou nejstabilnější a používání nižších verzí ve vašem produkčním prostředí může být riskantní.

McAfee MySQL Audit Plugin – Tento plugin nepoužívá MySQL audit API. Nedávno byl aktualizován, aby podporoval MySQL 5.7. Některé testy ukazují, že pluginy založené na rozhraní API mohou poskytovat lepší výkon, ale musíte to zkontrolovat ve svém prostředí.

Percona Audit Log Plugin – Percona poskytuje open source řešení auditování, které se instaluje s Percona Server 5.5.37+ a 5.6.17+ jako součást instalačního procesu. Ve srovnání s jinými pluginy s otevřeným zdrojovým kódem má tento plugin více funkcí výstupu dosahu, protože vydává XML, JSON a syslog.

Vzhledem k tomu, že má některé vnitřní háčky k serveru, aby byl kompatibilní s pluginem Oracle, není k dispozici jako samostatný plugin pro jiné verze MySQL.

Instalace pluginu na základě rozšíření MariaDB audit

Instalace pluginů MySQL s otevřeným zdrojovým kódem je u verzí MariaDB, Percona a McAfee docela podobná.
Percona a MariaDB přidávají své pluginy jako součást výchozích serverových binárních souborů, takže není potřeba stahovat pluginy samostatně. Verze Percona oficiálně podporuje pouze vlastní fork MySQL, takže neexistuje přímé stahování z webu dodavatele (pokud chcete tento plugin používat s MySQL, budete si muset plugin pořídit ze serverového balíčku Percona). Pokud byste chtěli plugin MariaDB používat s jinými forky MySQL, pak ho najdete na https://downloads.mariadb.com/Audit-Plugin/MariaDB-Audit-Plugin/. Plugin McAfee je dostupný na https://github.com/mcafee/mysql-audit/wiki/Installation.

Než zahájíte instalaci pluginu, můžete zkontrolovat, zda je plugin v systému přítomen. Umístění dynamického pluginu (nevyžaduje restart instance) lze zkontrolovat pomocí:

SHOW GLOBAL VARIABLES LIKE 'plugin_dir';

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

Zkontrolujte adresář vrácený na úrovni souborového systému, abyste se ujistili, že máte kopii knihovny zásuvných modulů. Pokud v /usr/lib64/mysql/plugin/ nemáte server_audit.so nebo server_audit.dll, pak je pravděpodobnější, že vaše verze MariaDB není podporována a měli byste ji upgradovat na nejnovější verzi..

Syntaxe pro instalaci pluginu MariaDB je:

INSTALL SONAME 'server_audit';

Chcete-li zkontrolovat nainstalované pluginy, musíte spustit:

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     |
+-------------------------------+----------+--------------------+--------------------+---------+

Pokud potřebujete další informace, podívejte se do tabulky PLUGINS v databázi information_schema, která obsahuje podrobnější informace.

Dalším způsobem, jak nainstalovat plugin, je povolit plugin v my.cnf a restartovat instanci. Příkladem základní konfigurace zásuvného modulu auditu z MariaDB může být:

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

Výše uvedené nastavení by mělo být umístěno v my.cnf. Audit plugin vytvoří soubor /var/log/mysql/audit.log, který se bude otáčet o velikosti 1GB a bude provedeno osm otočení, dokud nebude soubor přepsán. Soubor bude obsahovat pouze informace o připojeních.

V současné době existuje šestnáct nastavení, která můžete použít k úpravě pluginu MariaDB audit.

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

Mezi nimi můžete najít možnosti pro zahrnutí nebo vyloučení uživatelů, nastavení různých událostí protokolování (CONNECT nebo QUERY) a přepínání mezi souborem a syslog.

Abyste se ujistili, že plugin bude povolen při spuštění serveru, musíte v nastavení my.cnf nastavit
plugin_load=server_audit=server_audit.so. Takovou konfiguraci lze dodatečně chránit pomocí server_audit=FORCE_PLUS_PERMANENT, která deaktivuje možnost odinstalace pluginu.

UNINSTALL PLUGIN server_audit;

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

Zde je několik ukázkových záznamů vytvořených pluginem MariaDB audit:

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

Přehled změn schématu

Pokud potřebujete sledovat pouze změny DDL, můžete použít ClusterControl Operational Report on Schema Change. Zpráva o zjištění změny schématu zobrazuje všechny změny DDL ve vaší databázi. Tato funkce vyžaduje další parametr v konfiguračním souboru ClusterControl. Pokud toto není nastaveno, zobrazí se následující informace:adresa detekce_změny schema není nastavena v /etc/cmon.d/cmon_1.cnf. Jakmile je to na místě, příklad výstupu může vypadat následovně:

Lze jej nastavit pomocí plánu a přehledy odesílat příjemcům e-mailem.

ClusterControl:Schedule Operational Report

Posouzení zabezpečení databáze MySQL

Kontrola upgradu balíčku

Nejprve začneme bezpečnostními kontrolami. Aktualizace záplat MySQL pomůže snížit rizika spojená se známými zranitelnostmi serveru MySQL. Své prostředí můžete udržovat aktuální pomocí úložiště balíčků dodavatelů. Na základě těchto informací můžete vytvářet své vlastní sestavy nebo používat nástroje jako ClusterControl k ověření vašeho prostředí a upozornění na možné aktualizace.

ClusterControl Upgrade Report shromažďuje informace z operačního systému a porovnává je s balíčky dostupnými v úložišti. Zpráva je rozdělena do čtyř částí; souhrn upgradu, databázové balíčky, bezpečnostní balíčky a další balíčky. Můžete rychle porovnat, co máte na svém systému nainstalované, a najít doporučený upgrade nebo opravu.

ClusterControl:Zpráva o upgradu ClusterControl:Podrobnosti zprávy o upgradu

Chcete-li je porovnat ručně, můžete spustit

SHOW VARIABLES WHERE variable_name LIKE "version";

S bezpečnostními bulletiny, jako jsou:
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

Nebo úložiště dodavatelů:

V Debianu

sudo apt list mysql-server

Na RHEL/Centos

yum list | grep -i mariadb-server

Účty bez hesla

Prázdná hesla umožňují uživateli přihlásit se bez použití hesla. MySQL bývalo dodáváno se sadou předem vytvořených uživatelů, z nichž někteří se mohou připojit k databázi bez hesla, nebo ještě hůř, anonymní uživatelé. Naštěstí se to v MySQL 5.7 změnilo. Nakonec přichází pouze s účtem root, který používá heslo, které si zvolíte při instalaci.

Pro každý řádek vrácený z procedury auditu nastavte heslo:

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

Navíc si můžete nainstalovat plugin pro ověření hesla a implementovat bezpečnější zásady:

INSTALL PLUGIN validate_password SONAME 'validate_password.so';

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

Dobrým začátkem může být:

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

Tato nastavení budou samozřejmě záviset na vašich obchodních potřebách.

Sledování vzdáleného přístupu

Vyvarování se použití zástupných znaků v názvech hostitelů pomáhá řídit konkrétní umístění, ze kterých se daný uživatel může připojit k databázi a pracovat s ní.

Měli byste se ujistit, že každý uživatel se může připojit k MySQL pouze z konkrétních hostitelů. Vždy můžete definovat několik položek pro stejného uživatele, což by mělo pomoci snížit potřebu zástupných znaků.

Chcete-li posoudit toto doporučení, proveďte následující příkaz SQL (ujistěte se, že nejsou vráceny žádné řádky):

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

Testovací databáze

Výchozí instalace MySQL je dodávána s nepoužívanou databází nazvanou test a testovací databáze je dostupná každému uživateli, zejména anonymním uživatelům. Takoví uživatelé mohou vytvářet tabulky a zapisovat do nich. To se může potenciálně stát problémem samo o sobě – a zápisy by zvýšily režii a snížily výkon databáze. Doporučuje se zahodit testovací databázi. Chcete-li zjistit, zda je testovací databáze přítomna, spusťte:

SHOW DATABASES LIKE 'test';

Pokud si všimnete, že je přítomna testovací databáze, může to být tím, že skript mysql_secure_installation, který zruší testovací databázi (stejně jako další aktivity související se zabezpečením), nebyl spuštěn.

NAČTENÍ VSTUPNÍHO SOUBORU DAT

Pokud má server i klient možnost spustit LOAD DATA LOCAL INFILE, klient bude moci načíst data z místního souboru na vzdálený server MySQL. Parametr local_infile určuje, zda lze soubory umístěné na počítači klienta MySQL načíst nebo vybrat pomocí LOAD DATA INFILE nebo SELECT local_file.

To může potenciálně pomoci číst soubory, ke kterým má klient přístup – například na aplikačním serveru lze přistupovat k jakýmkoli datům, ke kterým má HTTP server přístup. Abyste tomu zabránili, musíte v my.cnf nastavit local-infile=0.

Proveďte následující příkaz SQL a ujistěte se, že je pole Hodnota nastaveno na OFF:

SHOW VARIABLES WHERE Variable_name = 'local_infile';

Monitorování nešifrovaných tabulkových prostorů

Počínaje MySQL 5.7.11 podporuje InnoDB šifrování dat pro tabulky uložené v tabulkových prostorech typu soubor na tabulku. Tato funkce poskytuje šifrování v klidu pro fyzické datové soubory tabulkového prostoru. Chcete-li zkontrolovat, zda byly vaše tabulky zašifrovány, spusťte:

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" |
+--------------+------------+----------------+

Jako součást šifrování byste měli zvážit také šifrování binárního protokolu. Server MySQL zapisuje spoustu informací do binárních protokolů.

Ověření šifrovaného připojení

V některých nastaveních by databáze neměla být přístupná přes síť, pokud je každé připojení spravováno lokálně přes Unixový soket. V takových případech můžete do my.cnf přidat proměnnou ‚skip-networking‘. Skip-networking brání MySQL v použití jakéhokoli TCP/IP připojení a na Linuxu by byl možný pouze Unix socket.

To je však spíše vzácná situace, protože je běžné přistupovat k MySQL přes síť. Poté musíte sledovat, zda jsou vaše připojení šifrována. MySQL podporuje SSL jako prostředek k šifrování provozu jak mezi servery MySQL (replikace), tak mezi servery MySQL a klienty. Pokud používáte cluster Galera, jsou k dispozici podobné funkce – jak komunikaci uvnitř clusteru, tak spojení s klienty lze šifrovat pomocí SSL. Chcete-li zkontrolovat, zda používáte šifrování SSL, spusťte následující dotazy:

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

To je pro tuto chvíli vše. Toto není úplný seznam, dejte nám vědět, pokud dnes ve svých produkčních databázích provádíte nějaké další kontroly.


  1. jak odstranit duplicitní řádky z tabulky v mysql

  2. Výkon SQL Serveru TOP IO Query -1

  3. SQL příkaz není správně ukončen?

  4. Úvod do SQL Serveru