Сигурността на данните е от решаващо значение за всяка организация. Това е важен аспект, който може силно да повлияе на дизайна на средата на базата данни. Когато решавате кой MySQL вкус да използвате, трябва да вземете предвид функциите за сигурност, налични от различните доставчици на сървъри. В тази публикация в блога ще направим кратко сравнение на най-новите версии на MySQL Community Edition от Oracle, Percona Server и 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)
Ще използваме Centos 7 като операционна система - моля, имайте предвид, че резултатите, които представяме тук, може да са малко по-различни в други дистрибуции като Debian или Ubuntu. Бихме искали също да се съсредоточим върху разликите и няма да покриваме общите черти - Percona Server и MariaDB са разновидности на MySQL, така че някои от функциите за сигурност (например как изглеждат привилегиите за достъп до MySQL файлове) са споделени между тях.
Първоначална сигурност
Потребители
И Percona Server, и MySQL Community Server идват с произволно генерирана временна парола за root потребител. Трябва да проверите съдържанието на дневника за грешки на MySQL, за да го намерите:
2018-01-19T13:47:45.532148Z 1 [Note] A temporary password is generated for [email protected]: palwJu7uSL,g
След като влезете, ви се налага промяна на паролата:
[[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.
Паролата трябва да е достатъчно силна, това се налага от приставката 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 не генерира произволна root парола и осигурява достъп без парола до root акаунта от (и само от) 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)
Това не е голям проблем по време на първоначалната фаза на внедряване, тъй като DBA трябва да конфигурира и осигури достъп до базата данни по-късно (като стартира mysql_secure_installation например). По-големият проблем тук е, че една добра практика не се прилага от MariaDB. Ако не е нужно да настройвате силна парола за root потребител, може да се окаже, че никой не я променя по-късно и достъпът без парола ще остане. Тогава това ще се превърне в сериозна заплаха за сигурността.
Друг аспект, който бихме искали да разгледаме, е анонимен достъп без парола. Анонимните потребители позволяват на всеки да влезе, не е задължително да е предварително дефиниран потребител. Ако такъв достъп е без парола, това означава, че всеки може да се свърже с MySQL. Обикновено такъв акаунт има само привилегия USAGE, но дори и тогава е възможно да се отпечата състояние ('\s'), което съдържа информация като версия на MySQL, набор от знаци и т.н. Освен това, ако е налична схема за тестване, такъв потребител има възможността да напишете в тази схема.
Както MySQL Community Server, така и сървърът Percona нямат анонимни потребители, дефинирани в MySQL:
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)
От друга страна, MariaDB е отворена за анонимен достъп без парола.
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)
В допълнение към това е налична „тестовата“ схема – която позволява на анонимни потребители да издават записи в базата данни.
[[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)
Това представлява сериозна заплаха и трябва да бъде коригирано. В противен случай може лесно да се използва, за да се опита да претовари сървъра с записи.
Данни в сигурността на транзита
MySQL Community Server и двата му разклонения поддържат използването на SSL за криптиране на данни при пренос. Това е изключително важно за широкообхватни мрежи, но също така не трябва да се пренебрегва в локална мрежа. SSL може да се използва както от страна на клиента, така и от страна на сървъра. По отношение на конфигурацията от страна на сървъра (за криптиране на трафика от главен към подчинени, например), тя изглежда идентична навсякъде. Има разлика обаче, когато става въпрос за SSL криптиране от страна на клиента, въведено в MySQL 5.7. Преди 5.7 човек трябваше да генерира SSL ключове и CA и да ги дефинира в конфигурациите както на сървъра, така и на клиента. Ето как изглежда настройката на MariaDB 10.2 SSL. И в MySQL Community Server 5.7, и в Percona Server 5.7 (който е базиран на MySQL 5.7), няма нужда от предварително генериране на ключове. Всичко става автоматично, на заден план. Всичко, което трябва да направите, е да активирате SSL на вашия клиент, като зададете правилния „--ssl-mode“. За CLI клиента на MySQL това дори не е необходимо, тъй като активира 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
--------------
От друга страна MariaDB ще изисква допълнителна конфигурация, тъй като SSL е деактивиран по подразбиране:
[[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
--------------
Шифроване на данни в покой
На първо място, архивиране - има свободно достъпни инструменти за архивиране като xtrabackup или MariaDB Backup (което е разклонение на xtrabackup). Те позволяват да се създават криптирани архиви и на трите MySQL варианта, които обсъждаме в тази публикация в блога.
И трите варианта поддържат криптиране на работещата база данни, но има разлики в това кои части от данни са криптирани.
MySQL Community Server поддържа криптиране само на пространства за таблици InnoDB. Ключовете, използвани за криптиране, се съхраняват във файлове (което не е в съответствие с разпоредбите - ключовете трябва да се съхраняват в хранилище - нещо, което MySQL Enterprise поддържа). Percona Server е базиран на MySQL Community Server, така че поддържа и криптиране на пространства за таблици InnoDB. Наскоро в Percona Server 5.7.20 беше добавена поддръжка за криптиране на общи пространства за таблици (в сравнение само с отделни в предишни версии и MySQL Community Edition). Добавена е и поддръжка за криптиране на двоични регистрационни файлове. Percona Server се предлага с плъгин keyring_vault, който може да се използва за съхраняване на ключове в сървъра на Hashicorp Vault, което прави Percona Server 5.7.20 съвместим с регулаторните изисквания по отношение на криптирането на данни в покой.
MariaDB 10.2 има по-усъвършенствана поддръжка за криптиране на данни в покой. В допълнение към пространството за таблици и криптирането на двоични/релейни регистрационни файлове, той има поддръжка за криптиране на InnoDB регистрационни файлове за повторно изпълнение. В момента това е по-пълното решение по отношение на криптирането на данни.
Регистриране на одит
И трите MySQL вкуса имат поддръжка за регистриране на одит. Техният обхват е почти сравним:събития за свързване и прекъсване, изпълнени заявки, достъп до таблици. Регистраторите съдържат информация за това кой потребител е участвал в такова събитие, от кой хост е влязъл потребителят, времето, когато се е случило и подобна информация. Такива събития могат също да бъдат регистрирани чрез syslog и да се съхраняват на външен лог сървър, за да се даде възможност за анализ и анализ на регистрационни файлове.
Маскиране на данни, SQL защитна стена
Всички обсъждани аромати на MySQL работят с някакъв вид инструмент, който би позволил внедряване на маскиране на данни и би могъл да блокира SQL трафика въз основа на някои правила. Маскирането на данни е метод за обфускиране на някои данни извън базата данни, но преди да достигнат до клиента. Пример биха били данните за кредитна карта, които се съхраняват в обикновен текст в базата данни, но когато разработчикът иска да потърси такива данни, тя ще види „xxxxxxxx...“ вместо числа. Инструментите, за които говорим тук, са ProxySQL и MaxScale. MaxScale е продукт на MariaDB Corporation и се базира на абонамент. ProxySQL е безплатен за използване прокси за база данни. И двата прокси сървъра могат да се използват с всеки от вариантите на MySQL.
Това е всичко за днес хора. За допълнително четене вижте тези 10 съвета за защита на вашите MySQL и MariaDB бази данни.