# Главная
# О библиотеке

# Выбор дистрибутива
преимущества Linux/UNIX | основные дистрибутивы | серверный Linux | BSD | LiveCDs | прочее

# Установка и удаление программ
общие вопросы | каталоги софта | специальные случаи

# Настройка и работа
установка, загрузчики | настройка Linux | консоль | файловые системы | процессы | шеллы, русификация, коммандеры | виртуальные машины, эмуляторы

# X Window и оконные менеджеры
настройка X Window | GNOME | KDE | IceWM и др.

# Работа с текстами
редакторы | офис | шрифты, кодировки и русификация | преобразования текстовых файлов | LaTeX, SGML и др. | словари

# Графика
GIMP | фото | обработка изображений | форматы графических файлов

# Сети, администрирование
общие вопросы | Dialup & PPP | брандмауэры | маршрутизация | работа в Windows-сетях | веб-серверы | Apache | прокси-серверы | сетевая печать | прочее

# Программирование
GCC & GNU make | программирование в UNIX | графические библиотеки | Tcl | Perl | PHP | Java & C# | СУБД | CVS | прочее

# Ядро
# Мультимедиа
# Интернет
# Почта
# Безопасность
# Железо
# Разное

# Linux HowTo (как сделать)
# Книги и руководства
# Материалы на английском языке


MySQL The World's Most Popular Open Source Database # Online shop | Site map |  
CompanyProductsSupport & ConsultingTraining & CertificationDownloadsDocumentation
  BooksArticlesMailing ListsPresentationsOther Sites  
Search the MySQL manual:
MySQL Manual
  • 4 Администрирование баз данных
    • 4.2 Общие проблемы безопасности и система привилегий доступа MySQL
      • 4.2.1 Общие принципы обеспечения безопасности
      • 4.2.2 Как обезопасить MySQL от хакеров
      • 4.2.3 Опции запуска mysqld, относящиеся к безопасности
      • 4.2.4 Вопросы безопасности, относящиеся к команде LOAD DATA LOCAL
      • 4.2.5 Функции, выполняемые системой привилегий
      • 4.2.6 Как работает система привилегий
      • 4.2.7 Привилегии, предоставляемые MySQL
      • 4.2.8 Соединение с сервером MySQL
      • 4.2.9 Управление доступом, этап 1: верификация подсоединения
      • 4.2.10 Управление доступом, этап 2: верификация запросов
      • 4.2.11 Причины появления ошибок Access denied ("в доступе отказано")

Buy this Reference Manual in softcover from Barnes & Noble!

MySQL Reference Manual
Previous / Next / Up / Table of Contents

4.2.2 Как обезопасить MySQL от хакеров

При подключении к серверу MySQL используется, как правило, пароль. По линии связи пароль не передается в виде открытого текста, но алгоритм шифрования не очень сложный. Толковый хакер, если ему удастся перехватить трафик между клиентом и сервером, при определенной настойчивости может взломать пароль. Поэтому если связь между клиентом и сервером осуществляется по ненадежной сети, для шифрования связи следует использовать SSH-туннель.

Вся остальная информация передается в текстовом виде и может быть прочитана кем угодно, кто в состоянии отлеживать подключение. Если это вас беспокоит, можно воспользоваться протоколом со сжатием данных (в MySQL 3.22 и последующих версиях), что значительно затруднит подобные действия. Чтобы еще более повысить безопасность связи, следует использовать протокол ssh. Open source-клиент ssh доступен на веб-сайте http://www.openssh.org/, а коммерческий ssh-клиент можно получить на веб-сайте http://www.ssh.com/. С помощью такого протокола можно обеспечить зашифрованную связь по протоколу TCP/IP между сервером MySQL и клиентом MySQL.

Если вы используете MySQL 4.0, то можете также использовать предусмотренную в этой версии поддержку протокола OpenSSL. Обратитесь к разделу See section 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 section A.3.2 Запуск MySQL от обычного пользователем.
  • Откажитесь от поддержки символических ссылок на таблицы (ее можно запретить с помощью опции --skip-symlink). Это особенно важно в том случае, если вы запускаете mysqld от имени пользователя root, поскольку у того, кто имеет право доступа для записи в каталоги данных mysqld, появляется возможность стереть любой файл в системе! Обратитесь к разделу See section 5.6.1.2 Использование символических ссылок для таблиц.
  • Удостоверьтесь, что пользователь Unix, от имени которого запускается mysqld, является единственным пользователем, имеющим привилегии чтения/записи в директории базы данных.
  • Не предоставляйте привилегии PROCESS всем пользователям. Команда mysqladmin processlist выводит текст запросов, обрабатываемых в данный момент. Следовательно, любой пользователь, имеющий право на выполнение этой команды, получает возможность прочитать, например, такой запрос другого пользователя, как UPDATE user SET 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.

User Comments

Posted by [name withheld] on Tuesday January 29 2002, @8:30am[Delete] [Edit]

It really should be pointed out that running mysqld as nobody is almost
as bad as running it as root. Toss in e.g. apache run as nobody and
anyone who can execute CGI programs can do whatever he wants to
your database. Hooray.

Posted by [email protected] on Tuesday January 29 2002, @8:30am[Delete] [Edit]

When sorting rows containing hebrew (and perhaps
some other languages who doesn't use english
characters) - hebrew is not sorted at all.
Moreover, when mixed with English rows, the
English goes out fine, while in the middle of it
are some Hebrew rows (unsorted), some more
English rows, again some Hebrew rows (again
unsorted) and so on and so on.

Nothing on the manual here as it appears. If
someone else encountered that and knows of a
workaround, I'll be glad. :-)

The field type is "text" b.t.w.

The command I am using (in php) is:
$query = mysql_query("select * from friends order
by nickname") or die(mysql_error());
while(@($r = mysql_fetch_array($query))) {

I stand to be corrected. :>

Posted by Colin Reynolds on Tuesday January 29 2002, @8:30am[Delete] [Edit]

I feel that the final comment on this page is
inappropriate and serves only to confuse the new
user, since indexes have not yet been introduced.
Also, if the "menagerie" database is no
longer used from this point on, it would make
sense to demonstrate how to remove it at this
point (DROP DATABASE menagerie"?).

Posted by [email protected] on Tuesday January 29 2002, @8:30am[Delete] [Edit]

How about being able to configure the Ip address
that mysql listens on. Would be very nice for
multihomed MySQL hosts don't you think?

For example, how about a situation in which each
box in a server
cluster is directly connected to the Internet,
with a second network
set up for intra-cluster communications that isn't
connected to the
Internet ... why expose MySQL directly to the
Internet. then?

Posted by [name withheld] on Wednesday December 18 2002, @5:28pm[Delete] [Edit]

That's what the following option to mysqld is
for:
--bind-address=IP Ip address to bind to
which can be entered into my.cnf as
follows:
[mysqld]
bind-address=192.168.1.1
or similar.

Posted by Ranjit Singh on Friday February 28 2003, @9:13am[Delete] [Edit]

Having run through the post-install, I have found that the root user has two entries; one for localhost, and one for localhost.localdomain, which is left with a blank password.

As such, a user at the machine can log into the db as root by passing -h localhost.localdomain. By using the UPDATE user.. WHERE user='root' above, you set the password for both entries.

Posted by [name withheld] on Wednesday March 5 2003, @10:42pm[Delete] [Edit]

If you run "UPDATE user SET Password=PASSWORD('new_password') ..." from a UNIX MySQL shell then it will put that exact command -including cleartext password- in your ~/.mysql_history file.

Be sure to remove it when you exit mysql. The command "cat /dev/null > ~/.mysql_history" is overkill, but works great.

Add your own comment.

Top / Previous / Next / Up / Table of Contents
# MySQL.com home | Site map | Contact us | Press | Jobs | Privacy policy | Trademark info | © 1995-2003 MySQL AB. All rights reserved.