Настройка безопасности MYSQL в Unix/Linux

Настройка безопасности MYSQL в Unix/Linux

В этой статье «Настройка безопасности MYSQL в Unix/Linux» я хотел бы представить материал по настройке безопасности mysql в операционных системах Unix и Linux. Я долго собирал данный материал и собрал все до кучи.

Я не буду рассказывать как установить mysql, а перейду сразу к настройкам, но если кто-то не знает как установить mysql, то могут ознакомится с полезным материалом тут:

Уcтановка nginx, MySQL, PHP (LEMP) stack на Debian/Ubuntu

Установка Apache2 с PHP5 и MySQL + phpmyadmin для CentOS/RedHat/Fedora

Установка MySQL 5.5 на RHEL / CentOS и Fedora

Установка Nginx, PHP-FPM, MariaDB на CentOS 7 / RHEL 7

Просмотр привилегий пользователя MySQL

Создание бекапа MySQL/MariaDB удаленно через SSH в Unix/Linux

Сменить кодировку в Mysql/MariaDB в Unix/Linux

Тюнинг MySQL баз данных

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

Файл конфигурации my.cnf в Ubuntu и Debian, находится: /etc/mysql/my.cnf

Файл конфигурации my.cnf в CentOS, RedHat и Fedora: /etc/my.cnf

Настройка безопасности MYSQL в Unix/Linux

И так, приступим….

Предварительная установка.

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

  • Зашифруйте файловую систему, чтобы предотвратить взлома данных злоумышлинниками.
  • Установите систему обнаружения вторжений, например Tripwire, который смотрит на изменения в критических системных файлах.
  • Нужно заблокировать не использующие порты с помощью брандмауэра, чтобы предотвратить доступ к системным службам.
  • Установить сильные пароли для пользователя root и для других пользователей ОС.
  • Disallowing OS login by application users: set to “nologin” or “/bin/false”.
  • Необходимо настроить sudo всех аккаунтов с привилегиями и требовать пароль для доступа к SUDO.
  • Настроить запуск скрипта для сканирования rootkit-отов по расписанию.
  • Запустить процес «Список контроля доступа» (ACL)на уровне ОС: Расширения SELinux или AppArmor. Эти программы будут ограничивать систему или процессы на сервере от доступа к данным и ресурсам, которые явно не определены.

Настройка безопасности после установки mysql.

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

Первый вариант — это сделать все это самому, вручную:

Проверяем, установлен ли пароль дял пользователя root и если нет, то установим его:

mysql> SELECT * FROM mysql.users WHERE User='root';

И устанавливаем пароль:

mysql> UPDATE mysql.users SET Password=password(‘your password here’) WHERE User=’root’;

Удаляем анонимных пользователей:

mysql> DELETE FROM mysql.users WHERE User='';

Удалим (запретим) удаленный доступ для пользователя root:

mysql> DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');

Удаляем стандартную базу данных с именем «test»:

mysql> DROP database test;

Перезагрузим пользовательские привелегии:

mysql> FLUSH PRIVILEGES;

По умолчанию, MySQL будет работать через «mysqld_safe», который не делает MySQL безопасным. Скрипт mysqld_safe обеспечивает функциональность следующим образом: «Скрипт запускает демон MySQL или перезапускает его, если он неожиданно умирает». Таким образом, если кто-то пытается запустить mysql от пользователя root, то скрипт не запустится. Процесс mysql может работать без mysqld_safe, вы можете запустить его следующим образом, через sudo:

$ sudo -u mysql /usr/local/bin/mysqld

Путь к демону может отличатся, все зависит от ОС.

Второй вариант — это запустить «mysql_secure_installation».

2-й способ более простой и скрипт выполнит все за вас. Запустите скрипт «mysql_secure_installation». Это поможет выполнить несколько процедур, которые будут устранять некоторыми значениями по умолчанию, которые являются опасными для использования:

$ sudo mysql_secure_installation

данный скрипт запросит у вас пароль суперпользователя который вы создали во время установки. Сразу же после этого, вам будет предложено ряд вопросов. Вы должны ответить «Y» (Да), на все оставшиеся вопросы.

И так, все установлено и теперь нужно отредактировать конфигурационный файл my.cnf и внести ряд полезных изменений:

# vim /etc/mysql/my.cnf

Первый параметр, который мы должны проверить это «bind-address» который находится в разделе «[mysqld]». Этот параметр говорит что mysql будет запущен на локальном сервере без выхода в интернет и к нему не смогут подключится, приведите к следующему виду:

bind-address = 127.0.0.1

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

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

local-infile=0

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

Вы можете установить путь где будет желать лог-файл ( в этом же разделе»[mysqld]»):

log=/var/log/mysql-logfile

Рекомендуется отключение символических ссылок  для предотвращения различного рисков в безопасности:

symbolic-links = 0

Это не полный конфиг, чтобы просмотреть полный, перейдите:

my.cnf

Это готовый и оптимизированный конфигурационный файл. Он довольно большой, по этому, я его вынес в отдельный файл. Можете использовать его.

НЕ ДЛЯ ПАРАНОИКОВ! Можно прописать логин и пароль и входить без него, для этого:

[client]
user=user_mysql
password=password_mysql

user_mysql — пользователь в mysql.
password_mysql — пароль от пользователя user_mysql в mysql.

В следующий раз при запуске mysql команд в mysql, mysqlcheck, mysqdump утилиты будут брать user_mysql & password_mysql с файла и это с экономит ваше время (и не нужно прописывать -u и -p).

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

# ls -l /var/log/mysql*

Настройка безопасности внутри MySQL.

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

# mysql -u root -p

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

Обеспечение паролей и Host ассоциаций

Во-первых, необходимо проверить, что никто из пользователей не остался без пароля или без ассоциацивных хостов в MySQL:

> SELECT User,Host,Password FROM mysql.user;

+------------------+-----------+-------------------------------------------+
| user | host | password |
+------------------+-----------+-------------------------------------------+
| root | localhost | *DJLJHFHGJKL:HLKJHK083587C260BACB2A6158 |
| Test-user | % | |
| root | 127.0.0.1 | *DEIOUYTDRSXCVBNM<>NJHGFYUTRACB2A6158 |
| root | ::1 | *DE0OUYTRE$%^&UHBNKJHGFDCVBHJYT^&UYHGBNKA6158 |
| captain | localhost | **&^RFGHJKNHT%^7ygbhjuy6tghu76tg0 |
+------------------+-----------+-------------------------------------------+
5 rows in set (0.00 sec)

Как вы можете видеть, в примере, пользователь «Test-user» не имеет пароля и работает независимо от хоста и БД. Это очень небезопасно.

Мы можем установить пароль для пользователя. Измените «newPassWord» и установить пароль который вам нужно:

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

Если проверим таблицу user снова, то увидим, что пользователь Test-user теперь имеет пароль:

> SELECT User,Host,Password FROM mysql.user;

+------------------+-----------+-------------------------------------------+
| user | host | password |
+------------------+-----------+-------------------------------------------+
| root | localhost | *DJLJHFHGJKL:HLKJHK083587C260BACB2A6158 |
| Test-user | % | *D8DECEC305209EEFEC43008E1D420E1AA06B19E0 |
| root | 127.0.0.1 | *DEIOUYTDRSXCVBNM<>NJHGFYUTRACB2A6158 |
| root | ::1 | *DE0OUYTRE$%^&UHBNKJHGFDCVBHJYT^&UYHGBNKA6158 |
| captain | localhost | **&^RFGHJKNHT%^7ygbhjuy6tghu76tg0 |
+------------------+-----------+-------------------------------------------+
5 rows in set (0.00 sec)

Если вы посмотрите в поле «Host», вы увидите, что у нас еще есть «%», который является джокером. Это означает, что данный пользователь имеет право работать с любым хостом на сервере. Это не то, что нужно и необходимо изменить на «localhost»:

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

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

> SELECT User,Host,Password FROM mysql.user;

Если таблица содержит пустых пользователей (В этот примере нет таких, так как я запустил «mysql_secure_installation», но я расскажу об этом в любом случае), мы должны удалить их:

> DELETE FROM mysql.user WHERE User="";

После того как я сделал модифицировать таблицы user, нужно выполнить следующую команду, чтобы активировать новые привилегии:

> FLUSH PRIVILEGES;

Назначение пользователей и присваивание им прав.

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

> create database the_test_database;

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

> CREATE USER 'Test-user'@'localhost' IDENTIFIED BY 'password';

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

> GRANT SELECT,UPDATE,DELETE ON the_test_database.* TO 'Test-user'@'localhost';

В качестве примера, если нужно отменить права, например на UPDATE  для пользователя, то это можно сделать так:

> REVOKE UPDATE ON the_test_database.* FROM 'Test-user'@'localhost';

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

> GRANT ALL ON the_test_database.* TO 'Test-user'@'localhost';

Выполним обновление привелегий для пользователей:

> FLUSH PRIVILEGES;

А сейчас проверим что получилось:

> show grants for 'Test-user'@'localhost';

+------------------------------------------------------------------------------------------------------------------+
| Grants for Test-user@localhost |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'Test-user'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' |
| GRANT SELECT, UPDATE, DELETE ON `the_test_database`.* TO 'Test-user'@'localhost' |
+------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

Всегда выполняйте «flush privileges», когда вы закончили вносить изменения.

Поменять пользователя root.

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

Чтобы переименовать пользователя root, вы можете использовать:

> rename user 'root'@'localhost' to 'new_user_admin'@'localhost';

Вы можем увидеть изменения, используя тот же запрос:

> select user,host,password from mysql.user;

Опять же, необходимо очистить привелегии для этих изменений:

> FLUSH PRIVILEGES;

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

# mysql -u new_user_admin -p

Если нужно сбросить пароль от пользователя root в mysql, то рекомендую прочитать статью «Сброс пароля root в MySQL»

Защита файла конфигурации MySQL.

Чтобы сохранить настройки, файл не должен быть доступен для всех, кроме себя. Чтобы обеспечить это, выставитепара на файл 400 или 600. Например:

# chmod 0644 /etc/mysql/my.cnf

На всех файлах конфигурации должны иметь владельца root:

$ sudo chown -R root:root /etc/mysql/

И напоследок, для полной защиты, я настоятельно рекомендовал бы защитить файл конфигурации. Для этого, стоит выполнить команду:

# chattr +i /etc/my.cnf

Подробно о этой утилите можно прочитать тут:

Изменение атрибутов (флагов) на файлах в Unix/Linux

Убедитесь, что mysqld работает на tcp порту №3306:

# netstat -tulpn | grep :3306

А на этом статья «Настройка безопасности MYSQL в Unix/Linux» подошла к завершению.

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

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

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