Как настроить безопасность сервера MySQL (часть 2)

(продолжение, начало читать здесь)
Проверяем наличие у всех MySQL-пользователей пароля и хоста
Для обеспечения безопасности, для всех пользователей сервера MySQL должен быть прописан пароль и хост.
Выполним проверку на нашем сервере на предмет отсутствия таковых – возможно, какие-то пользователи изначально были созданы командой вроде CREATE USER ‘anon_user’, без указания этих важных параметро.
(Внимание – до версии MySQL 5.7.6 вместо поля authentication_string в запросах к mysql.user нужно указывать прежнее его название – Password)
mysql> SELECT User,Host, authentication_string FROM mysql.user; +------------------+-----------+-------------------------------------------+ | User             | Host      | authentication_string                     | +------------------+-----------+-------------------------------------------+ | root             | localhost | *81E8EE564592BF5A5525E63502C490A5232041F5 | | mysql.sys        | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | debian-sys-maint | localhost | *81C8086E4D4705954274140B7DEF7CC50D8D3EA6 | | anon_user        | %         |                                           | +------------------+-----------+-------------------------------------------+ 4 rows in set (0,00 sec)Здесь очевидно, что MySQL-аккаунт пользователя anon_user не защищен.
Начнем с назначения пароля:mysql> ALTER USER 'anon_user' IDENTIFIED BY 'anonpass'; Query OK, 0 rows affected (0,02 sec)Следущий пункт – значение % поля Host говорит нам о том, что к данному серверу может подключаться пользователь с любого хоста (в т.ч. с любого компьютера в сети Интернет, например).
Запрещаем для anon_user коннекты отовсюду, кроме локального сервера:mysql> UPDATE mysql.user SET Host='localhost' WHERE User="anon_user"; Query OK, 1 row affected (0,01 sec) Rows matched: 1  Changed: 1  Warnings: 0Проверим текущее положение вещей после всех изменений:
mysql> SELECT User,Host, authentication_string FROM mysql.user; +------------------+-----------+-------------------------------------------+ | User             | Host      | authentication_string                     | +------------------+-----------+-------------------------------------------+ | root             | localhost | *81E8EE564592BF5A5525E63502C490A5232041F5 | | mysql.sys        | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | | debian-sys-maint | localhost | *81C8086E4D4705954274140B7DEF7CC50D8D3EA6 | | anon_user        | localhost | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 | +------------------+-----------+-------------------------------------------+ 4 rows in set (0,00 sec)Поскольку мы работали напрямую с таблицей mysql.user, неплохо бы по завершению обновить привилегии:
mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0,19 sec)Базы данных и права пользователей
Каждое приложение, которое использует MySQL должно иметь своего собственного пользователя, который будет имеет доступ к базам данных, необходимымих для запуска. И для примера, я создам новую базу данных:
Хорошим тоном в плане безопасности считается заводить как минимум одного пользователя для каждой БД MySQL на сервере.
Начнем с создания тестовой БД:mysql> create database anon_db; Query OK, 1 row affected (0,00 sec)Теперь создаем для нее ключевого пользователя с паролем my_pass:
mysql> CREATE USER 'user_anon_db'@'localhost' IDENTIFIED BY 'my_pass'; Query OK, 0 rows affected (0,00 sec)Даем права нашему пользователю user_anon_db на выборку, обновление и удаление данных из всех таблиц БД anon_db:
mysql> GRANT SELECT,UPDATE,DELETE ON anon_db.* TO 'user_anon_db'@'localhost'; Query OK, 0 rows affected (0,03 sec)Но вдруг мы поторопились разрешать пользователю удалять записи?
Исправим это!mysql> REVOKE DELETE ON anon_db.* FROM 'user_anon_db'@'localhost'; Query OK, 0 rows affected (0,00 sec)Ну и обновляем привилегии после всего:
mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0,19 sec)Проверяем итог:
mysql> show grants for 'user_anon_db'@'localhost'; +-------------------------------------------------------------------+ | Grants for [email protected]                                 | +-------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'user_anon_db'@'localhost'                  | | GRANT SELECT, UPDATE ON `anon_db`.* TO 'user_anon_db'@'localhost' | +-------------------------------------------------------------------+ 2 rows in set (0,00 sec)Как изменить пользователя root
Поскольку пользователь root “самый главный и может все”, очевидно, что для злоумышленников он становится объектом №1 для атаки.
Замаскируем нашего суперпользователя, сменив его имя:Один дополнительный шаг, который вы можете сделать, это изменить имя пользователя root. Если злоумышленник пытается получить доступ к пользователю root в MySQL, то они должны будут выполнять дополнительную стадию нахождения пользователя.
mysql> rename user 'root'@'localhost' to 'for_test'@'localhost'; Query OK, 0 rows affected (0,00 sec)Теперь важно не забыть, что следующий коннект к MySQL мы уже будем выполнять как
mysql -u for_test -pБезопасность конфигурационных файлов MySQL
На всякий случай, установим пользователя и группу для конфигурационных файлов MySQL в root
sudo chown -R root:root /etc/mysql/В дополнение установим права на чтение всем пользователям ОС сервера с MySQL, но записи – только владельцу (root-у):
sudo chmod 0644 /etc/mysql/my.cnfЗавершим настройку конфигурации установкой атрибута “неизменяемый”:
chattr +i /etc/my.cnfЧтобы освоить все рекомендации по безопасности сервера MySQL, лучшим решением будет пройти наши авторские курсы “L2-Security. Безопасность в Linux”, ну а тонкую настройку самого MySQL, как и других популярных СУБД – вы сможете изучить на курсе “L2-DB. Администрирование баз данных на Linux”.