Как настроить безопасность сервера 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 user_anon_db@localhost                                 |

+-------------------------------------------------------------------+

| 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”.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *