Site icon 8HOST.COM

Защита MySQL и MariaDB на сервере Linux

В Linux- и Unix-подобных операционных системах существует множество реализаций языка SQL, среди которых и популярные реляционные базы данных MySQL и MariaDB.

Однако, как и большинство программ, при неправильной настройке эти инструменты могут представлять угрозу для безопасности системы. Это руководство поможет защитить базы данных MySQL или MariaDB и вместе с тем обеспечить защиту всему VPS.

Для простоты работы в руководстве используется MySQL на сервере Ubuntu 12.04; однако перечисленные здесь техники подойдут и для MariaDB и других дистрибутивов Linux.

Начальная настройка

MySQL позволяет выполнить начальную настройку безопасности ещё во время установки. Во-первых, СУБД предлагает установить root-пароль.

sudo apt-get install mysql-server
?????????????????????????? Configuring mysql-server-5.5 ???????????????????????????
? While not mandatory, it is highly recommended that you set a password for the   ?
? MySQL administrative "root" user.                                               ?
?                                                                                 ?
? If this field is left blank, the password will not be changed.                  ?
?                                                                                 ?
? New password for the MySQL "root" user:                                         ?
?                                                                                 ?
? _______________________________________________________________________________ ?
?                                                                                 ?
?                                                                                 ?
???????????????????????????????????????????????????????????????????????????????????

В целом root-пароль можно всегда установить позже, но лучше это сделать сразу, чтобы с самого начала защитить аккаунт администратора.

После завершения установки нужно запустить несколько скриптов. Для создания структуры каталогов для баз данных используется скрипт mysql_install_db:

sudo mysql_install_db

Затем запустите скрипт mysql_secure_installation, который удалит некоторые потенциально опасные для производства настройки по умолчанию.

sudo mysql_secure_installation

Сначала этот скрипт запросит root-пароль, затем предложит изменить его (в случае необходимости установите более надёжный пароль).

Сразу после этого он задаст ряд вопросов; рекомендуется ответить на все эти вопросы Y.

Это блокирует доступ к MySQL по умолчанию и удаленные подключения администратора, удаляет некоторые небезопасные тестовые базы данных и обновляет настройки MySQL.

Оценка безопасности

Главное правило безопасности MySQL (и почти любой другой системы): доступ следует предоставлять только в случае крайней необходимости. Говоря о защите данных, часто приходится выбирать между удобством и безопасностью.

Примечание: В этом руководстве выбор сделан в пользу безопасности; ваш выбор может отличаться в зависимости от требований и целей сервера.

Файл my.cnf

Главный конфигурационный файл MySQL называется my.cnf и хранится в каталоге /etc/mysql/ в системе Ubuntu или в каталоге /etc/ в некоторых других системах.

Чтобы заблокировать доступ к MySQL, нужно изменить некоторые настройки в этом файле.

Откройте файл с правами root. Измените путь к каталогу, если вы выполняете руководство на другом дистрибутиве Linux.

sudo nano /etc/mysql/my.cnf

Сначала нужно проверить настройку bind-address в разделе [mysqld]; эта настройка должна указывать на локальный сетевой loopback-интерфейс, 127.0.0.1.

bind-address = 127.0.0.1

Эта настройка блокирует все подключения к MySQL, кроме подключений с локальной машины.

Если вам нужен доступ к этой базе данных с другой машины, используйте подключения SSH, которые позволяют отправлять запросы и управлять базой данных локально и передавать результаты через SSH-туннель.

Далее нужно отключить функцию, которая позволяет получить доступ к файловой системе из MySQL. Она может повлечь серьезные последствия для безопасности.

В этот же раздел файла нужно добавить директиву, которая отключит это поведение:

local-infile=0

Теперь MySQL не будет загружать локальные файлы для пользователей без соответствующего уровня доступа.

Если у вас достаточно пространства и вам не нужно обрабатывать большие объёмы данных, можно настроить логирование дополнительной информации, чтобы иметь возможность отслеживать подозрительную активность.

Внесение в лог слишком большого количества информации в логи может привести к снижению производительности, потому этот шаг нужно хорошо обдумать.

Переменную log можно добавить в тот же раздел [mysqld].

log=/var/log/mysql-logfile

Убедитесь, что лог MySQL, лог ошибок и каталог логов не доступен для чтения всем:

sudo ls -l /var/log/mysql*
-rw-r----- 1 mysql adm    0 Jul 23 18:06 /var/log/mysql.err
-rw-r----- 1 mysql adm    0 Jul 23 18:06 /var/log/mysql.log
/var/log/mysql:
total 28
-rw-rw---- 1 mysql adm 20694 Jul 23 19:17 error.log

Защита MySQL

Во время работы с MySQL можно также выполнить ряд действий для улучшения безопасности.

Для этого нужен интерфейс командной строки MySQL.

mysql -u root -p

Введите root-пароль MySQL.

Пароль и хост

Сначала нужно убедиться, что все пользователи, имеющие доступ к MySQL, защищены паролем и связаны с хостом.

SELECT User,Host,Password FROM mysql.user;
+------------------+-----------+-------------------------------------------+
| user             | host      | password                                  |
+------------------+-----------+-------------------------------------------+
| root             | localhost | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| demo-user        | %         |                                           |
| root             | 127.0.0.1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| root             | ::1       | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| debian-sys-maint | localhost | *ECE81E38F064E50419F3074004A8352B6A683390 |
+------------------+-----------+-------------------------------------------+
5 rows in set (0.00 sec)

Обратите внимание: в приведённом примере пользователь demo-user не имеет пароля и не привязан к хосту. Это серьёзный риск для безопасности.

Можно установить пароль для этого пользователя при помощи следующей команды (замените условные данные своими):

UPDATE mysql.user SET Password=PASSWORD('newPassWord') WHERE User="demo-user";

Теперь снова откройте таблицу пользователей; у demo-user появился пароль.

SELECT User,Host,Password FROM mysql.user;
+------------------+-----------+-------------------------------------------+
| user             | host      | password                                  |
+------------------+-----------+-------------------------------------------+
| root             | localhost | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| demo-user        | %         | *D8DECEC305209EEFEC43008E1D420E1AA06B19E0 |
| root             | 127.0.0.1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| root             | ::1       | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| debian-sys-maint | localhost | *ECE81E38F064E50419F3074004A8352B6A683390 |
+------------------+-----------+-------------------------------------------+
5 rows in set (0.00 sec)

Обратите внимание на поле Host: символ % значит, что этот пользователь не подключен к хосту. Подключите его к localhost:

UPDATE mysql.user SET Host='localhost' WHERE User="demo-user";

Снова откройте таблицу пользователей; как видите, теперь все поля заполнены должным образом.

На данный момент в mysql не должно быть неиспользуемых учётных записей (после запуска mysql_secure_installation). Однако если в таблице будут такие, их нужно удалить.

Для этого используйте команду:

DELETE FROM mysql.user WHERE User="";

Завершив работу с таблицей пользователей, введите следующую команду:

FLUSH PRIVILEGES;

Специализированные пользователи

Как и система Linux, MySQL запускает процессы как изолированных пользователей.

Каждое приложение, которое использует MySQL, должно иметь отдельную учётную запись пользователя  определённым уровнем доступа к данным.

При настройке приложений для использования MySQL нужно создавать БД для этого приложения:

create database testDB;
Query OK, 1 row affected (0.00 sec)

Затем нужно создать пользователя, который будет управлять этой БД, и передать ему необходимые права доступа. Уровень доступа зависит от приложения.

Чтобы создать пользователя, запустите команду:

CREATE USER 'demo-user'@'localhost' IDENTIFIED BY 'password';

Чтобы передать пользователю права доступа к БД, используйте следующую команду:

GRANT SELECT,UPDATE,DELETE ON testDB.* TO 'demo-user'@'localhost';

Примечание: Подробнее о создании пользователей и правах доступа можно прочитать здесь.

Чтобы отнять у пользователя право на редактирование, введите команду:

REVOKE UPDATE ON testDB.* FROM 'demo-user'@'localhost';

При помощи этой команды можно передать все права на БД:

GRANT ALL ON testDB.* TO 'demo-user'@'localhost';

Чтобы просмотреть текущие права доступа пользователя, нужно сначала активировать изменения прав, а затем запросить текущие права:

FLUSH PRIVILEGES;
show grants for 'demo-user'@'localhost';
+------------------------------------------------------------------------------------------------------------------+
| Grants for demo-user@localhost                                                                                   |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'demo-user'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' |
| GRANT SELECT, UPDATE, DELETE ON `testDB`.* TO 'demo-user'@'localhost'                                            |
+------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

Всегда обновляйте данные о привилегиях после их изменения.

Пользователь root

В завершение можно изменить стандартное имя root-пользователя. Если злоумышленник попытается взломать root-пользователя, то ему придётся подобрать не только пароль, но и имя.

Изменить имя root-пользователя можно с помощью команды:

rename user 'root'@'localhost' to 'newAdminUser'@'localhost';

Просмотрите изменения:

select user,host,password from mysql.user;

Теперь снова нужно обновить данные о привилегиях:

FLUSH PRIVILEGES;

Теперь для запуска сессии MySQL нужно вводить новое имя:

mysql -u newAdminUser -p

Заключение

Конечно, этот список рекомендаций по защите MySQL и MariaDB далеко не исчерпывающий. Однако это устранить самые распространённые уязвимости СУБД.

Более подробную информацию о настройке безопасности можно найти на веб-сайтах MySQL и MariaDB, а также мануалах программ. Кроме того, инструкции по безопасной настройке можно найти в документациях подключаемых к СУБД приложений.