4.2 Общие проблемы безопасности и система привилегий доступа MySQL | Оглавление | 4.2.2 Как обезопасить MySQL от хакеров |
С данным разделом должны ознакомиться все, кто использует MySQL на компьютерах, подключенных к Internet, - чтобы избежать наиболее распространенных ошибок, приводящих к нарушению безопасности системы.
При обсуждении вопросов безопасности мы акцентируем внимание на необходимости защиты всего серверного хоста (а не одного лишь сервера MySQL) от всех возможных типов атак: перехвата, внесения изменений, считывания и отказа в обслуживании. Данный раздел не охватывает всех аспектов готовности к работе и отказоустойчивости.
Используемая в MySQL система безопасности для всех подключений, запросов и иных операций, которые может пытаться выполнить пользователь, базируется на списках контроля доступа ACLs (Access Control Lists). Обеспечивается также некоторая поддержка SSL-соединений между клиентами и серверами MySQL. Многие из рассматриваемых здесь концепций не относятся исключительно к MySQL; те же общие соображения применимы практически ко всем приложениям.
При работе в MySQL старайтесь следовать приведенным ниже инструкциям:
mysql
под именем
root
) доступа к таблице user
в базе данных mysql
! Это чрезвычайно
важно. В MySQL зашифрованный пароль является реальным паролем. Узнав
пароль, занесенный в таблицу user
, и имея доступ к удаленному
компьютеру, занесенному в соответствующую учетную запись, войти в
систему под именем зарегистрированного владельца пароля легко может
кто угодно.
GRANT
и REVOKE
. Предоставляйте ровно столько прав,
сколько необходимо, и не больше. Никогда не предоставляйте права всем
хостам. Полезно проводить следующие контрольные проверки:
mysql -u root
. Если удается успешно установить
соединение с сервером без получения запроса пароля, значит, у вас
имеются проблемы. Это означает, что кто угодно может
подсоединиться к вашему серверу MySQL как клиент MySQL под именем
root
, получая таким образом право неограниченного доступа!
Проанализируйте инструкцию по инсталляции MySQL, обращая особое
внимание на ту часть, которая касается задания пароля
пользователя root
.
SHOW GRANTS
проверьте, кто и к каким ресурсам
имеет доступ. Воспользуйтесь командой REVOKE
, отмените права
доступа, которые не являются необходимыми.
MD5()
, SHA1()
или другие односторонние хеш-функции.
nmap
. MySQL использует по умолчанию порт 3306. Этот
порт должен быть недоступен с неблагонадежных компьютеров. Еще
один простой способ проверить, открыт или нет ваш MySQL-порт, -
попытаться выполнить с какой либо удаленной машины следующую
команду, где server_host
- имя хоста, на котором установлен ваш
сервер MySQL:
shell> telnet server_host 3306Если соединение будет установлено, и вы получите какие-либо бессмысленные символы, это будет означать, что порт открыт, и его нужно закрыть на брандмауэре или маршрутизаторе (если, конечно, нет действительно веских причин держать его открытым). Если же
telnet
просто зависнет или в
подсоединении будет отказано, тогда все в порядке: порт заблокирован.
'; DROP
DATABASE mysql;
''. Это крайний случай, но действия хакеров,
использующих подобную технологию, могут привести к потере информации и
появлению брешей в системе безопасности, если вы не готовы к ним. Не
следует также забывать о необходимости проверки цифровых данных
(распространенной ошибкой является защита только строк). Некоторые
полагают, что если в базе данных хранятся только открытые данные, то в
ее защите нет необходимости. Это неверно. Такие базы могут стать
объектом успешных атак типа отказа от обслуживания. Простейший способ
защиты от взломов такого типа - заключать числовые константы в
кавычки: SELECT * FROM table WHERE ID='234'
, а не SELECT * FROM table
WHERE ID=23
4. MySQL автоматически преобразует эту строку в число и
выбросит из нее все нецифровые символы. Полезно проводить следующие
контрольные проверки:
%22
(`"'), %23
(`#'), и %27
(`'').
addslashes()
. Что касается PHP 4.0.3, то в
нем имеется функция mysql_escape_string()
, базирующаяся на
функции с тем же именем из MySQL C API.
mysql_real_escape_string()
.
escape
и quote
, - для
потоков запросов.
quote()
или используйте для проверки
заполнители.
PreparedStatement
и
символы-заполнители.
tcpdump
и strings
. В большинстве
случаев проверить, являются ли потоки данных MySQL зашифрованными,
можно с помощью команды, подобной той, которая приведена ниже:
shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings(Она работает под Linux, и будет, с незначительными изменениями, работать под другими системами.) Предупреждение: если вы не видите данных, это еще не гарантирует того, что они зашифрованы. Если требуется высокий уровень безопасности, обратитесь к экспертам в этой области.
4.2 Общие проблемы безопасности и система привилегий доступа MySQL | Оглавление | 4.2.2 Как обезопасить MySQL от хакеров |