Bezpečnost dat je v dnešní době nejvyšší prioritou. Někdy je to vynuceno externími předpisy, jako je PCI-DSS nebo HIPAA, někdy je to proto, že vám záleží na datech vašich zákazníků a vaší pověsti. Existuje mnoho aspektů zabezpečení, které musíte mít na paměti – přístup k síti, zabezpečení operačního systému, granty, šifrování a tak dále. V tomto příspěvku na blogu vám dáme 10 tipů, na co se zaměřit při zabezpečení nastavení MySQL nebo MariaDB.
1. Odebrat uživatele bez hesla
MySQL bývala dodávána se sadou předem vytvořených uživatelů, z nichž někteří se mohou k databázi připojit bez hesla, nebo v horším případě anonymní uživatelé. To se změnilo v MySQL 5.7, která je standardně dodávána pouze s účtem root, který používá heslo, které si zvolíte při instalaci. Přesto existují instalace MySQL, které byly upgradovány z předchozích verzí a tyto instalace udržují starší uživatele. MariaDB 10.2 na Centos 7 také přichází s anonymními uživateli:
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)
Jak můžete vidět, ty jsou omezeny pouze na přístup z localhost, ale bez ohledu na to nechcete mít takové uživatele. I když jsou jejich oprávnění omezená, stále mohou spouštět některé příkazy, které mohou zobrazit více informací o databázi – například verze může pomoci identifikovat další vektory útoku.
[[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
--------------
Upozorňujeme, že uživatelé s velmi jednoduchými hesly jsou téměř stejně nezabezpečení jako uživatelé bez hesla. Hesla jako „password“ nebo „qwerty“ nejsou opravdu užitečná.
2. Těsný vzdálený přístup
Předně vzdálený přístup pro superuživatele – o ten je standardně postaráno při instalaci nejnovější MySQL (5.7) nebo MariaDB (10.2) – dostupný je pouze lokální přístup. Přesto je docela běžné vidět, že superuživatelé jsou k dispozici z různých důvodů. Nejběžnější, pravděpodobně proto, že databázi spravují lidé, kteří si chtějí usnadnit práci, a tak by do svých databází přidali vzdálený přístup. Toto není dobrý přístup, protože vzdálený přístup usnadňuje využití potenciálních (nebo ověřených) bezpečnostních zranitelností v MySQL – nemusíte se nejprve připojit k hostiteli.
Další krok - ujistěte se, ž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 záznamů pro stejného uživatele ([email protected], [email protected]), což by mělo pomoci snížit potřebu zástupných znaků ([email protected]’%’).
3. Odebrat testovací databázi
Testovací databáze je standardně dostupná všem uživatelům, 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ě – jakékoli zápisy by zvýšily režii a snížily výkon databáze. V současné době, po výchozí instalaci, je tímto ovlivněna pouze MariaDB 10.2 na Centos 7 - Oracle MySQL 5.7 a Percona Server 5.7 nemají k dispozici „testovací“ schéma.
[[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)
Samozřejmě se stále může stát, že vaše MySQL 5.7 byla upgradována z předchozích verzí, ve kterých nebylo „testovací“ schéma odstraněno – měli byste se o to postarat a zkontrolovat, zda je máte vytvořené.
4. Zamotat přístup k MySQL
Je dobře známo, že MySQL běží na portu 3306 a jeho superuživatel se nazývá „root“. Aby to bylo složitější, je docela jednoduché to změnit. Do určité míry je to příklad zabezpečení prostřednictvím nejasností, ale může to alespoň zastavit automatizované pokusy o získání přístupu k uživateli „root“. Chcete-li změnit port, musíte upravit soubor my.cnf a nastavit proměnnou ‚port‘ na jinou hodnotu. Pokud jde o uživatele – po instalaci MySQL byste měli vytvořit nového superuživatele (GRANT ALL … WITH GRANT OPTION) a poté odstranit stávající účty „[email protected]“.
5. Zabezpečení sítě
V ideálním případě by MySQL nebylo dostupné přes síť a všechna připojení by byla řešena lokálně přes Unixový socket. V některých nastaveních je to možné – v takovém případě můžete do my.cnf přidat proměnnou ‚skip-networking‘. To zabrání MySQL v používání jakékoli TCP/IP komunikace, na Linuxu by byl k dispozici pouze Unix socket (pojmenované kanály a sdílená paměť na hostitelích Windows).
Většinou však takové přísné zabezpečení není možné. V takovém případě musíte najít jiné řešení. Za prvé, můžete použít svůj firewall k povolení provozu pouze z konkrétních hostitelů na server MySQL. Například hostitelé aplikací (ačkoli by měli být v pořádku s přístupem k MySQL přes proxy), vrstva proxy a možná server pro správu. Ostatní hostitelé ve vaší síti pravděpodobně nepotřebují přímý přístup k serveru MySQL. To omezí možnosti útoku na vaši databázi v případě, že by byli ohroženi někteří hostitelé ve vaší síti.
Pokud náhodou používáte proxy, které umožňují shodu regulárních výrazů pro dotazy, můžete je použít k analýze provozu SQL a blokování podezřelých dotazů. S největší pravděpodobností by hostitelé vaší aplikace neměli spouštět „DELETE * FROM your_table;“ v pravidelných intervalech. Pokud je potřeba odstranit některá data, lze to provést ručně, lokálně, na instanci MySQL. Taková pravidla můžete vytvořit pomocí něčeho jako ProxySQL:blokovat, přepisovat, přesměrovávat takové dotazy. MaxScale vám také dává možnost blokovat dotazy založené na regulárních výrazech.
6. Auditovací moduly
Pokud máte zájem sbírat data o tom, kdo co a kdy provedl, pro MySQL je k dispozici několik auditovacích pluginů. Pokud používáte MySQL Enterprise, můžete použít MySQL Enterprise Audit, což je rozšíření MySQL Enterprise. Percona a MariaDB mají také svou vlastní verzi auditovacích pluginů. A konečně, plugin McAfee pro MySQL lze také použít s různými verzemi MySQL. Obecně řečeno, tyto pluginy shromažďují víceméně stejná data – události připojení a odpojení, provedené dotazy, zpřístupněné tabulky. To vše obsahuje informace o tom, který uživatel se takové události zúčastnil, z jakého hostitele se přihlásil, kdy se to stalo a podobně. Výstup může být XML nebo JSON, takže je mnohem snazší jej analyzovat než analyzovat obsah obecného protokolu (i když jsou data dosti podobná). Takový výstup lze také odeslat do syslogu a dále do nějakého log serveru pro zpracování a analýzu.
7. Zakázat NAČÍTÁNÍ DAT LOCAL INFILE
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. To může potenciálně pomoci při čtení souborů, ke kterým má klient přístup – například na aplikačním serveru lze přistupovat k libovolnému souboru, ke kterému má přístup HTTP server. Chcete-li se tomu vyhnout, musíte v souboru my.cnf
nastavit local-infile=08. Oprávnění souborů
Musíte mít na paměti, že zabezpečení MySQL závisí také na nastavení operačního systému. MySQL ukládá data ve formě souborů. Server MySQL zapisuje spoustu informací do protokolů. Někdy tyto informace obsahují data – například pomalý protokol dotazů, obecný protokol nebo binární protokol. Musíte se ujistit, že tyto informace jsou bezpečné a přístupné pouze uživatelům, kteří k nim mají přístup. Obvykle to znamená, že pouze root a uživatel, pod jehož právy MySQL běží, by měli mít přístup ke všem souborům souvisejícím s MySQL. Většinu času je to vyhrazený uživatel s názvem „mysql“. Měli byste zkontrolovat konfigurační soubory MySQL a všechny protokoly generované MySQL a ověřit, že nejsou čitelné pro ostatní uživatele.
9. SSL a šifrování dat při přenosu
Zabránit lidem v přístupu ke konfiguračním a protokolovým souborům je jedna věc. Dalším problémem je zajistit bezpečný přenos dat po síti. S výjimkou nastavení, kde jsou všichni klienti lokální a pro přístup k MySQL používají Unix socket, ve většině případů data, která tvoří sadu výsledků pro dotaz, opouštějí server a jsou přenášena ke klientovi přes síť. Data lze také přenášet mezi servery MySQL, například prostřednictvím standardní replikace MySQL nebo v rámci clusteru Galera. Síťový provoz lze snímat a prostřednictvím těchto prostředků by byla vaše data vystavena.
Aby se tomu zabránilo, je možné použít SSL k šifrování provozu na straně serveru i klienta. Můžete vytvořit připojení SSL mezi klientem a serverem MySQL. Můžete také vytvořit připojení SSL mezi vaším hlavním a podřízenými zařízeními nebo mezi uzly clusteru Galera. Tím zajistíte, že všechna přenášená data budou v bezpečí a nebude moci být vyčmuchána útočníkem, který získal přístup do vaší sítě.
Dokumentace MySQL podrobně popisuje, jak nastavit šifrování SSL. Pokud se vám to zdá příliš těžkopádné, ClusterControl vám může pomoci nasadit zabezpečené prostředí pro replikaci MySQL nebo cluster Galera několika kliknutími:
10. Šifrování dat v klidu
Zabezpečení dat při přenosu pomocí šifrování SSL problém řeší jen částečně. Je potřeba se starat i o data v klidu - všechna data, která jsou uložena v databázi. Šifrování dat v klidu může být také požadavkem pro bezpečnostní předpisy, jako je HIPAA nebo PCI DSS. Takové šifrování lze implementovat na více úrovních – šifrovat můžete celý disk, na kterém jsou soubory uloženy. Pomocí funkcí dostupných v nejnovějších verzích MySQL nebo MariaDB můžete šifrovat pouze databázi MySQL. V aplikaci lze také implementovat šifrování, takže data před uložením do databáze zašifruje. Každá možnost má své pro a proti:šifrování disku může pomoci pouze v případě fyzické krádeže disků, ale soubory by na běžícím databázovém serveru nebyly zašifrovány. Šifrování databáze MySQL tento problém řeší, ale nemůže zabránit přístupu k datům, když je kompromitován root účet. Šifrování na aplikační úrovni je nejflexibilnější a nejbezpečnější, ale pak ztrácíte sílu SQL – je docela těžké používat šifrované sloupce v klauzulích WHERE nebo JOIN.
Všechny varianty MySQL poskytují nějaký druh šifrování dat v klidu. Oracle MySQL používá Transparent Data Encryption k šifrování tabulkových prostorů InnoDB. To je k dispozici v komerční nabídce MySQL Enterprise. Poskytuje možnost šifrovat tabulkové prostory InnoDB, jiné soubory, které také ukládají data v nějaké formě (například binární protokoly, obecný protokol, protokol pomalých dotazů) nejsou šifrovány. To umožňuje, aby toolchain (MySQL Enterprise Backup, ale také xtrabackup, mysqldump, mysqlbinlog) s takovým nastavením správně fungoval.
Počínaje MySQL 5.7.11 získala komunitní verze MySQL také podporu pro šifrování tabulkového prostoru InnoDB. Hlavním rozdílem oproti podnikové nabídce je způsob uložení klíčů – klíče nejsou umístěny v zabezpečeném trezoru, což je vyžadováno pro dodržování předpisů. To znamená, že počínaje Percona Server 5.7.11 je také možné šifrovat tabulkový prostor InnoDB. V nedávno publikovaném Percona Server 5.7.20 byla přidána podpora pro šifrování binárních protokolů. Je také možné integrovat se serverem Hashicorp Vault prostřednictvím pluginu keyring_vault, který odpovídá (a dokonce rozšiřuje – šifrování binárního protokolu) funkcím dostupným v edici Oracle MySQL Enterprise.
MariaDB přidala podporu pro šifrování dat v 10.1.3 – jde o samostatnou, vylepšenou implementaci. Dává vám možnost nejen šifrovat tabulkové prostory InnoDB, ale také soubory protokolu InnoDB. V důsledku toho jsou data bezpečnější, ale některé nástroje nebudou v takové konfiguraci fungovat. Xtrabackup nebude fungovat se zašifrovanými redo logy – MariaDB vytvořila fork, MariaDB Backup, který přidává podporu pro šifrování MariaDB. Existují také problémy s mysqlbinlog.
Bez ohledu na to, jakou variantu MySQL používáte, pokud se jedná o nejnovější verzi, budete mít možnost implementovat šifrování dat v klidu prostřednictvím databázového serveru, abyste se ujistili, že jsou vaše data navíc zabezpečena.
Zabezpečení MySQL nebo MariaDB není triviální, ale doufáme, že vám těchto 10 tipů pomůže.
Shrnutí
V dnešním prostředí je bezpečnost dat nejvyšší prioritou každého správce databáze. Ať už je vaší motivací dodržování regulačních požadavků nebo ochrana vašich zákazníků a reputace vaší firmy, těchto deset tipů pro zabezpečení databází MySQL a MariaDB vám pomůže dále zabezpečit infrastrukturu a poskytne vám klid.
Při zajišťování bezpečnosti databázové infrastruktury je třeba zvážit řadu opatření. V tomto příspěvku jsme se zabývali základy, jako je šifrování dat, řízení přístupu k síti, ověřování a oprávnění uživatele, zabezpečení operačního systému a další.
Software pro automatizaci správy databází, jako je ClusterControl, může být skvělým nástrojem, který vám pomůže při celkovém úsilí o zabezpečení databáze. Pokud se chcete hlouběji ponořit do každého kroku, který musíte udělat, abyste zabezpečili své databáze MySQL, nezapomeňte se podívat na část 1 a část 2 našeho seriálu Jak zabezpečit MySQL. Chcete-li zůstat informováni o dalších osvědčených postupech správy databází, sledujte nás na Twitteru, LinkedIn a přihlaste se k odběru novinek.