(продолжение, начало читать здесь)
Проверяем наличие у всех 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”.