При подключении к серверу MySQL используется, как правило, пароль. По линии связи пароль не передается в виде открытого текста, но алгоритм шифрования не очень сложный. Толковый хакер, если ему удастся перехватить трафик между клиентом и сервером, при определенной настойчивости может взломать пароль. Поэтому если связь между клиентом и сервером осуществляется по ненадежной сети, для шифрования связи следует использовать SSH-туннель.
Вся остальная информация передается в текстовом виде и может быть
прочитана кем угодно, кто в состоянии отлеживать подключение. Если это вас
беспокоит, можно воспользоваться протоколом со сжатием данных (в MySQL
3.22 и последующих версиях), что значительно затруднит подобные действия.
Чтобы еще более повысить безопасность связи, следует использовать протокол
ssh
. Open source
-клиент ssh
доступен на веб-сайте https://www.openssh.org/,
а коммерческий ssh
-клиент можно получить на веб-сайте
https://www.ssh.com/. С помощью такого протокола можно обеспечить
зашифрованную связь по протоколу TCP/IP между сервером MySQL и клиентом
MySQL.
Если вы используете MySQL 4.0, то можете также использовать предусмотренную в этой версии поддержку протокола OpenSSL. Обратитесь к разделу See Раздел 4.3.9, «Использование безопасных соединений».
Для обеспечения безопасности MySQL-системы необходимо строго придерживаться следующих рекомендаций:
-
У всех пользователей MySQL должны быть пароли. Для приложений клиент/сервер является общепринятым, что клиент может указывать любое имя пользователя, но если для
other_user
не задан пароль, то кто угодно может зайти под любым именем, просто введяmysql -u other_user db_name
. Чтобы этого избежать, можно изменить пароль для всех пользователей, отредактировав скриптmysql_install_db
перед запуском приложения, или только пароль дляroot
-пользователя MySQL, как это показано ниже:shell> mysql -u root mysql mysql> UPDATE user SET Password=PASSWORD('new_password') WHERE user='root'; mysql> FLUSH PRIVILEGES;
-
Не запускайте демон MySQL от имени пользователя Unix
root
. Это очень опасно, потому что любой пользователь, имеющий привилегиюFILE
, будет в состоянии создавать файлы как пользовательroot
(например~root/.bashrc
). Чтобы предотвратить это,mysqld
откажется запускаться от имени пользователяroot
, если это не будет задано напрямую с помощью опции--user=root
. В то же времяmysqld
может быть запущена от имени обычного непривилегированного пользователя. Можно также, в целях еще большего укрепления безопасности, создать новый аккаунт Unix-пользователяmysql
. При запускеmysqld
от имени другого пользователя Unix у вас отпадает необходимость заменять имя пользователяroot
в таблицеuser
, так как имена пользователя в MySQL не имеют ничего общего с аккаунтами пользователей Unix. Для запускаmysqld
от имени другого пользователя Unix добавьте в группу[mysqld]
файла опций/etc/my.cnf
или файла опцийmy.cnf
, находящегося в каталоге данных сервера, строкуuser
, задающую имя пользователя. Например:[mysqld] user=mysql
В результате сервер будет запущен от имени назначенного пользователя, независимо от того, производится запуск вручную или посредством
safe_mysqld
илиmysql.server
. Для получения дополнительной информации обратитесь к разделу See Раздел A.3.2, «Запуск MySQL от обычного пользователя». Откажитесь от поддержки символических ссылок на таблицы (ее можно запретить с помощью опции
--skip-symlink
). Это особенно важно в том случае, если вы запускаетеmysqld
от имени пользователяroot
, поскольку у того, кто имеет право доступа для записи в каталоги данныхmysqld
, появляется возможность стереть любой файл в системе! Обратитесь к разделу See Раздел 5.6.1.2, «Использование символических ссылок для таблиц».Удостоверьтесь, что пользователь Unix, от имени которого запускается mysqld, является единственным пользователем, имеющим привилегии чтения/записи в директории базы данных.
Не предоставляйте привилегии
PROCESS
всем пользователям. Командаmysqladmin processlist
выводит текст запросов, обрабатываемых в данный момент. Следовательно, любой пользователь, имеющий право на выполнение этой команды, получает возможность прочитать, например, такой запрос другого пользователя, какUPDATE
userSET password=PASSWORD('not_secure')
.mysqld
резервирует добавочное подключение для пользователей, имеющих привилегиюPROCESS
, так что пользователь MySQL под именемroot
может подключиться и осуществлять контроль даже в том случае, когда все обычные подключения заняты.-
Не предоставляйте привилегии
FILE
всем пользователям. Любой пользователь, имеющий такую привилегию, может записать в любом месте файловой системы файл с привилегиями демонаmysqld
! Чтобы обеспечить здесь хоть минимальную защиту, все файлы создаваемые с помощью командыSELECT ... INTO OUTFILE
, сделаны общедоступными для записи, но перезаписать существующие файлы нельзя.Привилегия
FILE
может быть также использована для чтения любого файла, доступного пользователю Unix, от имени которого запускается сервер.Можно также прочитать любой файл в текущую базу данных. Это может быть использовано в корыстных целях. Возможно, например, с помощью команды
LOAD DATA
загрузить/etc/passwd
в таблицу и прочесть ее позже с помощьюSELECT
. Если вы не доверяете своему DNS-серверу, используйте в таблицах привилегий вместо имен хостов IP-адреса. В любом случае следует очень осторожно относиться к внесению в таблицы привилегий записей, в которых значения имени хоста содержат шаблонные символы!
Чтобы ограничить число подключений, доступных для отдельного пользователя, можно в
mysqld
задать значение переменнойmax_user_connections
.