Настройка безопасности mysql в unix linux

Обновлено: 04.07.2024

MySQL является одной из наиболее популярных баз данных в Internet, и часто используется вместе с PHP. Помимо её бесспорных преимуществ, таких как простота использования и относительно высокая эффективность, MySQL предлагает простые, но в то же время очень эффективные механизмы защиты. К сожалению, заданная по умолчанию инсталляция MySQL, а в особенности пустой пароль по умолчанию и потенциальная уязвимость к атакам переполнения буфера, делают базу данных MySQL простым объектом для нападений. Эта статья описывает основные шаги, выполнение которых, максимально защитит базу данных MySQL от локальных и удаленных нападений. Это третья и последняя статья из цикла статей, посвященных защите Apache, PHP и MySQL.

MySQL является одной из наиболее популярных баз данных в Internet, и часто используется вместе с PHP. Помимо её бесспорных преимуществ, таких как простота использования и относительно высокая эффективность, MySQL предлагает простые, но в то же время очень эффективные механизмы защиты. К сожалению, заданная по умолчанию инсталляция MySQL, а в особенности пустой пароль по умолчанию и потенциальная уязвимость к атакам переполнения буфера, делают базу данных MySQL простым объектом для нападений.

Эта статья описывает основные шаги, выполнение которых, максимально защитит базу данных MySQL от локальных и удаленных нападений. Это третья и последняя статья из цикла статей, посвященных защите Apache, PHP и MySQL.

1.1 Функциональные возможности

Кроме этого мы также принимаем следующее:

  • База данных MySQL будет использоваться только PHP приложениями, установленными на том же самом хосте;
  • Для управления базой данных будут использоваться стандартные административные средства, типа mysqladmin, mysql,mysqldump и т.д.;
  • Для удаленного резервирования MySQL данных будет использоваться SSH протокол.

1.2 Необходимые условия для защиты

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

  • база данных mysql должна быть выполнена в chrooted среде;
  • процессы mysql должны выполняться под уникальным UID/GID, неиспользуемым никаким другим системным процессом;
  • Должен быть разрешен только локальный доступ к mysql;
  • Основная учетная запись mysql должна быть защищена “сложным” паролем;
  • Будет переименована учетная запись администратора;
  • Должен быть заблокирован анонимный доступ к базе данных (используя учетную запись nobody);
  • Должны быть удалены все типовые базы данных и таблицы.

2. Установка MySQL

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

pw groupadd mysql

pw useradd mysql-c " mysql Сервер "-d/dev/null-g mysql-s/sbin/nologin

2.1 Компиляция mysql

Мы скомпилируем и установим mysql в каталог /usr/local/mysql:

./configure --prefix=/usr/local/mysql --with-mysqld-user=mysql --with-unix-socket-path=/tmp/mysql.sock --with-mysqld-ldflags=-all-static
make
su
make install
strip /usr/local/mysql/libexec/mysqld
scripts/mysql_install_db
chown -R root /usr/local/mysql
chown -R mysql /usr/local/mysql/var
chgrp -R mysql /usr/local/mysql

Приведенный процесс установки сервера практически идентичен описанному в руководстве к mysql. Единственным отличием является использование нескольких дополнительных параметров, указанных в строке: ./configure. Наиболее важным отличием является использование параметра -- with-mysqld-ldflags =-all-static, который делает MySQL сервер статически связанным. Это значительно упрощает процесс chrooting сервера, как описано в Разделе 3. Остальные параметры приказывают make программе установить программное обеспечение в каталог /usr/local/mysql, выполнить MySQL демон с привилегиями учетной записи mysql, и создать сокет mysql.sock в каталоге /tmp.

2.2 Копирование файлов конфигурации

После выполнения вышеупомянутых команд, мы должны скопировать заданный по умолчанию файл конфигурации в соответствии с ожидаемым размером базы данных (маленькая, средняя, большая, огромная). Например:

cp support-files/my-medium.cnf /etc/my.cnf
chown root:sys /etc/my.cnf
chmod 644 /etc/my.cnf

2.3 Запуск сервера

Теперь mysql полностью установлен и готов к выполнению. Мы можем запустить mysql сервер, выполнив следующую команду:

2.4 Проверка подключений

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

Как только подключение успешно установлено, мы можем остановить работу базы данных:

/usr/local/mysql/bin/mysqladmin -u root shutdown

и начать защиту программного обеспечения. Иначе, мы должны будем проанализировать информацию, сохраненную в файле регистрации /usr/local/mysql/var/`hostname`.err, и устранить причину проблемы.

3. Chrooting сервер

Первый шаг защиты mysql должен подготовить chrooted среду, в которой будет выполняться mysql сервер. Chrooting методика была подробно описана в первой статье этого цикла ("Защита Apache: Шаг за шагом, поэтому если Вы не знакомы с этой методикой или не знаете почему рекомендуется chrooting, пожалуйста прочтите эту статью.

3.1 Операционная система

Как и в предыдущих статьях, мы будем основываться на операционной системе FreeBSD 4.7. Однако представленные методы должны также применяться и на более современных unix и unix-подобных системах.

3.2 Подготовка chroot среды

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

mkdir -p /chroot/mysql/dev
mkdir -p /chroot/mysql/etc
mkdir -p /chroot/mysql/tmp
mkdir -p /chroot/mysql/var/tmp
mkdir -p /chroot/mysql/usr/local/mysql/libexec
mkdir -p /chroot/mysql/usr/local/mysql/share/mysql/english

3.3 Установка прав доступа

Права доступа к вышеупомянутым каталогам должны быть установлены следующим образом:

chown -R root:sys /chroot/mysql
chmod -R 755 /chroot/mysql
chmod 1777 /chroot/mysql/tmp

3.4 Создание структуры каталогов

Затем, необходимо скопировать следующие файлы в новую структуру каталога:

cp/usr/local/mysql/libexec/mysqld/chroot/mysql/usr/local/mysql/libexec/

cp/usr/local/mysql/share/mysql/english/er rmsg.sys/chroot/mysql/usr/local/mysql/share/mys ql/english/

cp/etc/hosts/chroot/mysql/etc/

cp/etc/host.conf/chroot/mysql/etc/

cp/etc/resolv.conf/chroot/mysql/etc/

cp/etc/group/chroot/mysql/etc/

cp/etc/master.passwd/chroot/mysql/etc/passwords

cp/etc/my.cnf/chroot/mysql/etc/

3.5 Сжатие паролей и групп

Из файлов: /chroot/mysql/etc/passwords и /chroot/mysql/etc/group мы должны удалить все строки кроме учетной записи mysql и группы. Затем, мы должны, создать базу данных паролей (допустимо только в FreeBSD):

cd /chroot/mysql/etc
pwd_mkdb -d /chroot/mysql/etc passwords
rm -rf /chroot/mysql/etc/master.passwd

3.6 Специальные соображения

Как и в случае с Web-сервером Apache, мы должны создать специальный файл устройства /dev/null:

ls -al /dev/null

crw-rw-rw- 1 root sys 2, 2 Jun 21 18:31 /dev/null

mknod /chroot/mysql/dev/null c 2 2

chown root:sys /chroot/mysql/dev/null

chmod 666 /chroot/mysql/dev/null

Теперь необходимо скопировать базу данных mysql, которая содержит таблицы, созданные в процессе инсталляции mysql:

cp-R/usr/local/mysql/var//chroot/mysql/usr/local/mysql/var

chown-R mysql:mysql/chroot/mysql/usr/local/mysql/var

Если будет использоваться какой-либо язык кроме английского, то необходимо будет скопировать нужный набор символов из каталога /usr/local/mysql/share/mysql/charsets.

3.8 Проверка конфигурации

Теперь MySQL готов к запуску в chrooted среде. Мы можем проверить, правильно ли запускается MySql, выполнив следующую команду:

chrootuid /chroot/mysql mysql /usr/local/mysql/libexec/mysqld &

Если произойдет какая-либо ошибка, то необходимо будет использовать команду truss или подобную ей, типа ktrace/kdump, strace, и т.д. Это поможет нам определить и устранить причину проблемы.

Заметьте, что для выполнения процесса mysqld, вместо chroot, как в случае Apache или PHP, использовалась программа chrootuid. Главное отличие состоит в том, что chrootuid меняет владельца запущенного процесса. В нашем примере, mysqld выполняется в chrooted среде, но владелец процесса - не root, а пользователь mysql. Chrootuid во многих операционных системах не установлен по умолчанию, поэтому необходимо загрузить и установить эту программу вручную. Программа Chrootuid может быть загружена здесь .

4. Конфигурирование сервера

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

В случае заданной по умолчанию инсталляции mysql, главным файлом конфигурации является /etc/my.cnf. Однако, в нашем случае, из-за выполнения сервера в chrooted среде, мы будем использовать два файла конфигурации: /chroot/mysql/etc/my.cnf и /etc/my.cnf. Первый будет использоваться сервером mysql, а второй - утилитами mysql (например: mysqladmin, mysql, mysqldump и т.д.). В обоих случаях, потребуются некоторые изменения конфигурации.

4.1 Отключение удаленного доступа

Первое изменение касается порта 3306/tcp, который mysql прослушивает по умолчанию. Поскольку, согласно начальным предположениям по защите, база данных будет использоваться только локально установленными PHP приложениями, мы можем свободно отключить прослушивание этого порта. Это ограничит возможность нападения на базу данных mysql прямыми TCP/IP подключениями с других хостов. Чтобы отключить прослушивание упомянутого порта, необходимо к разделу [mysqld] файла /chroot/mysql/etc/my.cnf добавить следующий параметр:

skip-networking

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

backuphost$ ssh mysqlserver /usr/local/mysql/bin/mysqldump -A > backup

4.2 Улучшение локальной защиты

Следующее изменение должно отключить использование команды LOAD DATA LOCAL INFILE, что поможет предотвратить несанкционированное чтение данных из локальных файлов. Это имеет особенное значение, в случае если в PHP будет найдена новая уязвимость к SQL инъекциям.

Для этой цели, в раздел [mysqld] файла /chroot/mysql/etc/my.cnf, необходимо добавить следующий параметр:

Кроме того, чтобы сделать более удобным использование административных средств базы данных, в разделе [Client] файла /etc/my.cnf, должен быть изменен следующий параметр:

socket = /chroot/mysql/tmp/mysql.sock

Благодаря этому, каждый раз при выполнении этих утилит, не будет никакой потребности передавать в команды: mysql, mysqladmin, mysqldump и т.д., параметр socket =/chroot/mysql/tmp/mysql.sock.

4.3 Изменение пароля администратора

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

chrootuid /chroot/mysql mysql /usr/local/mysql/libexec/mysqld &

и изменить пароль администратора следующим образом:

/usr/local/mysql/bin/mysql -u root

mysql> SET PASSWORD FOR root@localhost=PASSWORD('new_password');

Хорошей привычкой является отказ от изменений паролей из командной строки, например, используя команду "mysqladmin password". Это особенно важно, если на сервере работают несколько пользователей. В таком случае пароль можно легко узнать, например, используя команду "ps aux" или просмотрев файлы истории команд (

/.bash_history и т.д), в случае если на них установлены неподходящие права доступа.

4.4 Удаление значений по умолчанию users/db

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

mysql> drop database test;

mysql> use mysql;

mysql> delete from db;

mysql> delete from user where not (host="localhost" and user="root");

mysql> flush privileges;

Это предотвратит нашу базу данных от установления анонимных подключений, а также, независимо от параметра skip-networking в файле /chroot/mysql/etc/my.cnf --, удаленных подключений.

4.5 Изменение имени учетной записи администратора.

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

mysql> update user set user="mydbadmin" where user="root";
mysql> flush privileges;

4.6 Удаление файлов истории команд

Наконец, мы должны удалить содержимое файла истории команд mysql (

/.mysql_history), в котором сохраняются все выполненные SQL команды (особенно пароли, сохраненные как открытый текст):

5. Связь между PHP и mysql

В предыдущей статье "Защищаем PHP: Шаг за шагом", автор упомянул о проблеме связи между PHP и mysql, в случае, если одна из этих программ выполняется в chrooted среде. Поскольку локально PHP связывается с mysql, используя сокет /tmp/mysql.sock, размещение PHP в chrooted среде, означает, что они не могут связываться друг с другом. Для решения этой проблемы, каждый раз, запуская mysql, мы должны создавать постоянную связь с PHP chrooted средой:

6. Финальные шаги

Теперь мы уже можем создавать все базы данных и учетные записи, которые будут использоваться определенными PHP приложениями. Необходимо подчеркнуть, что эти учетные записи должны иметь права доступа только к базам данных, используемым PHP приложениями. В частности они не должны иметь никаких прав доступа к базе данных mysql, и ни никаким системным или административным привилегиям (FILE, GRANT, ALTER, SHOW DATABASE, RELOAD, SHUTDOWN, PROCESS, SUPER и т.д.).

Наконец, необходимо создать основной сценарий, который будет использоваться для запуска mysql во время загрузки операционной системы. Пример такого сценария показан ниже,:

В случае с нашей системой FreeBSD, вышеупомянутый сценарий должен быть помещен в каталог /usr/local/etc/rc.d, под именем mysql.sh.

6.1 Заключение

Применение методов, описанных в данной статье, позволит нам значительно увеличить степень защиты mysql. Запуская базу данных в chrooted среде, отключая прослушивание 3306/tcp порта, и применяя "строгие" пароли к учетным записям пользователей, мы можем сделать базу данных неуязвимой ко многим видам нападений, которые были бы возможны с заданной по умолчанию инсталляцией.

Хотя никакой метод не позволит нам достигнуть 100% защиты, но применение, описанных данной статье методов, по крайней мере, ограничит возможность нападения пользователей, посещающих наши Web-сервера с недобросовестными намерениями.

Перейдем ко второму практическому уроку серии и поговорим о настройке виртуального окружения выделенного сервера – подготовим узел (VM) предназначенный для хранения и обслуживания доступа к БД MySQL/PostgreSQL.

В этой установке, мы будем использовать сервер баз данных MySQL. Все настройки этого урока будут проводится исключительно на vm04 с IP-адресом 192.168.1.13

Установка сервера MySQL

Настройка сервера MySQL

Отредактируем файл /etc/my.cnf:


Убедитесь, что MySQL сервер доступен с виртуальных машин vm01 и vm02 с установленными на нем Apache+php5. Найдите раздел [mysqld] и добавте/исправьте следующие параматеры, что бы mysqld служба БД стала доступна удаленно:

Оптимизация параметров MySQL-сервера


Сохраним изменения и закроем файл. Перезагрузим/перезапустим сервер MySQL:

MySQL сервера баз данных конфигурации брандмауэра

Отредактируем конфигурацию брандмауэра /etc/sysconfig/iptables:


Убедитесь, что виртуальные машины vm01 и vm02 могут получить доступ к серверу баз данных:

Увеличение дисковых квот и диапазона портов сервера БД

Для нагруженных серверов СУБД следует увеличить предельное количество дескрипторов файлов (FD limits) и увеличить число доступных IP-портов


Активируем изменения, введя следующую sysctl-команду, изменяющую параметры ядра Linux исходя из указанных нами настроек:

Создание баз данных MySQL и учетных записей пользователей

  • ИМЯ БД: foo
  • ИМЯ ПОЛЬЗОВАТЕЛЯ БД: bar
  • ПАРОЛЬ БД: mypassword
  • КОМУ РАЗРЕШЕН ДОСТУП К БД: localhost, vm01, vm02 со следующими IP-адресами — 192.168.1.10 и 192.168.1.11

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


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

Необходимо предоставить права доступа к этой БД пользователю MySQL с именем bar, под которым сервера приложений Apache + php5 будут подключаться к БД.


Что бы выйти из консоли MySQL, введите следующую команду:


Теперь можно создавать таблицы или загрузить данные, используя SQL-файл. Вы можете автоматизировать эту процедуру, написав шелл- или Perl-скрипт добавления пользователей MySQL и баз данных.

Проверьте вашу новенькую БД и пользовательские настройки с «удаленных» vm01 и vm02

PhpMyAdmin

PhpMyAdmin – известный web-интерфейс к БД MySQL. Этот серверный скрипт используется для удаленного администрирования MySQL с помощью одного лишь браузера. PhpMyAdmin может администрировать как весь сервер MySQL, так и одну базу данных. Этот пакет рекомендуется для всех новых пользователей базы данных MySQL и администраторов.

Ссылки на продолжение в конце поста будут проставлены в течение недели, по мере перевода и при вашем желании слушать дальше этот перевод.


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


С реди систем управления базами данных, размещаемых на собственных и облачных серверах, к MySQL пользователи обращаются чаще всего. Эта СУБД компании Oracle распространяется на условиях свободной и коммерческой лицензий. Иногда термином MySQL называют не систему управления, а базу данных, работающую в таком формате управления, и это не является ошибкой. Нередко разработчики дорабатывают продукт под конкретное задание заказчиков.

Обеспечение безопасности баз данных MySQL является серьезной задачей.

Стандартные настройки

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

Основными узкими местами признаются:

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

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

Предпосылки и возможности обеспечения безопасности

Модель построения защиты базы данных должна строиться, исходя из стандартных настроек и возможностей ПО.

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

  • к базам данных MySQL обращаются только приложения в формате PHP, установленные и запускаемые на том же сервере;
  • управление базами осуществляется штатными средствами – mysqladmin, mysql, mysqldump;
  • если требуется удаленное резервирование базы данных, применяется исключительно протокол SSH.

Условия для выстраивания систем защиты

Уровни обеспечения безопасности баз данных MySQL могут быть различными.

Для реализации максимально возможного уровня защиты конфигурация системы должна выглядеть следующим образом:

  • база данных MySQL реализуется только в chrooted-среде, это значит, что исключено взаимодействие с программами в других корневых каталогах;
  • все процессы базы данных выполняются с уникальными значениями UID (User identifier) и GID (Group identifier) – числовых идентификаторов пользователя и группы, которые не используются ни в каких других процессах и программах;
  • доступ к базе может быть только локальный, удаленный по возможности необходимо исключить;
  • чем более сложный пароль используется для основной учетной записи, тем лучше;
  • изначально заданная в свободной лицензии учетная запись администратора требует переименования;
  • анонимный доступ к базе данных MySQL с использованием идентификатора nobody должен быть исключен;
  • стандартные форматы баз данных и таблиц придется удалить.

При выполнении этих условий защита станет эффективнее.

Базы данных часто страдают от действий инсайдеров: сотрудники после конфликта с руководством удаляют из БД критически важные данные, взламывают базу, чтобы украсть данные клиентов на продажу. Как защититься?

Как правильно устанавливать базу данных MySQL

Вопрос инсталляции программы является ключевым в обеспечении ее безопасности. При выполнении этого процесса потребуется создать уникальную учетную запись пользователя и собственный корневой каталог. Необходимые команды можно найти в руководстве пользователя программы, скрипты также размещены в тематических сообществах. Отличия при защищенной инсталляции возникнут при необходимости внесения дополнительных параметров в раздел, посвященный конфигурации системы. Предлагаемые значения снижают риск того, что проникновение в базу данных произойдет с использованием смежно протекающих процессов. При установке файл конфигурации копируется, возникает необходимость выбрать его подвариант, исходя из предполагаемых размеров БД – малая, средняя, большая, грандиозная.

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

Шаги по обеспечению защиты

Здесь придется выполнить алгоритм, каждый шаг которого потребует наличия у системного администратора специальных знаний. Первым этапом станет создание для базы данных MySQL chrooted-среды. Создается уникальная структура каталога, задаются права доступа для всех лиц, которым будет разрешено администрирование базы данных. При создании структуры в нее копируются ключевые файлы системы (указаны в руководстве пользователя). Некоторые файлы сжимаются, в них сохраняются только учетные записи и группы.

Далее необходимо решить задачу с выбранной операционной системой. Все базы данных MySQL разработаны для ОС UNIX и созданных на ее базе систем. Но рекомендуем выбирать FreeBSD 4.7. Для нее разработано максимальное количество скриптов и команд, хотя они применимы и в более современных юниксоидах. Также в FreeBSD 4.7 можно создать базу данных паролей, что не получится сделать в других ОС.

Среди нюансов, которые нужно учесть:

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

После выполнения предварительных этапов можно протестировать, готова ли база данных MySQL к запуску и работе в chrooted-среде. После запуска этой команды могут возникнуть проблемы. Использование команды truss позволит выявить причину отказа в запуске и устранить ее.

Как задать конфигурацию сервера

Защита базы данных тесно связана с особенностями конфигурации сервера, этой задачей придется заняться в первую очередь. Так как программа управления базами данных предназначена для работы в chrooted-среде, необходимо использовать два файла конфигурации. Первый предназначен для самой базы данных MySQL, второй используется ее утилитами, такими как mysqladmin, mysql, mysqldump. Обе задачи потребуют изменения изначально заданной конфигурации сервера.

Основные параметры безопасности

Далее предстоит решить задачу отключения удаленного доступа. Первым делом потребуется найти порт 3306/tcp, им утилиты MySQL пользуются по умолчанию. Порт может быть без проблем отключен, так как приложения PHP, установленные на сервере и предназначенные для обращения к базе данных, в нем не нуждаются. Такое отключение снизит риск целевых атак на информацию, содержащуюся в БД, при помощи TCP/IP-подключений, производимых с внешних серверов.

Иногда возможность удаленного подключения требуется сохранить, часто это нужно для обеспечения возможности удаленного сохранения и резервирования информации, содержащейся в БД. Для этого можно использовать возможности удаленного протокола SSH.

После решения задачи с удаленным доступом нужно улучшить защиту от проникновений на локальном уровне. Одним из решений является отключение возможности использования команды LOAD DATA LOCAL INFILE. Это позволит предотвратить возможность несанкционированного доступа к БД из локальной сети. Опция необходима, так как не исключено, что профессионалы рынка программ-взломщиков найдут очередную возможность доступа, и в PHP появится новая уязвимость к SQL-инъекциям. Под этим термином понимается внешнее внедрение в программное обеспечение произвольного SQL-кода, который позволяет генерировать запросы на несанкционированное прочтение, изменение или удаление информации, содержащейся в базах данных SQL. Для снижения степени этого риска потребуется изменение ряда параметров chrooted-среды, скрипты изменений доступны в широком перечне источников.

Следующий обязательный шаг – изменение параметров пароля администратора. При инсталляции базы данных он по умолчанию является пустым, и это создает существенную зону риска. Задать пароль можно только при запуске базы данных. Не советуем изменять пароли при помощи командной строки. Если с сервером и БД работает несколько пользователей, то те из них, в добросовестности которых есть сомнения, могут узнать измененный пароль, просмотрев файлы истории команд. Дополнительной мерой защиты станет ограничение прав доступа к этим файлам. Права администратора никогда не должны превышать тот объем, который необходим ему для выполнения рабочих его обязанностей. Любое расширение объема прав должно быть санкционировано.

Удаление стандартных форматов

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

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

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

Внутренние связи

Для оптимизации работы базы данных MySQL требуется оптимизировать связь между ней и процессами PHP. Связь может стать проблемой после того, как база данных MySQL будет запущена в chrooted-среде. Это полностью исключает связь между БД и приложениями, поэтому каждый раз при запуске БД потребуется вводить команду, обеспечивающую нормальное соединение. При этом необходимо размещение утилит обоих программных продуктов в одной файловой системе.

Завершение этапа обеспечения базового уровня защиты

На этом этапе следует еще раз провести ревизию прав доступа. Все администраторы, работающие с процессами PHP, должны иметь ограниченные права доступа к БД – только к тем ее участкам, которые непосредственно взаимодействуют с администрируемыми ими приложениями. Нельзя давать им доступ к администрированию самой БД и ее утилит. Доступ с возможностью использования таких привилегий администратора, как FILE, GRANT, ALTER, SHOW DATABASE, RELOAD, SHUTDOWN, PROCESS, SUPER должен быть исключен.

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

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

  • ограничение прав администраторов;
  • отключение внешних портов;
  • запуск БД только в защищенной среде.

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

Дополнительные решения для Linux

Приведенные решения позволяют во многом обеспечить безопасность базы данных MySQL при работе с операционной системой UNIX и ее производными. Но нередко возникают ситуации, когда защитить БД требуется в среде Linux. Специально для этой операционной системы создан форк (параллельная версия, развивающаяся на базе материнской, но по самостоятельным принципам) базы данных MySQL. Он получил название MariaDB. Сейчас версии этой программы занимают первое место среди всех инсталлируемых программ с открытым кодом. Но, как и изначальная версия, этот вариант систем управления базами данных окажется небезопасным, если использовать настройки по умолчанию, предусмотренные в первичной конфигурации.

Изменение уровня защиты MariaDB повысит степень безопасности информационной системы в целом. Злоумышленники всегда первым делом сканируют известные им уязвимости, и программы управления базами данных относятся к основным целям. Стандартной ситуацией становится лобовое применение общего и неизмененного пароля root для взлома базы данных MySQL.

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

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

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

3. Отключить LOCAL INFILE – средство, с помощью которого сервер базы данных может запросить абсолютно любой файл у клиента базы данных. Это обеспечит безопасность БД, сократив возможность обращений к ней.

4. Изменить порт по умолчанию. В первоначально заданных настройках используется порт 3306, но системный администратор может заменить его на любой, не столь очевидный и удобный для работы. При отсутствии необходимости удаленных подключений можно вовсе отключить порт.

5. Подключить опцию ведения журнала MySQL. Это даст возможность протоколировать любые операции с БД, в том числе внешние атаки и попытки несанкционированных проникновений из локальной сети. Ведение журнала осуществляется введением переменных в файлы MySQL, уточнить их можно в руководстве пользователя.

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

7. Удалить историю системной оболочки MySQL. Полностью очистить файл истории и сохраненные в нем команды, связанные с изменением конфигурации и ключевых параметров работы БД. Так же, как и для версии под UNIX, полностью отказаться от практики введения паролей при помощи командной строки. Установить собственный график очистки истории и неуклонно соблюдать его.

8. Командную строку нельзя использовать для ввода не только паролей, но и иных команд. Все они сохраняются в файле истории, и злоумышленник иногда может получить к ним доступ раньше, чем системный администратор очистит историю изменений.

9. На программном и административном уровне, во внутренних регламентирующих документах определить список пользователей, допущенных к администрированию базы данных и работе с ней. Для каждого приложения назначить соответствующие уровни доступа для тех пользователей, которые с ними непосредственно работают. После того как конкретный пользователь перестал работать с БД и приложениями, необходимо удалить его учетную запись.
10. Использовать дополнительные меры защиты, находить плагины и библиотеки, которые помогут поднять уровень безопасности базы данных MySQL. Среди наиболее популярных – подключаемые модули безопасности для аутентификации пользователей при подключении к серверу MySQL, модули проверки пароля и его защиты, специальные защищенные архивы-хранилища для конфиденциальной информации. Все модули требуется предварительно тестировать на совместимость.

11. Постоянно менять все пароли к каждой учетной записи. Регламентировать на административном уровне обязанность и график смены паролей. Если на сервере установлена невыявленная программа-шпион, регулярная смена паролей существенно затруднит ее работу по отслеживанию действий пользователей.

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

13. Постоянно изучать тематические форумы, посвященные нюансам работы системы. Продвинутые пользователи обращают внимание на новые и известные хакерам уязвимости и предлагают дополнительные меры защиты. При этом не стоит устанавливать новые решения без предварительного тестирования.

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

Читайте также: