RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

4.2 Общие проблемы защиты и система привилегий доступа MySQL

MySQL имеет продвинутую, но ненормативную систему защиты и привилегий. Этот подробно раздел описывает, как она работает.

4.2.1 Общие принципы защиты

Любой, использующий MySQL на компьютере, связанном с Internet, должен прочитать этот раздел, чтобы избежать наиболее общих ошибок защиты.

Очень важно уделить внимание проблемам безопасности всего сервера (а не только MySQL) и защите от всех типов атак.

MySQL использует защиту, основанную на списках управления доступом (Access Control Lists ACL) для всех подключений, запросов и других операций, которые пользователь может пытаться выполнять. Имеется также поддержка для соединений, зашифрованных SSL между клиентами и сервером MySQL. Многие из понятий, обсуждаемых здесь, не специфические для MySQL: те же самые общие идеи применимы вообще почти ко всем прикладным программам.

При запуске MySQL следуйте этим руководящим принципам:

  • НИКТО И НИКОГДА (кроме пользователя MySQL ROOT) НЕ ДОЛЖЕН ИМЕТЬ ДОСТУП К ТАБЛИЦЕ user В БАЗЕ ДАННЫХ mysql!
  • Изучите систему привилегий доступа MySQL. Команды GRANT и REVOKE используются для управления доступом к MySQL. Не предоставляйте большие привилегии, чем необходимо. Никогда не предоставляйте привилегии всем хостам. Контрольный список:
    • Попробуйте mysql -u root. Если Вы способны соединиться успешно с сервером без запроса о пароле, Вы имеете проблемы. Любой может соединяться с Вашим сервером MySQL как MySQL пользователь root с полными привилегиями! Поставьте пароль пользователя.
    • Используйте команду SHOW GRANTS и проверьте, кто имеет доступ к какой базе данных. Удалите те привилегии, которые не являются необходимыми, с помощью команды REVOKE.
  • Не храните никакие пароли открытым текстом в Вашей базе данных. Взамен используйте MD5() или другую одностороннюю хеш-функцию.
  • Выбирайте хорошие пароли. По этому поводу написано и сказано уже столько, что я просто не вижу смысла повторять весь ужас паролей типа pupsik.
  • Поставьте firewall. Он защищает Вас от, по крайней мере, 50% всех типов дырок в любом программном обеспечении. Поместите MySQL за firewall или в демилитаризированной зоне (DMZ). Контрольный список:
    • Попробуйте просматривать Ваши порты из Internet, используя инструмент типа nmap. MySQL по умолчанию использует порт 3306. Этот порт должен быть недоступен кому попало. Другой простой способ проверить, является или нет Ваш порт MySQL открытым, состоит в том, чтобы попробовать следующую команду с некоторой удаленной машины, где server_host задает имя хоста Вашего сервера MySQL:
      shell> telnet server_host 3306
      
      Если Вы получаете подключение и некоторые символы, порт открыт, и должен быть закрыт на Вашем firewall или маршрутизаторе, если Вы не имеете причин хранить его открытым. Если telnet только висит или от подключения отказываются, все ХОРОШО; порт блокирован.
  • Не доверяйте никаким данным, введенным Вашими пользователями. Они могут подбросить Вам код-ловушку в виде Web forms, URL или каких-то приложений. Убедитесь, что ваша прикладная программа остается безопасной, даже если пользователь вводит нечто вроде: ``; DROP DATABASE mysql;''. Также не забудьте проверять числовые данные. Иногда помогает заключить все числовые значения в апострофы. Например: SELECT * FROM table WHERE ID='234' вместо SELECT * FROM table WHERE ID=234. MySQL автоматически преобразует эту строку в число и удаляет нечисловые символы из нее. Контрольный список:
    • Все Web-приложения:
      • Попробуйте ввод в Web-формах `'' и `"'. Если Вы получаете любой вид ошибки MySQL, исследуйте проблему сразу же.
      • Попробуйте изменить любой динамический URL добавляя %22 (`"'), %23 (`#') и %27 (`'').
      • Попробуйте менять типы данных в динамическом URL от числовых до символьных, содержащих символы из предыдущих примеров. Ваша прикладная программа должна быть безопасна!
      • Попробуйте ввести символы, пробелы и специальные символы вместо чисел в числовых полях. Ваша прикладная программа должна удалить их перед прохождением запроса к MySQL или сгенерировать ошибку. Прохождение значений без контроля типов к MySQL очень опасно!
      • Проверьте размеры данных перед прохождением их к MySQL.
      • Не давайте Вашим прикладным программам больше привилегий чем, они реально нуждаются. Проверьте, что эти программы соединяются с базой данных, используя не то имя пользователя, которое Вы используете для различных административных целей (и ни в коем случае не имя root!).
    • Пользователям языка PHP:
      • Поставьте патчи, исправляющие знаменитые ошибки переполнения буфера при обработке Web-форм!
      • Проверьте функцию addslashes(). Начиная с PHP 4.0.3, появилась функция mysql_escape_string(), которая основана на одноименной функции в MySQL C API.
    • Пользователям MySQL C API:
      • Проверьте функцию mysql_escape_string().
    • Пользователям пакета MySQL++:
      • Проверьте модификаторы escape и quote для потоков запроса.
    • Пользователям Perl DBI:
      • Проверьте метод quote().
    • Пользователям Java JDBC:
      • Используйте объект PreparedStatement.
  • Не передавайте нешифрованные данные через Internet. Эти данные доступны для каждого, кто имеет время и желание использовать их для собственных целей. Вместо этого, используйте шифрованный протокол типа SSL или SSH. MySQL поддерживает внутренние подключения SSL с версии 3.23.9. Пересылка порта SSH может использоваться, чтобы создать шифрованный и сжатый туннель для связи.
  • Обучитесь использовать утилиты tcpdump и strings. Для большинства случаев Вы можете проверять, шифрованы или нет потоки данных MySQL, выдавая команду:
    shell> tcpdump -l -i eth0 -w - src or dst port 3306|strings
    
    Это работает под Linux и должно работать с маленькими модификациями под другими системами. Если Вы не видите данные, это не всегда означает, что они фактически зашифрованы. Если Вы нуждаетесь в хорошей защите, Вы должны проконсультироваться с экспертом защиты.

4.2.2 Как защитить MySQL от крекеров

Когда Вы соединяетесь с сервером MySQL, Вы обычно должны использовать пароль. Он не передается открытым текстом, однако, алгоритм шифрования не очень силен, и с некоторым усилием умный нападаюший может расколоть пароль, если может перехватить трафик. Если подключение между пользователем и сервером проходит недоверенную сеть, Вы должны использовать SSH-туннель, чтобы шифровать связь. Увы, хакеры сделали шифрование совершенно мирной связи обычным делом. А думали ли мы все, что через три года будем совершенно спокойно воспринимать шифрование данных не в военных системах, а дома?

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

Чтобы сделать систему MySQL безопасной, Вы должны внимательно рассмотреть следующие предложения:

  • Используйте пароли для всех пользователей MySQL. Не забудьте, что любой может войти, как любой другой пользователь, просто отдав команду mysql -u other_user db_name, если этот самый other_user не имеет никакого пароля. Это общее поведение при работе с прикладными программами клиент/сервер, где клиент может определять любое имя пользователя. Вы можете изменять пароль всех пользователей, редактируя скрипт mysql_install_db прежде, чем Вы его выполните, или только пароль для MySQL-пользователя root:
    shell> mysql -u root mysql
    mysql> UPDATE user SET Password=PASSWORD('new_password')
               WHERE user='root';
    mysql> FLUSH PRIVILEGES;
    
  • Не выполняйте MySQL daemon как Unix-пользователь root. Это очень опасно, потому что любой пользователь с привилегиями FILE будет способен создать файлы как root (например, ~root/.bashrc). Чтобы предотвращать это, mysqld откажется выполняться как root, если это не определено, непосредственно используя опцию --user=root. mysqld может быть выполнен как обычный непривилегированный пользователь. Вы можете также создать нового Unix-пользователя mysql, чтобы сделать все даже более безопасным. Если Вы выполняете mysqld как другой Unix-пользователь, Вы не должны изменять имя пользователя root в таблице user потому, что имена MySQL-пользователей не имеют никакого отношения к именам пользователей Unix. Чтобы запустить mysqld как другой пользователь Unix, добавьте строку user, которая определяет имя пользователя к группе [mysqld] в файле /etc/my.cnf или в файле my.cnf в каталоге данных сервера. Например:
    [mysqld]
    user=mysql
    
    Это заставит сервер запускаться как обозначенный пользователь, неважно запускаете ли Вы его вручную, используя safe_mysqld или mysql.server. Подробности в разделе "8.3.2 Как выполнить MySQL как нормальный пользователь"..
  • Не поддерживайте ссылки на таблицы (это может быть заблокировано опцией --skip-symlink). Это особенно важно, если Вы выполняете mysqld как root, так как любой пользователь, который имеет доступ для записи к каталогам данных, может удалить любой файл в системе! Подробности в разделе "5.6.1.2 Использование символических ссылок на таблицы".
  • Проверьте, что Unix-пользователь, от имени коего выполняется mysqld является единственным, кому позволено чтение-запись в каталогах баз данных.
  • Не давайте привилегию process всем пользователям. Вывод mysqladmin processlist показывает текст в настоящее время выполняющихся запросов, так что любой пользователь, которому дозволено эту команду выдавать, мигом увидит, что кто-то выдает запрос типа UPDATE user SET password=PASSWORD('not_secure')... mysqld резервирует подключение для пользователей, которые имеют привилегию process, чтобы MySQL-пользователь root мог войти и работать, даже если все нормальные подключения уже находятся в использовании.
  • Не давайте привилегию file всем пользователям. Любой пользователь, который имеет эту привилегию, может писать файл где-нибудь в файловой системе с привилегиями mysqld daemon! Чтобы сделать это немного более безопасным, все файлы, сгенерированные SELECT ... INTO OUTFILE читаются кем угодно, и Вы не можете записывать поверх существующих файлов. Привилегия file может также использоваться, чтобы читать любой файл, доступный для Unix-пользователя, от имени которого выполняется сервер. Это может быть злоупотреблено, например, используя LOAD DATA, чтобы загрузить /etc/passwd в таблицу, которая может затем читаться с помощью SELECT.
  • Если Вы не доверяете Вашему DNS, Вы должны использовать IP вместо имен хостов (hostname) в таблицах grant. В любом случае Вы должны быть очень осторожны относительно создания записей таблицы привилегий, использующих значения hostname, которые содержат групповые символы!
  • Если Вы хотите ограничить число подключений для одиночного пользователя, Вы можете сделать это, устанавливая переменную max_user_connections в mysqld.

4.2.3 Параметры запуска для mysqld, связанные с защитой

Следующие параметры mysqld воздействуют на защиту:

--safe-show-database
С этой опцией SHOW DATABASES возвращает только те базы данных, для которых пользователь имеет некоторую привилегию.
--safe-user-create
Если включено, пользователь не может создавать новых пользователей командой GRANT, если он не имеет права INSERT на таблице mysql.user. Если Вы хотите давать пользователю доступ к созданию новых пользователей с теми привилегиями, которые он имеет право предоставить, Вы должны дать ему следующую привилегию:
GRANT INSERT(user) on mysql.user to 'user''hostname';
Это гарантирует, что пользователь не может изменять любые столбцы привилегий непосредственно, а должен использовать команду GRANT, чтобы дать привилегии другим пользователям.
--skip-grant-tables
Эта опция заставляет сервер не использовать систему привилегий вообще. Это дает каждому полный доступ ко всем базам данных! Вы можете сообщить, чтобы сервер начал использовать таблицы привилегий снова, выполняя команду mysqladmin flush-privileges или mysqladmin reload.
--skip-name-resolve
Не преобразовывать имена. Все значения столбца Host в таблицах предоставления привилегий должны быть IP-адресами или localhost.
--skip-networking
Не слушать TCP/IP подключения вообще. Все взаимодействие с mysqld должно быть выполнено через сокеты Unix. Эта опция очень рекомендуется на системах, где позволяются только локальные запросы. Эта опция не подходит для систем, которые используют MIT-PTHREADS потому, что пакет MIT-PTHREADS не поддерживает Unix-сокеты.
--skip-show-database
Инструкция SHOW DATABASES не будет возвращать ничего.

4.2.4 Что делает система привилегий

Первичная функция системы привилегий MySQL состоит в том, что она должна опознать пользователя, соединяющегося с данного компьютера, и сопоставить этого пользователя с привилегиями на базе данных типа select, insert, update и delete.

Дополнительные функциональные возможности включают способность иметь анонимного пользователя и предоставлять привилегии для MySQL-функций, типа LOAD DATA INFILE, и административных операций.

4.2.5 Как работает система привилегий

Система привилегий MySQL гарантирует, что все пользователи могут делать точно те дела, которые им будут позволены. Когда Вы соединяетесь с сервером MySQL, Вы будете идентифицированы не только по логину, который ввели, но и по адресу хоста, с которого зашли в сеть.

MySQL позволяет Вам отличить пользователей с различных компьютеров, которые, случается, имеют то же самое имя, Вы можете предоставлять один набор привилегий для подключений с одной системы, и совсем другой для того же имени, но с другой машины.

Управление доступом MySQL включает две стадии:

  • Стадия 1: сервер проверяет, стоит ли ему с Вами связываться.
  • Стадия 2: разрешив Вам соединиться с сервером, он проверяет каждый запрос, который Вы выдаете, чтобы видеть, имеете или нет Вы достаточные привилегии, чтобы выполнить его. Например, если Вы пробуете выбирать строки из таблицы в базе данных или удалить таблицу из базы данных, сервер удостоверится, что Вы имеете привилегию select для таблицы или привилегию drop для базы данных.

Сервер использует таблицы user, db и host в базе данных mysql на обеих стадиях управления доступа. Поля в этих таблицах показаны ниже:
Имя таблицыuser dbhost
Поля контекстаHost HostHost
UserDb Db
PasswordUser
Поля привилегийSelect_priv Select_privSelect_priv
Insert_privInsert_priv Insert_priv
Update_privUpdate_priv Update_priv
Delete_privDelete_priv Delete_priv
Index_privIndex_priv Index_priv
Alter_privAlter_priv Alter_priv
Create_privCreate_priv Create_priv
Drop_privDrop_priv Drop_priv
Grant_privGrant_priv Grant_priv
References_priv
Reload_priv
Shutdown_priv
Process_priv
File_priv

Для второй стадии управления доступом (проверка запроса) сервер может, если запрос включает таблицы, дополнительно консультироваться с таблицами tables_priv и columns_priv. Поля этих таблиц:
Имя таблицыtables_priv columns_priv
Поля контекстаHost Host
DbDb
UserUser
Table_nameTable_name
Column_name
Поля привилегийTable_priv Column_priv
Column_priv
Прочие поляTimestamp Timestamp
Grantor

Каждая таблица содержит поля области (контекста) и поля привилегий.

Поля контекста определяют область (контекст) каждой записи в таблицах, то есть тот контекст, в котором применяется данная запись. Например, запись в таблице user со значениями Host и User 'thomas.loc.gov' и 'bob' соответственно использовалась бы для подтверждения подключений, сделанных на сервер пользователем bob с компьютера thomas.loc.gov. Точно так же запись таблицы db с полями Host, User и Db, выставленными соответственно в thomas.loc.gov, bob и reports, использовалась бы, когда bob соединяется с компьютера thomas.loc.gov, чтобы обратиться к базе данных отчетов (reports). Таблицы tables_priv и columns_priv хранят поля области (контекста), указывающие таблицы или комбинации таблицы/столбца, к которым применяется каждая запись.

Для целей проверки доступа значения Host нечувствительны к регистру. Зато User, Password, Db и значения Table_name еще как чувствительны! Column_name нечувствительны в MySQL версии 3.22.12 или позже.

Поля привилегий указывают привилегии, предоставленные записью таблицы, то есть какие операции могут выполняться. Сервер объединяет информацию из различных таблиц предоставления привилегий, чтобы сформировать полное описание прав данного пользователя. Правила, используемые, чтобы это сделать, подробно описаны в разделе "4.2.9 Контроль доступа, стадия 2: Проверка запросов".

Поля контекста представляют собой строки, объявленные как показано ниже. Значение по умолчанию для каждой: пустая строка:

Имя поляТип
HostCHAR(60)
UserCHAR(16)
Password CHAR(16)
DbCHAR(64) (CHAR(60) для таблиц tables_priv и columns_priv)
Table_nameCHAR(60)
Column_nameCHAR(60)

В таблицах user, db и host все поля привилегий объявлены как ENUM('N','Y'): каждое может иметь значение 'N' или 'Y', значение по умолчанию 'N'.

В таблицах tables_priv и columns_priv поля привилегий объявлены как поля SET:

Имя таблицыИмя поля Возможные элементы набора
tables_privTable_priv 'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter'
tables_privColumn_priv 'Select', 'Insert', 'Update', 'References'
columns_priv Column_priv 'Select', 'Insert', 'Update', 'References'

Сервер использует таблицы предоставления подобно этому алгоритму:

  • Поля области (контекста) из таблицы user определяют, позволять или отклонить входящие подключения. Для позволенных подключений любые привилегии, предоставленные в таблице user, указывают глобальные привилегии пользователя. Эти привилегии обращаются ко всем базам данных на сервере.
  • Таблицы db и host используются вместе:
    • Поля области (контекста) таблицы db определяют, которые пользователи к каким базам данных с каких компьютеров могут обращаться. Поля привилегий определяют, какие операции позволяются.
    • Таблица host используется как расширение таблицы db, когда Вы хотите использовать запись из таблицы db, чтобы обратиться к нескольким компьютерам. Например, если Вы хотите, чтобы пользователь мог работать с базой данных с нескольких компьютеров в Вашей сети, оставьте значение Host пустым в записи пользователя таблицы db, затем заполните таблицу host, создав в ней запись для каждого из компьютеров. Этот механизм описан более подробно в разделе "4.2.9 Контроль доступа, стадия 2: Проверка запросов".
  • Таблицы tables_priv и columns_priv подобны таблице db, но более точны: они применяются в уровнях столбца и таблицы, а не на уровне всей базы данных.

Обратите внимание, что административные привилегии (reload, shutdown и т.д.) определены только в таблице user. Это потому, что административные операции выполняются непосредственно на сервере и не специфические для базы данных, так что нет никакой причины внести в список такие привилегии в других таблицах. Фактически, только таблица user должна использоваться, чтобы определить, можете ли Вы выполнять административную операцию или нет.

Привилегия file также определена только в таблице user. Это не административная привилегия, но Ваша способность читать или писать файлы на компьютере сервера также независима от базы данных, к которой Вы обращаетесь.

Сервер mysqld читает содержание таблиц только один раз, при своем запуске. Изменения для таблиц предоставления привилегий вступают в силу как сказано в разделе "4.3.3 Когда изменения привилегий вступают в силу".

Когда Вы изменяете содержание таблиц предоставления, стоит удостовериться, что Ваши изменения установили привилегии так, как Вы хотите. Для справки в диагностировании проблем обратитесь в раздел "4.2.10 Причины ошибки Access denied. Проблемы с защитой подробно рассмотрены в разделе "4.2.2 Как защитить MySQL от хакеров".

Полезный диагностический инструмент: скрипт mysqlaccess, который Yves Carlier предоставил для дистрибутива MySQL. Вызовите mysqlaccess с опцией --help, чтобы выяснить, как это работает. Обратите внимание, что mysqlaccess проверяет доступ, используя только таблицы user, db и host. Это не проверяет привилегии уровня столбца или таблицы.

4.2.6 Привилегии, предоставляемые MySQL

Информация относительно привилегий пользователя сохранена в таблицах user, db, host, tables_priv и columns_priv в базе данных mysql. Сервер MySQL читает содержание этих таблиц при запуске и при обстоятельствах, перечисленных в разделе "4.3.3 Когда изменения привилегий вступают в силу".

Имена, используемые в этом руководстве, чтобы обратиться к привилегиям, обеспеченным MySQL, показываются ниже, наряду с именем столбца таблицы, связанным с каждой привилегией в таблицах предоставления привилегий и контекста, в котором данная привилегия применяется:

ПривилегияСтолбец Контекст (поле) действия
selectSelect_priv таблицы
insertInsert_priv таблицы
updateUpdate_priv таблицы
deleteDelete_priv таблицы
indexIndex_priv таблицы
alterAlter_priv таблицы
createCreate_privбазы данных, таблицы или индексы
dropDrop_privбазы данных или таблицы
grantGrant_privбазы данных или таблицы
referencesReferences_priv базы данных или таблицы
reloadReload_priv серверное администрирование
shutdownShutdown_priv серверное администрирование
processProcess_priv серверное администрирование
fileFile_privдоступ к файлам на сервере

Привилегии select, insert, update и delete позволяют Вам выполнять операции на строках в существующих таблицах в базе данных.

Инструкции SELECT требуют привилегии select только, если они фактически восстанавливают строки из таблицы. Вы можете выполнять некоторые инструкции SELECT даже без разрешения обратиться к любой из баз данных на сервере. Например, Вы могли бы использовать клиента mysql как простой калькулятор:

mysql> SELECT 1+1;
mysql> SELECT PI()*2;

Привилегия index позволяет создавать или удалять индексы.

Привилегия alter позволяет использовать ALTER TABLE.

Привилегии create и drop позволяют создавать новые базы данных и таблицы или удалять существующие.

Обратите внимание, что, если Вы предоставляете привилегию drop для базы данных mysql пользователю, он сможет удалить всю базу данных, в которой сохранены привилегии доступа MySQL!

Привилегия grant позволяет Вам давать другим пользователям те привилегии, которыми Вы непосредственно обладаете.

Привилегия file дает Вам разрешение читать и писать файлы на сервере, используя инструкции LOAD DATA INFILE и SELECT ... INTO OUTFILE. Любой пользователь, кому эта привилегия предоставляется, может читать или писать любой файл, который доступен на чтение или запись серверу MySQL.

Оставшиеся привилегии используются для административных операций, которые выполняются, используя программу mysqladmin. Таблица ниже показывает, какие команды mysqladmin соответствуют привилегиям:

ПривилегияКоманды, разрешенные держателям данной привилегии
reloadreload, refresh, flush-privileges, flush-hosts, flush-logs и flush-tables
shutdownshutdown
processprocesslist, kill

Команда reload сообщает, что сервер должен заново прочитать таблицы предоставления привилегий. Команда refresh сбрасывает на диск все таблицы, закрывает и заново открывает журналы. Привилегия flush-privileges является синонимом для reload. Другие команды flush-* выполняют функции, подобные refresh, но в более ограниченном контексте, и могут быть предпочтительны в некоторых ситуациях. Например, если Вы хотите только сбросить на диск журналы, команда flush-logs представляет собой лучший выбор, чем refresh.

Команда shutdown выключает сервер.

Команда processlist отображает информацию относительно процессов, выполняющихся внутри сервера. Команда kill уничтожает потоки сервера. Вы всегда можете отображать или уничтожать Ваши собственные процессы, но Вы нуждаетесь в привилегии process, чтобы отображать или уничтожать процессы, инициализированные другими пользователями. Подробности в разделе "4.5.4 Синтаксис KILL".

Некоторые предосторожности при предоставлении привилегий:

  • Привилегия grant позволяет пользователям отдавать их привилегии другим пользователям. Два пользователя с различными привилегиями и с привилегией grant способны объединить свои привилегии!
  • Привилегия alter может использоваться, чтобы развалить систему привилегий, переименовывая таблицы.
  • Привилегия file может быть злоупотреблена, чтобы читать любой доступный всем на чтение файл на сервере в таблицу базы данных, к содержанию которой можно затем обращаться, используя SELECT. Это включает содержание всех баз данных на сервере!
  • Привилегия shutdown может быть злоупотреблена, чтобы лишить других пользователей доступа простым выключением сервера.
  • Привилегия process, чтобы рассмотреть текст выполняемых в настоящее время запросов, включая запросы, которые устанавливают или изменяют пароли пользователей.
  • Привилегии на базе данных mysql могут использоваться, чтобы изменить пароли и другую информацию привилегий доступа. Пароли сохранены зашифрованными, так что злонамеренный пользователь не сможет просто читать их, чтобы узнать простой текстовый пароль. Если пользователь может обращаться к столбцу пароля в mysql.user, он может использовать это, чтобы зарегистрировать нового пользователя на сервере MySQL.

Имеются некоторые вещи, которые Вы не можете делать с системой привилегий MySQL:

  • Вы не можете явно определять, что данный пользователь должен быть лишен доступа. То есть Вы не можете явно задать пользователя и затем отказать от подключения.
  • Вы не можете определять, что пользователь имеет привилегии, чтобы создавать или удалять таблицы в базе данных, но не создавать или удалять базу данных непосредственно.

4.2.7 Соединение с сервером MySQL

Клиент MySQL требует, чтобы Вы определили параметры подключения, когда Вы хотите обратиться к серверу MySQL: компьютер, с которым надо связаться, Ваше имя пользователя и пароль. Например, клиент mysql может быть запущен примерно так (факультативные параметры заключены в `[' и `]'):

shell> mysql [-h host_name] [-u user_name] [-pyour_pass]

Альтернативные формы параметров -h, -u и -p: --host=host_name, --user=user_name и --password=your_pass. Обратите внимание, что не должно быть никаких пробелов вообще между -p или --password= и паролем.

ОБРАТИТЕ ВНИМАНИЕ: Определение пароля в командной строке далеко не безопасно! Любой пользователь в Вашей системе может выяснить Ваш пароль командой, наподобие ps auxww. Подробности в разделе "4.1.2 Файл опций my.cnf".

mysql использует значения по умолчанию для параметров подключения, которые отсутствуют в командной строке:

  • Имя хоста по умолчанию: localhost.
  • Заданное по умолчанию имя пользователя: Ваше Unix-имя входа в систему.
  • Никакой пароль не задан, если отсутствует -p.

Таким образом, для Unix-пользователя joe эквивалентно:

shell> mysql -h localhost -u joe
shell> mysql -h localhost
shell> mysql -u joe
shell> mysql

Другая MySQL-клиентура ведет себя аналогично.

На Unix-системах Вы можете определять различные значения по умолчанию, которые нужно использовать, когда Вы делаете подключение, так, чтобы не надо было вводить их в командную строку, каждый раз, когда Вы вызываете программу. Это может быть выполнено двумя разными способами:

  • Вы можете определять параметры подключения в разделе [client] файла конфигурации .my.cnf в Вашем основном (домашнем) каталоге системы. Релевантный раздел файла мог бы выглядеть следующим образом:
    [client]
    host=host_name
    user=user_name
    password=your_pass
    
    Подробности в разделе "4.1.2 Файл опций my.cnf".
  • Вы можете определять параметры подключения, используя системные переменные. Компьютер назначения может быть определен для mysql в переменной MYSQL_HOST. Имя пользователя MySQL может быть определено, используя USER (это только для Windows). Пароль может быть определен, используя MYSQL_PWD (но это опасно; см. следующий раздел). Подробности в разделе "Приложение 2. Переменные окружения ".

4.2.8 Контроль доступа, стадия 1: Проверка соединения

Когда Вы пытаетесь соединиться с сервером MySQL, он принимает или отклоняет подключение, исходя из Вашей идентификации и того, можете ли Вы подтвердить ее паролем. Если нет, сервер отвергает доступ полностью. Иначе сервер принимает подключение, затем вводит Стадию 2 и ждет запросы.

Идентификация основана на двух частях информации:

  • Компьютер, с которого Вы соединяетесь
  • Ваше имя пользователя MySQL

Проверка выполняется, используя три поля области (контекста) таблицы user (Host, User и Password). Сервер принимает подключение только, если запись таблицы user соответствует Вашему hostname и имени пользователя, и Вы вводите правильный пароль.

Значения в полях области (контекста) таблицы user могут быть определены следующим образом:

  • Значение Host может быть hostname, IP-адресом или localhost, чтобы указать локальный компьютер.
  • Вы можете использовать групповые символы `%' и `_' в поле Host.
  • Значение '%' поля Host соответствует любому имени хоста (hostname).
  • Пустое значение Host означает, что привилегия должна быть получена методом операции логического AND с записью в таблице host, которая соответствует данному имени. Вы можете найти большее количество информации относительно этого в следующей главе.
  • Начиная с MySQL Version 3.23, для значений Host, определенных как IP, Вы можете определять netmask, указывая, сколько бит адреса использовать для сетевого адреса. Например:
    GRANT ALL PRIVILEGES on db.* to david@'192.58.197.0/255.255.255.0';
    
    Это позволит каждому желающему соединяться с IP, где следующее истинно:
    user_ip & netmask = host_ip.
    
    В вышеупомянутом примере все IP в интервале 192.58.197.0-192.58.197.255 могут соединяться с сервером MySQL.
  • Групповые символы не позволяются в поле User, но Вы можете определять пустое значение, которое соответствует любому имени. Если запись таблицы user, которое соответствует входящему подключению, имеет пустое имя пользователя, такой пользователь является анонимным (то есть, пользователем без имени), а не тем пользователем, имя которого по умолчанию указывает клиент. Это означает, что пустое имя пользователя применяется для всей дальнейшей проверки доступа (то есть, в течение Стадии 2).
  • Поле Password может быть пусто. Это не означает, что любой пароль подойдет, это означает, что пользователь должен соединиться без того, чтобы определить пароль.

Непустые значения Password представляют зашифрованные пароли. MySQL не сохраняет пароли в форме открытого текста. Пароли шифруются функцией PASSWORD(). Зашифрованный пароль затем используется, когда клиент/сервер проверяет, является ли пароль правильным (это будет выполнено без передачи зашифрованного пароля по сети). Обращаю внимание, что с точки зрения MySQL зашифрованный пароль представляет собой РЕАЛЬНЫЙ пароль, так что Вы не должны давать доступ к нему кому попало! В частности, не давайте нормальный доступ для чтения пользователям к таблицам в базе данных mysql!

Примеры ниже показывают, как различные комбинации значений Host и User в записях таблицы user обращаются к входящим подключениям:

Hostзначение User значениеПодключения, согласованные записью
'thomas.loc.gov''fred' fred, связавшийся с машины thomas.loc.gov
'thomas.loc.gov'''Любой пользователь, связавшийся с машины thomas.loc.gov
'%''fred' fred, связавшийся с любой машины
'%'''Любой пользователь, связавшийся с любой машины
'%.loc.gov''fred' fred, связавшийся с любой машины в домене loc.gov
'x.y.%''fred'fred , связавшийся с x.y.net, x.y.com, x.y.edu и т.д.
'144.155.166.177''fred' fred, связавшийся с машины с IP-адресом 144.155.166.177
'144.155.166.%''fred' fred, связавшийся с любой машины в сети 144.155.166 коасса C
'144.155.166.0/255.255.255.0''fred' Аналогично предыдущему примеру

Поскольку Вы можете использовать символы подстановки в IP-адресах в поле Host (например, '144.155.166.%', чтобы соответствовать каждому компьютеру в подсети), есть возможность, что кто-то может попробовать эксплуатировать это свойство, именуя свой компьютер 144.155.166.somewhere.com. Чтобы мешать таким попыткам, MySQL отвергает соответствие имен хостов, которые начинаются с цифр и точки. Таким образом, если Вы имеете компьютер с именем наподобие 3.6.foo.com, его имя никогда не будет соответствовать столбцу Host таблиц. Только IP-адрес может соответствовать символам подстановки в IP-адресе.

Входящее подключение может быть согласовано более, чем с одной записью в таблице user. Например, подключение пользователя fred с машины thomas.loc.gov согласовано несколькими записями, показанными выше. Как сервер выбирает, которую запись использовать в данной ситуации? Он решает этот вопрос, сортируя таблицу user после ее чтения при запуске. Затем записи просматриваются в отсортированном порядке. Используется первое совпадение.

Сортировка таблицы user работает следующим образом. Предположим, что таблица user выглядит следующим образом:

+-----------+----------+-
| Host      | User     | ...
+-----------+----------+-
| %         | root     | ...
| %         | jeffrey  | ...
| localhost | root     | ...
| localhost |          | ...
+-----------+----------+-

Когда сервер читает таблицу, он располагает записи с наиболее специфическими значениями Host вначале ('%' в столбце Host означает любой компьютер, а, стало быть, наименее специфический). Записи с одинаковыми значениями Host упорядочиваются с наиболее специфическими значениями User (пустое значение User означает любого пользователя, и наименее специфическое). Возникающая в результате сортировки таблица user выглядит следующим образом:

+-----------+----------+-
| Host      | User     | ...
+-----------+----------+-
| localhost | root     | ...
| localhost |          | ...
| %         | jeffrey  | ...
| %         | root     | ...
+-----------+----------+-

Когда предпринято подключение, сервер просматривает отсортированные записи и использует первое найденное соответствие. Для подключения пользователя jeffrey с машины localhost записи со значением 'localhost' в столбце Host окажутся первыми. Из них подходит запись с пустым именем пользователя. Запись '%'/'jeffrey' тоже подходит, но она не первая.

Имеется другой пример. Предположите, что таблица user выглядит следующим образом:

+----------------+----------+-
| Host           | User     | ...
+----------------+----------+-
| %              | jeffrey  | ...
| thomas.loc.gov |          | ...
+----------------+----------+-

Отсортированная таблица будет выглядеть так:

+----------------+----------+-
| Host           | User     | ...
+----------------+----------+-
| thomas.loc.gov |          | ...
| %              | jeffrey  | ...
+----------------+----------+-

Подключение пользователя jeffrey с машины thomas.loc.gov согласовано первой записью в то время, как подключение jeffrey с машины whitehouse.gov соответствует второй записи.

Общее неправильное мнение состоит в том, что первыми будут использованы записи, в которых имя пользователя указано явно. Это не так! Только что было показано, что запись, использованная первой, имени пользователя в явном виде не имела вовсе.

Если Вы имеете проблемы при соединении с сервером, распечатайте таблицу user и отсортируйте ее вручную, чтобы видеть, где первое соответствие будет сделано.

4.2.9 Контроль доступа, стадия 2: Проверка запросов

Как только Вы устанавливаете подключение, сервер вводит Стадию 2. Для каждого запроса, который входит на подключении, сервер проверяет, имеете ли Вы достаточные привилегии, чтобы выполнить его, основываясь на типе операции. Эти привилегии могут исходить из любой из таблиц: user, db, host, tables_priv или columns_priv. Таблицы предоставления привилегий управляются с помощью команд GRANT и REVOKE. Подробности в разделе "4.3.1 Синтаксис GRANT и REVOKE".

Таблица user предоставляет привилегии, которые назначены Вам на глобальном основании, и это применяется независимо от того, какова текущая база данных. Например, если таблица user предоставляет Вам привилегию delete, Вы можете удалять строки из любой базы данных на сервере! Другими словами, привилегии таблицы user являются глобальными. Мудро предоставить привилегии в таблице user только суперпользователям типа администраторов базы данных или сервера в целом. Для других пользователей Вы должны оставить привилегии в таблице user в значении 'N' и давать их только при использовании таблиц db и host.

Таблицы db и host предоставляют специфические для базы данных привилегии. Значения в полях области могут быть определены так:

  • Групповые символы `%' и `_' могут использоваться в полях Host и Db любой таблицы.
  • Значение '%' в поле Host таблицы db означает любой компьютер. Пустое значение Host в таблице db предписывает брать информацию из таблицы host.
  • '%' или пустое значение Host в таблице host означает любой компьютер.
  • '%' или пустое значение Db в любой таблице означает любую базу данных.
  • Пустое значение User в любой таблице соответствует анонимному пользователю.

Таблицы db и host читаются и сортируются при запуске сервера по тем же правилам, что и таблица user.

Таблицы tables_priv и columns_priv предоставляют специфические для таблицы и столбца привилегии. Значения в полях области (контекста) могут быть определены так:

  • Групповые символы `%' и `_' могут использоваться в поле Host любой таблицы.
  • '%' или пустое значение Host в любой таблице означает любой компьютер.
  • Поля Db, Table_name и Column_name не могут содержать групповые символы или быть пустыми в любой таблице.

Таблицы tables_priv и columns_priv сортируются по полям Host, Db и User. Это подобно сортировке таблицы db, хотя сортировка более простая потому, что только поле Host может содержать групповые символы.

Процесс проверки запроса описан ниже.

Для административных запросов (shutdown, reload и т.д.), сервер проверяет только запись таблицы user потому, что это единственная таблица, которая определяет административные привилегии. Доступ предоставляется, если запись позволяет запрошенную операцию. Например, если Вы хотите выполнить mysqladmin shutdown, но Ваша запись в таблице user не предоставляет Вам привилегию shutdown, доступ будет отклонен без всякой проверки таблиц db или host.

Для связанных с базой данных запросов (insert, update и т.д.), сервер сначала проверит глобальные привилегии (суперпользователя) по записям в таблице user. Если запись позволяет запрошенную операцию, доступ предоставляется. Если глобальные привилегии в таблице user недостаточны, сервер определяет специфические для базы данных привилегии пользователя, проверяя таблицы db и host:

  1. Сервер смотрит в таблице db соответствия полей Host, Db и User. Поля Host и User должны соответствовать hostname соединяющегося клиентского компьютера и MySQL-имени пользователя. Поле Db должно соответствовать базе данных, к которой пользователь хочет обращаться. Если не имеется никакой записи для Host и User, доступ будет отклонен.
  2. Если имеется соответствие записи в таблице db и ее поле Host не пустое, то данная запись определяет специфические для базы данных привилегии пользователя.
  3. Если в соответствующей записи таблицы db поле Host является пустым, это выражает, что таблица host перечисляет, какие именно компьютеры имеют доступ к базе данных. В этом случае дальнейшая поисковая работа ведется в таблице host, чтобы найти соответствие полей Host и Db. Если соответствий в таблице host нет, доступ будет отклонен. Если имеется соответствие, специфические для базы данных привилегии пользователя будут вычислены как пересечение (но не объединение!) привилегий в таблицах db и host, то есть, привилегий, которые являются 'Y', в обеих записях.

После определения специфических для базы данных привилегий, предоставленных записями таблиц db и host, сервер добавляет их к глобальным привилегиям, предоставленным таблицей user. Если результат позволяет запрошенную операцию, доступ предоставляется. Иначе сервер проверяет пользовательские привилегии таблицы и столбца в таблицах tables_priv и columns_priv соответственно, добавляя их к привилегиям пользователя.

Выражаясь в терминах двоичной логики, предшествующее описание того, как привилегии пользователя будут вычислены, может быть получено так:

global privileges
OR (database privileges AND host privileges)
OR table privileges
OR column privileges

Не очень ясно, почему, если первоначально найдены глобальные привилегии пользователя в таблице user, недостаточные для запрошенной операции, сервер добавляет их к привилегиям для базы данных, таблицы и специфического столбца. Причина в том, что запрос может требовать больше, чем один тип привилегии. Например, если Вы выполняете инструкцию INSERT ... SELECT, Вы нуждаетесь в привилегиях insert и select. Ваши привилегии могут быть такими, что запись таблицы user предоставляет одну из них, а запись таблицы db разрешает другую. В этом случае Вы имеете необходимые привилегии, чтобы выполнить запрос, но сервер должен просмотреть все таблицы, чтобы разобраться в ситуации: привилегии, предоставленные записями в обеих таблицах, должны быть объединены вместе.

Таблица host может использоваться, чтобы поддерживать список безопасных машин и серверов.

В TcX таблица host хранит список всех машин в локальной сети. Им предоставляют все привилегии.

Вы можете также использовать таблицу host, чтобы указать компьютеры, которые не безопасны. Предположите, что Вы имеете машину public.your.domain, которая размещена в общем домене, который Вы не рассматриваете как безопасный. Вы можете позволять доступ всем компьютерам в Вашей сети за исключением этой системы, используя записи в таблице host:

+--------------------+----+-
| Host               | Db | ...
+--------------------+----+-
| public.your.domain | %  | ... (все привилегии установлены в 'N')
| %.your.domain      | %  | ... (все привилегии установлены в 'Y')
+--------------------+----+-

Естественно, Вы должны всегда проверять Ваши записи в таблицах предоставления привилегий (например, используя mysqlaccess), чтобы удостовериться, что Ваши привилегии доступа фактически установлены так, как Вы ожидаете.

4.2.10 Причины ошибки Access denied

Если Вы сталкиваетесь с ошибкой Access denied, когда пробуете соединиться с сервером MySQL, посмотрите список ниже. Там приведены наиболее часто встречающиеся проблемы.

  • После установки MySQL Вы выполняли скрипт mysql_install_db, чтобы установить начальное содержание таблицы предоставления привилегий? Если нет, выполните. Подробности в разделе "4.3.4 Установка начальных привилегий MySQL". Проверьте начальные привилегии, выполнив эту команду:
    shell> mysql -u root test
    
    Сервер должен позволить Вам соединиться без ошибки. Вы должны также удостовериться, что Вы имеете файл user.MYD в каталоге баз данных MySQL. Обычно это $PATH/var/mysql/user.MYD, где $PATH имя пути к корню установки MySQL.
  • После новой установки, Вы должны соединиться с сервером и установить Ваших пользователей и их разрешения доступа:
    shell> mysql -u root mysql
    
    Сервер должен позволить Вам соединиться, потому что MySQL-пользователь root первоначально не имеет никакого пароля. Это дыра в защите, так что поставьте пароль как можно быстрее! Если Вы пробуете соединиться как root и получаете эту ошибку:
    Access denied for user: '@unknown' to database mysql
    
    Это означает, что Вы не имеете записи в таблице user со значением 'root' столбца User, и что mysqld не может получить IP-адрес для Вашего клиента. В этом случае Вы должны перезапустить сервер с опцией --skip-grant-tables и отредактировать Ваш файл /etc/hosts или \windows\hosts, чтобы добавить в него запись для Вашего компьютера.
  • Если Вы получаете такую ошибку:
    shell> mysqladmin -u root -pxxxx ver
    Access denied for user: 'root@localhost' (Using password: YES)
    
    Это означает, что Вы используете неправильный пароль. Подробности в разделе "4.3.6 Установка паролей". Если Вы забыли пароль root, то можете перезапустить mysqld с опцией --skip-grant-tables, чтобы изменить пароль. Если Вы получаете вышеупомянутую ошибку, даже если Вы не определили пароль, это означает, что есть неправильный пароль в файле my.ini. Подробности в разделе "4.1.2 Файлы опций my.cnf". Вы можете отказаться от использования файлов опций с помощью параметра командной строки --no-defaults:
    shell> mysqladmin --no-defaults -u root ver
    
  • Если Вы модифицировали существующую установку MySQL из версии ранее, чем 3.22.11 до версии 3.22.11 или позже, Вы выполняли скрипт mysql_fix_privilege_tables? Если нет, сделайте это. Структура таблиц поменялась после версии 3.22.11, когда инструкция GRANT стала функциональной.
  • Если ваши привилегии изменяются в середине сеанса, может быть, суперпользователь изменил их. Перезагрузка таблиц предоставления воздействует на новые подключения пользователя, но это также воздействует и на существующие подключения, как обозначено в разделе "4.3.3 Когда изменения привилегий вступают в силу".
  • Если Вы не можете получать ваш пароль, чтобы работать, помните, что Вы должны использовать функцию PASSWORD(), если Вы устанавливаете пароль инструкцией INSERT, UPDATE или SET PASSWORD. Функция PASSWORD() не нужна, если Вы определяете пароль, используя инструкцию GRANT ... INDENTIFIED BY или вызов команды mysqladmin password. Подробности в разделе "4.3.6 Установка паролей".
  • localhost представляет собой синоним для Вашего локального hostname, а также заданный по умолчанию компьютер, с которым клиент пробует соединяться, если Вы не определяете никакого компьютер явно. Однако, подключения с localhost не работают, если Вы работаете на системе, которая использует MIT-pthreads (подключения localhost сделаны, используя Unix-сокеты, которые не поддержаны MIT-pthreads). Чтобы избежать этой проблемы на таких системах, Вы должны использовать опцию --host, чтобы назвать компьютер сервера явно. Это будет делать TCP/IP-подключение (не через сокеты!) к серверу mysqld. В этом случае Вы должны иметь Ваш реальный hostname в записях таблицы user на компьютере сервера (даже если Вы запускаете клиент и сервер на одной физической машине).
  • Если Вы получаете ошибку Access denied при попытке соединиться с базой данных с помощью вызова mysql -u user_name db_name, Вы можете иметь проблему с таблицей user. Проверьте это, выполняя mysql -u root mysql и выдавая эту инструкцию SQL:
    mysql> SELECT * FROM user;
    
    Результат должен включать запись со столбцами Host и User, соответствующими hostname Вашего компьютера и Вашему MySQL-имени пользователя.
  • Обычно Вы должны иметь одну запись в таблице user, которая точно соответствует hostname и имени пользователя, которые были даны в сообщении об ошибках. Например, если Вы получаете сообщение об ошибках, которое содержит строку Using password: NO, это означает, что Вы пробовали войти в систему без пароля.
  • Если Вы получаете следующую ошибку, когда Вы пробуете соединяться не с той машины, на которой работает сервер MySQL, то нет никакой строки в таблице user, которая соответствует этому компьютеру:
    Host ... is not allowed to connect to this MySQL server
    
    Вы можете исправить это, используя инструмент командной строки mysql (на серверной системе!), чтобы добавить строку в таблицу user, db или host для комбинации user/hostname, из которой Вы пробуете соединяться, и затем выполнить mysqladmin flush-privileges. Если Вы не используете MySQL Version 3.22, и Вы не знаете IP-адрес или hostname машины, с которой Вы соединяетесь, Вы должны поместить '%' в столбец Host таблицы user и перезапустить mysqld с опцией --log на серверной машине. После попытки соединяться с машины пользователя, информация в файле регистрации MySQL укажет, как Вы в действительности соединялись. Теперь следует заменить '%' в таблице user фактическим hostname, который обнаруживается в файле регистрации. Иначе Вы будете иметь систему, которая является опасной. Другая причина для этой ошибки под Linux в том, что Вы используете двоичную версию MySQL, которая компилируется не с той версией glibc, которую Вы используете. В этом случае Вы должны или обновить OS/glibc, или скачать исходник MySQL и откомпилировать их непосредственно. RPM-пакет с исходниками обычно тривиален в компиляции и установке, так что это не большая проблема.
  • Если Вы получаете сообщение об ошибках, где hostname не показывается, или где вместо hostname выводится IP-адрес, даже если Вы пробуете соединяться именно с реальным hostname:
    shell> mysqladmin -u root -pxxxx -h some-hostname ver
    Access denied for user: 'root' (Using password: YES)
    
    Это означает, что MySQL получил некоторую ошибку при попытке преобразования между IP и hostname. В этом случае Вы можете выполнять mysqladmin flush-hosts, чтобы сбросить внутренний кэш DNS. Подробности в разделе "5.5.5 Как MySQL использует DNS". Некоторые постоянные решения, которые могут помочь:
    • Попробуйте исправить ошибки в настройке Вашего сервера DNS.
    • Укажите в таблицах предоставления привилегий MySQL IP-адреса вместо соответствующих имен машин.
    • Запустите mysqld с опцией --skip-name-resolve.
    • Запустите mysqld с опцией --skip-host-cache.
    • Если Ваш клиент и сервер исполняются на одной машине, свяжитесь с localhost.
    • Поместите имена клиентских машин в файл /etc/hosts.
  • Если mysql -u root test работает, но mysql -h your_hostname -u root test возвращает ошибку Access denied, то Вы не можете иметь правильное имя для Вашего компьютера в таблице user. Общая проблема здесь состоит в том, что значение Host в записи таблицы определяет неквалифицированный hostname, но подпрограммы конвертации имен в адреса Вашей системы возвращают полностью квалифицированное имя домена (или наоборот). Например, если Вы имеете запись с компьютером 'tcx' в таблице user, но Ваш DNS сообщает MySQL, что Ваш hostname является tcx.subnet.se, запись не будет работать. Попробуйте добавить запись к таблице user, которая содержит IP-адрес Вашего компьютера как значение столбца Host. Альтернативно, Вы могли бы добавлять к таблице user запись со значением Host, которое содержит групповой символ, например, tcx.%. Однако, использование имен, кончающихся на `%', опасно и строго не рекомендуется!
  • Если mysql -u user_name test корректно работает, а вот mysql -u user_name other_db_name работать и не думает, Вы не имеете записи для other_db_name, перечисленной в таблице db.
  • Если mysql -u user_name db_name корректно работает, когда выполнена на машине сервера, но mysql -u host_name -u user_name db_name не работает, когда выполнена на другой машине, Вы имеете машину пользователя, не перечисленную в таблицах user или db.
  • Если Вы не можете вычислить, почему Вы получаете ошибку Access denied, удалите из таблицы user все записи, которые имеют значения Host, содержащие групповые символы (записи, которые содержат `%' или `_'). Очень частая ошибка состоит в том, чтобы вставить новую запись с Host='%' и User='some user', думая, что это позволит Вам определять localhost, чтобы соединиться из той же самой машины. Причина того, что это не работает в том, что заданные по умолчанию привилегии включают запись с Host='localhost' и User=''. Поскольку эта запись имеет в поле Host значение 'localhost', которое является более специфическим, чем '%', именно она используется в предпочтении при соединении из localhost! Правильная процедура должна вставить вторую запись с Host='localhost' и User='some_user' или удалить запись, где Host='localhost' и User=''.
  • Если Вы получаете следующую ошибку, Вы можете иметь проблему с таблицами db или host:
    Access to database denied
    
    Если запись из таблицы db имеет пустое значение в столбце Host удостоверьтесь, что имеется одна или большее количество соответствующих записей в таблице host, определяющих, к которым компьютерам применяется запись таблицы db. Если Вы получаете ошибку при использование команд SQL SELECT ... INTO OUTFILE или LOAD DATA INFILE, Ваша запись в таблице user, вероятно, не имеет привилегию file.
  • Не забудьте, что программы пользователя используют параметры подключения, определенные в файлах конфигурации или системных переменных. Подробнее об этом можно прочитать в разделе " Приложение 2. Переменные окружения". Если пользователь посылает неправильные заданные по умолчанию параметры подключения, когда Вы не определяете их в командной строке, проверьте Вашу среду и файл .my.cnf в Вашем основном каталоге. Вы могли бы также проверять системные файлы конфигурации MySQL, хотя гораздо менее вероятно, что параметры подключения пользователя будут определены именно там. Подробности в разделе "4.1.2 Файл опций my.cnf". Если Вы получаете ошибку Access denied, когда Вы выполняете клиента без параметров вообще, удостоверьтесь, что Вы не определили старый пароль в любом из файлов опций!
  • Если Вы делаете изменения для таблиц предоставления привилегий непосредственно (используя инструкции INSERT или UPDATE), и Ваши изменения игнорируются, не забывайте, что Вы должны выдать инструкцию FLUSH PRIVILEGES или выполнить команду mysqladmin flush-privileges, чтобы заставить сервер заново прочитать таблицы привилегий. Иначе Ваши изменения не будут иметь никакого эффекта до очередного перезапуска сервера. Не забудьте, что после того, как Вы устанавливаете пароль root командой UPDATE, Вы не должны определять его до того, как сбросите привилегии на диск потому, что сервер не будет знать о смене пароля!
  • Если Вы имеете проблемы доступа с Perl, PHP, Python или программой ODBC, попробуйте соединяться с сервером командой mysql -u user_name db_name или mysql -u user_name -pyour_pass db_name. Если Вы способны подключить использование mysql, имеется проблема с Вашей программой, а не с привилегиями доступа. Обратите внимание, что нет пробелов между -p и паролем. Вы можете также использовать синтаксис --password=your_pass, чтобы определить пароль. Если Вы используете единственную опцию -p, MySQL запросит Вас относительно ввода пароля.
  • Для тестирования запустите mysqld с опцией --skip-grant-tables. Затем Вы можете изменять таблицы предоставления привилегий MySQL и использовать скрипт mysqlaccess, чтобы проверить, имеют или нет Ваши модификации желательный эффект. Когда Вы будете удовлетворены Вашими изменениями, выполните mysqladmin flush-privileges, чтобы сервер mysqld начал использовать новые таблицы предоставления привилегий. Обратите внимание: перезагрузка таблиц предоставления отменяет опцию --skip-grant-tables. Это позволяет Вам сообщать, чтобы сервер начал использовать таблицы предоставления привилегий снова без перезагрузки.
  • Если все остальное терпит неудачу, запустите mysqld с опцией отладки (например, --debug=d,general,query). Это будет печатать хост и информацию пользователя относительно предпринятых подключений, а также информацию относительно каждой выданной команды. Подробности в разделе "6.1.2 Создание файлов трассировки ".
  • Если Вы имеете любые другие проблемы с таблицами предоставления привилегий MySQL и чувствуете, что Вы должны сообщить проблему в список рассылки, всегда обеспечивайте дамп таблиц предоставления привилегий MySQL. Вы можете создать дамп таблицы командой mysqldump mysql. Как всегда регистрируйте Вашу проблему при помощи скрипта mysqlbug. Подробности в разделе "1.4.1 Как сообщать об ошибках и проблемах ". В некоторых случаях придется перезапустить mysqld с опцией --skip-grant-tables, чтобы выполнить mysqldump.

Поиск

 

Найди своих коллег!