- •Некоторые термины
- •Пользователи субд
- •Дискреционная защита
- •Мандатная защита
- •1. Введение
- •1.1 Функциональные возможности
- •1.2 Необходимые условия для защиты
- •2. Установка MySql
- •2.1 Компиляция mysql
- •2.2 Копирование файлов конфигурации
- •2.3 Запуск сервера
- •2.4 Проверка подключений
- •3. Chrooting сервер
- •3.1 Операционная система
- •3.2 Подготовка chroot среды
- •3.4 Создание структуры каталогов
- •3.5 Сжатие паролей и групп
- •3.6 Специальные соображения
- •3.8 Проверка конфигурации
- •4. Конфигурирование сервера
- •4.1 Отключение удаленного доступа
- •4.2 Улучшение локальной защиты
- •4.3 Изменение пароля администратора
- •4.4 Удаление значений по умолчанию users/db
- •4.6 Удаление файлов истории команд
- •5. Связь между php и mysql
- •6. Финальные шаги
- •6.1 Заключение
- •Реализация системы защиты в ms sql Server
- •Проверка полномочий
4.2 Улучшение локальной защиты
Следующее изменение должно отключить использование команды LOAD DATA LOCAL INFILE, что поможет предотвратить несанкционированное чтение данных из локальных файлов. Это имеет особенное значение, в случае если в PHP будет найдена новая уязвимость к SQL инъекциям.
Для этой цели, в раздел [mysqld]файла /chroot/mysql/etc/my.cnf, необходимо добавить следующий параметр:
Set-variable=local-infile=0
Кроме того, чтобы сделать более удобным использование административных средств базы данных, в разделе [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". Это особенно важно, если на сервере работают несколько пользователей. В таком случае пароль можно легко узнать, например, используя команду "psaux" или просмотрев файлы истории команд (~/.history, ~/.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 средой:
ln /chroot/mysql/tmp/mysql.sock /chroot/httpd/tmp/
Обратите внимание на то, что сокет /chroot/mysql/tmp/mysql.sockи каталог /chroot/httpd/tmp должны быть физически помещены в том же самой файловой системе. Иначе программы не смогут связываться друг с другом, т.к. постоянные связи не работают между различными файловыми системами.
