конецформыначалоформыСледующий шаг должен сконфигурировать сервер базы данных в соответствии с нашими требованиями по защите.
В случае заданной по умолчанию инсталляции 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, необходимо добавить следующий параметр:
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». Это особенно важно, если на сервере работают несколько пользователей. В таком случае пароль можно легко узнать, например, используя команду «ps aux» или просмотрев файлы истории команд (~/.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 команды (особенно пароли, сохраненные как открытый текст):