В 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, а также мануалах программ. Кроме того, инструкции по безопасной настройке можно найти в документациях подключаемых к СУБД приложений.