Поиск по сайту:

Как защитить базы данных MySQL и MariaDB на Linux VPS


Введение

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

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

Для простоты и иллюстрации мы будем использовать сервер MySQL на экземпляре VPS Ubuntu 12.04. Однако эти методы можно применять и к другим дистрибутивам Linux, а также к MariaDB.

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

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, который вы установили во время установки. Сразу после этого вам будет задан ряд вопросов, начиная с того, хотите ли вы изменить пароль root.

Это еще одна возможность изменить свой пароль на более безопасный, если вы еще этого не сделали.

Вы должны ответить \Y\ (да) на все оставшиеся вопросы.

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

Вопросы безопасности

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

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

Безопасность через файл My.cnf

Основной файл конфигурации для MySQL — это файл с именем \my.cnf\, который находится в каталоге \/etc/mysql/\ на Ubuntu и в каталоге \/etc/\ на некоторых других VPS.

Мы изменим некоторые настройки в этом файле, чтобы заблокировать наш экземпляр MySQL.

Откройте файл с правами root. При необходимости измените путь к каталогу, если вы следуете этому руководству в другой системе:

sudo nano /etc/mysql/my.cnf

Первый параметр, который мы должны проверить, это параметр «bind-address» в разделе «[mysqld]». Этот параметр должен быть установлен на ваше локальное сетевое устройство обратной связи, то есть \127.0.0.1\.

bind-address = 127.0.0.1

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

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

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

В этот же раздел файла мы добавим директиву для отключения этой возможности загрузки локальных файлов:

local-infile=0

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

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

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

Вы можете установить переменную журнала в том же разделе \[mysqld]\, к которому мы добавляли.

log=/var/log/mysql-logfile

Убедитесь, что журнал MySQL, журнал ошибок и каталог журнала 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 нет пользователей без пароля или ассоциации с хостом:

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\ не имеет пароля и действителен независимо от того, на каком хосте он находится. Это очень небезопасно.

Мы можем установить пароль для пользователя с помощью этой команды. Измените \newPassWord\, чтобы отразить пароль, который вы хотите назначить.

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

Если мы снова проверим таблицу 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";

Если мы проверим еще раз, мы увидим, что в таблице User теперь установлены соответствующие поля.

SELECT User,Host,Password FROM mysql.user;

Если наша таблица содержит каких-либо пустых пользователей (на данный момент этого не должно быть, так как мы запустили \mysql_secure_installation\, но мы все равно рассмотрим это), мы должны удалить их.

Для этого мы можем использовать следующий вызов для удаления пустых пользователей из таблицы доступа:

DELETE FROM mysql.user WHERE User="";

После того, как мы закончим изменение таблицы 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';

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

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. Если злоумышленник пытается получить доступ к корневому логину MySQL, ему потребуется выполнить дополнительный шаг по поиску имени пользователя.

Логин 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, а также на соответствующих справочных страницах. Приложения, которые вы решите использовать, также могут давать советы по безопасности.