Bezpečnost dat je pro každou organizaci zásadní. Je to důležitý aspekt, který může výrazně ovlivnit návrh databázového prostředí. Při rozhodování, jakou variantu MySQL použít, musíte vzít v úvahu bezpečnostní funkce dostupné od různých prodejců serverů. V tomto příspěvku na blogu přinášíme krátké srovnání nejnovějších verzí MySQL Community Edition od společností Oracle, Percona Server a MariaDB:
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)
Jako operační systém budeme používat Centos 7 – mějte prosím na paměti, že výsledky, které zde uvádíme, se mohou na jiných distribucích, jako je Debian nebo Ubuntu, mírně lišit. Rádi bychom se také zaměřili na rozdíly a nebudeme se zabývat společnými rysy – Percona Server a MariaDB jsou varianty MySQL, takže některé funkce zabezpečení (např. jak vypadají přístupová oprávnění k souborům MySQL) jsou sdíleny mezi nimi.
Počáteční zabezpečení
Uživatelé
Percona Server i MySQL Community Server jsou dodávány s náhodně vygenerovaným dočasným heslem pro uživatele root. Chcete-li jej najít, musíte zkontrolovat obsah protokolu chyb MySQL:
2018-01-19T13:47:45.532148Z 1 [Note] A temporary password is generated for [email protected]: palwJu7uSL,g
Jakmile se přihlásíte, budete nuceni změnit heslo:
[[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.
Heslo musí být dostatečně silné, to je vynuceno pluginem validate_password:
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 negeneruje náhodné heslo root a poskytuje přístup bez hesla k účtu root z (a pouze z) 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)
Toto není velký problém během počáteční fáze nasazení, protože správce databází by měl později nakonfigurovat a zabezpečit přístup k databázi (například spuštěním mysql_secure_installation). Větším problémem je, že MariaDB neprosazuje dobrou praxi. Pokud nemusíte nastavit silné heslo pro uživatele root, může se stát, že jej později nikdo nezmění a zůstane zachován přístup bez hesla. Pak by se to stalo vážnou bezpečnostní hrozbou.
Dalším aspektem, na který bychom se rádi podívali, je anonymní přístup bez hesla. Anonymní uživatelé umožňují přístup komukoli, nemusí to být předem definovaný uživatel. Pokud je takový přístup bez hesla, znamená to, že se k MySQL může připojit kdokoli. Obvykle má takový účet pouze oprávnění USAGE, ale i poté je možné vytisknout stav („\s“), který obsahuje informace, jako je verze MySQL, znaková sada atd. Navíc, pokud je k dispozici schéma „test“, má takový uživatel možnost napište do tohoto schématu.
Jak MySQL Community Server, tak server Percona nemají v MySQL definovány žádné anonymní uživatele:
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)
Na druhou stranu je MariaDB otevřena pro anonymní přístup bez hesla.
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)
Kromě toho je k dispozici „testovací“ schéma – které umožňuje anonymním uživatelům zapisovat do databáze.
[[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)
To představuje vážnou hrozbu a je třeba ji vyřešit. V opačném případě jej lze snadno zneužít k pokusu o přetížení serveru zápisy.
Data v zabezpečení tranzitu
MySQL Community Server a obě jeho větve podporují použití SSL k šifrování dat při přenosu. To je extrémně důležité pro Wide Area Networks, ale také by to nemělo být přehlíženo v místní síti. SSL lze použít na straně klienta i serveru. Pokud jde o konfiguraci na straně serveru (například pro šifrování provozu z masteru na slave), vypadá vesměs stejně. Existuje však rozdíl, pokud jde o šifrování SSL na straně klienta, které bylo zavedeno v MySQL 5.7. Před verzí 5.7 bylo nutné vygenerovat klíče SSL a CA a definovat je v konfiguracích serveru i klienta. Takto vypadá nastavení MariaDB 10.2 SSL. Jak v MySQL Community Server 5.7, tak v Percona Server 5.7 (který je založen na MySQL 5.7), není potřeba předem generovat klíče. Vše se děje automaticky, na pozadí. Vše, co musíte udělat, je povolit SSL na vašem klientovi nastavením správného „--ssl-mode“. U klienta CLI MySQL to ani není potřeba, protože standardně povoluje SSL:
[[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
--------------
Na druhou stranu MariaDB by vyžadovala další konfiguraci, protože SSL je ve výchozím nastavení zakázáno:
[[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
--------------
Šifrování dat v klidu
Za prvé, zálohy – existují volně dostupné nástroje pro zálohování jako xtrabackup nebo MariaDB Backup (což je fork xtrabackup). Ty umožňují vytvářet šifrované zálohy všech tří variant MySQL, o kterých diskutujeme v tomto příspěvku na blogu.
Všechny tři varianty podporují šifrování běžící databáze, ale existují rozdíly v tom, jaké části dat jsou šifrovány.
Komunitní server MySQL podporuje šifrování pouze tabulkových prostorů InnoDB. Klíče používané pro šifrování jsou uloženy v souborech (což není v souladu s předpisy - klíče by měly být uloženy v trezoru - něco, co MySQL Enterprise podporuje). Percona Server je založen na MySQL Community Server, takže podporuje také šifrování tabulkových prostorů InnoDB. Nedávno byla v Percona Server 5.7.20 přidána podpora pro šifrování obecných tabulkových prostorů (ve srovnání s pouze jednotlivými v předchozích verzích a MySQL Community Edition). Byla také přidána podpora pro šifrování binárních protokolů. Percona Server je dodáván s pluginem keyring_vault, který lze použít k ukládání klíčů na serveru Hashicorp Vault, díky čemuž Percona Server 5.7.20 vyhovuje regulačním požadavkům týkajícím se šifrování dat v klidu.
MariaDB 10.2 má pokročilejší podporu šifrování dat v klidu. Kromě tabulkového prostoru a šifrování binárních/reléových protokolů má podporu pro šifrování opakovaných protokolů InnoDB. V současné době je to úplnější řešení týkající se šifrování dat.
Protokolování auditu
Všechny tři varianty MySQL mají podporu pro protokolování auditu. Jejich rozsah je do značné míry srovnatelný:události připojení a odpojení, provedené dotazy, zpřístupněné tabulky. Protokoly obsahují informace o tom, který uživatel se takové události zúčastnil, z jakého hostitele se uživatel přihlásil, kdy se to stalo a podobné informace. Takové události lze také zaznamenávat prostřednictvím syslog a ukládat na externí protokolový server, aby byla umožněna analýza a parsování protokolů.
Maskování dat, SQL Firewall
Všechny diskutované varianty MySQL pracují s nějakým druhem nástroje, který by umožnil implementaci maskování dat a byl by schopen blokovat provoz SQL na základě určitých pravidel. Maskování dat je metoda zamlžování některých dat mimo databázi, ale předtím, než se dostanou ke klientovi. Příkladem mohou být údaje o kreditní kartě, které jsou v databázi uloženy jako prostý text, ale když se vývojář chce na taková data dotazovat, místo čísel uvidí „xxxxxxxx...“. Nástroje, o kterých zde mluvíme, jsou ProxySQL a MaxScale. MaxScale je produkt společnosti MariaDB Corporation a je založen na předplatném. ProxySQL je bezplatný databázový proxy server. Oba servery proxy lze použít s jakoukoli variantou MySQL.
To je pro dnešek vše, lidi. Pro další čtení se podívejte na těchto 10 tipů pro zabezpečení databází MySQL a MariaDB.