| |
MySQL имеет продвинутую, но ненормативную систему защиты и привилегий. Этот подробно раздел описывает, как она работает.
GRANT
и REVOKE
GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name|*|*.*|db_name.*} TO user_name [IDENTIFIED BY 'password'] [, user_name [IDENTIFIED BY 'password'] ...] [REQUIRE {SSL|X509} [ISSUER issuer] [SUBJECT subject]] [WITH GRANT OPTION] REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name|*| *.*|db_name.*} FROM user_name [, user_name ...]
GRANT
реализован в MySQL Version 3.22.11 или позже. Для более
ранних версий MySQL инструкция GRANT
не делает ничего.
Команды GRANT
и REVOKE
позволяют администраторам
системы создавать пользователей, предоставлять и отменять права на
MySQL-пользователей в четырех уровнях привилегий:
mysql.user
.
mysql.db
и
mysql.host
.
mysql.tables_priv
.
mysql.columns_priv
.Если Вы даете привилегии пользователю, который не существует, он будет автоматически создан.
Для инструкций GRANT
и REVOKE
аргумент
priv_type
может быть определен как любой из следующего списка:
ALL PRIVILEGES FILE RELOAD ALTER INDEX SELECT CREATE INSERT SHUTDOWN DELETE PROCESS UPDATE DROP REFERENCES USAGE
ALL
представляет собой синоним для
ALL PRIVILEGES
. REFERENCES
пока не реализовано.
USAGE
в настоящее время представляет собой синоним для
``no privileges''. Это может быть применено, когда Вы хотите создать
пользователя, который не имеет никаких привилегий.
Чтобы отменять привилегию предоставленную командой grant,
используйте значение priv_type
параметра GRANT
OPTION
:
REVOKE GRANT OPTION ON ... FROM ...;
Значения priv_type
, которые Вы можете определять для таблицы:
SELECT
, INSERT
, UPDATE
,
DELETE
, CREATE
, DROP
,
GRANT
, INDEX
и ALTER
.
Значения priv_type
, которые Вы можете определять для столбца
(то есть, когда Вы используете аргумент column_list
):
SELECT
, INSERT
и UPDATE
.
Вы можете устанавливать глобальные привилегии, используя синтаксис
ON *.*
. Вы можете устанавливать привилегии базы данных,
используя синтаксис ON db_name.*
. Если Вы определяете
ON *
, и Вы имеете текущую базу данных, Вы установите привилегии
именно для этой базы данных. ПРЕДУПРЕЖДЕНИЕ: Если Вы
определяете ON *
, и Вы не имеете текущей базы данных,
Вы будете воздействовать на глобальные привилегии!
Чтобы приспосабливать предоставление прав на пользователей с произвольных
компьютеров, MySQL поддерживает определение значения user_name
в
форме user@host
. Если Вы хотите определять строку
user
или строку host
, содержащую специальные или
групповые символы (например, `-'), Вы можете цитировать имя
пользователя или хоста (например, 'test-user'@'test-hostname'
).
Вы можете определять групповые символы в hostname. Например,
user@"%.joker.botik.ru"
применяется к user
для
любого компьютера в домене joker.botik.ru
, а
user@"144.155.166.%"
будет применено к user
с любой
машины в сети 144.155.166
класса C.
Простая форма user
представляет собой синоним для
user@"%"
. ОБРАТИТЕ ВНИМАНИЕ: Если Вы позволяете
анонимным пользователям соединяться с сервером MySQL (что является значением
по умолчанию), Вы должны также добавить всех локальных пользователей как
user@localhost
потому, что иначе анонимная запись в таблице
mysql.user
будет применяться, когда пользователь попробует
зарегистрироваться на сервере MySQL с локальной машины! Анонимные
пользователи определены вставкой записей с User=''
в таблицу
mysql.user
. Вы можете проверять, применяется ли это у Вас,
выполняя такой запрос:
mysql> SELECT Host,User FROM mysql.user WHERE User='';
В настоящий момент GRANT
поддерживает имена хоста, базы
данных, таблицы и столбца длиной только до 60 символов. Имя пользователя
может быть длиной до 16 символов.
Привилегии для таблицы или столбца сформированы из логического ИЛИ (OR)
привилегий в каждом из четырех уровней привилегии. Например, если таблица
mysql.user
определяет, что пользователь имеет глобальную
привилегию select, это не может быть отменено записью на
других уровнях доступа!
Привилегии для столбца могут быть вычислены следующим образом:
global privileges OR (database privileges AND host privileges) OR table privileges OR column privileges
В большинстве случаев Вы предоставляете права пользователю только в одном из уровней привилегии, так что обычно это просто. Детали проверяющей привилегии процедуры подробно рассмотрены в разделе "10 Общие проблемы защиты и система привилегий доступа MySQL".
Если Вы предоставляете привилегии для комбинации user/hostname, которая не
существует в таблице mysql.user
, запись будет добавлена и
останется там пока ее не удалят командой DELETE
. Другими
словами, GRANT
может создавать записи в таблице
user
, но REVOKE
не будет удалять их. Вы должны
делать это явно, используя вызов DELETE
.
В MySQL Version 3.22.12 или позже, если новый
пользователь создан, или если Вы имеете глобальные привилегии, пароль
пользователя будет установлен в пароль, определенный предложением
IDENTIFIED BY
, если оно задано. Если пользователь уже имел
пароль, он будет заменен новым.
ПРЕДУПРЕЖДЕНИЕ: Если Вы создаете нового пользователя, но
не определяете предложение IDENTIFIED BY
, пользователь не имеет
никакого пароля. Это опасно.
Пароли также могут быть установлены командой SET PASSWORD
.
Подробности в разделе "14.5.6 Синтаксис
SET
".
Если Вы предоставляете привилегии для базы данных, запись в таблице
mysql.db
будет создана, если необходимо. Когда все привилегии
для базы данных будут удалены с помощью REVOKE
, эта запись тоже
будет удалена автоматически.
Если пользователь не имеет привилегий на таблице, данная таблица не
отображается вообще, когда пользователь запрашивает список таблиц (например,
инструкцией SHOW TABLES
).
Предложение WITH GRANT OPTION
дает пользователю способность
передать другим пользователям любые привилегии, которые этот пользователь
имеет в определенном уровне доступа. Вы должны быть внимательным к тому, кому
Вы даете привилегию grant, поскольку два пользователя с
различными привилегиями могут быть способны соединить свои привилегии!
Вы не можете предоставлять другому пользователю привилегию, которую Вы не имеете сами. Привилегия grant позволяет Вам передавать только те привилегии, которыми Вы реально обладаете.
Знайте, что, когда Вы предоставляете пользователю привилегию
grant в специфическом уровне привилегии, любые привилегии,
которые пользователь уже имеет (или получит в будущем!) в этом уровне также
могут передаваться этим пользователем кому угодно. Предположите, что Вы
предоставляете пользователю привилегию insert на базе
данных. Если Вы затем предоставляете привилегию select на
базе данных и определяете WITH GRANT OPTION
, пользователь сможет
передавать не только привилегию select, но и
insert! Если Вы затем предоставляете ему еще и привилегию
update на базе данных, этот пользователь сможет передавать
insert, select и update.
Вы не должны предоставлять привилегию alter нормальному пользователю. Если Вы это сделаете, пользователь может попробовать разрушить систему привилегии, переименовывая таблицы!
Обратите внимание, что, если Вы используете привилегии столбца или таблицы даже для одного пользователя, сервер исследует привилегии столбца и таблицы для всех пользователей, и это замедлит немного MySQL.
Когда mysqld
запускается, все привилегии читаются в память.
Привилегии, связанные с базами данных, таблицами и столбцами начинают
действовать сразу же, а связанные с пользователями сработают, когда
пользователь соединится с сервером в следующий раз. Модификации к таблицам
предоставления, которые Вы выполняете, используя GRANT
или
REVOKE
воспринимаются сервером немедленно. Если Вы изменяете
таблицы предоставления вручную (используя INSERT
,
UPDATE
и т.д.), Вы должны выполнить инструкцию
FLUSH PRIVILEGES
или запустить команду
mysqladmin flush-privileges
, чтобы сервер перезагрузил все
таблицы предоставления привилегий.
Самые большие различия между ANSI SQL и MySQL
версиями оператора GRANT
:
TRIGGER
, EXECUTE
и
UNDER
из ANSI SQL.
INSERT
только на части
столбцов в таблице, Вы можете выполнять инструкции INSERT
относительно таблицы: столбцы, для которых Вы не имеете привилегию
INSERT
будут установлены к их значениям по умолчанию. ANSI SQL
требует, чтобы Вы имели привилегию INSERT
на всех столбцах.
REVOKE
или правкой таблиц предоставления привилегий MySQL.Имеются несколько различий между использованием имен и паролей MySQL и Unix или Windows:
-u
или --user
. Это означает, что Вы не можете
делать базу данных безопасной всегда, если все имена пользователей MySQL не
имеют паролей. Любой может пытаться соединиться с сервером, используя любое
имя, и это получиться, если использовано имя, которое не имеет пароля.
PASSWORD()
и ENCRYPT()
в разделе
"6.5 Прочие функции".
Обратите внимание, что, даже если пароль сохранен в зашифрованном виде,
знания именно зашифрованного пароля вполне достаточно, чтобы соединиться с
сервером MySQL!Пользователи MySQL и их привилегии обычно создаются командой
GRANT
. Подробности в разделе "10.1
Синтаксис GRANT
и REVOKE
".
Когда Вы входите в систему на сервере MySQL с помощью клиента командной
строки, Вы должны определить пароль с помощью опции
--password=your-password
. Подробности изложены в разделе
"10.7 Связь с сервером MySQL":
mysql --user=monty --password=guess database_name
Если Вы хотите, чтобы Вас запросили относительно пароля, Вы должны
использовать аргумент --password
:
mysql --user=monty --password database_name
Или в кратком виде:
mysql -u monty -p database_name
Обратите внимание, что в последнем примере пароль НЕ database_name.
Если Вы хотите использовать опцию -p
, чтобы задать пароль,
сделайте это так:
mysql -u monty -pguess database_name
На некоторых системах библиотечный вызов, который MySQL использует для запроса пароля, автоматически урежет пароль до длины в 8 символов. Внутренне MySQL не имеет ограничений на длину пароля.
Любой, использующий MySQL на компьютере, связанном с Internet, должен прочитать этот раздел, чтобы избежать наиболее общих ошибок защиты. Данный раздел включен сюда, главным образом, по той причине, что предоставлять привилегии может (а в ряде случаев и должен) не только администратор, но и некоторые доверенные пользователи, например, начальник проекта должен предоставить исполнителю необходимые для выполнения задачи привилегии.
Очень важно уделить внимание проблемам безопасности всего сервера (а не только MySQL) и защите от всех типов атак.
MySQL использует защиту, основанную на списках управления доступом (Access Control Lists ACL) для всех подключений, запросов и других операций, которые пользователь может пытаться выполнять. Имеется также поддержка для соединений, зашифрованных SSL между клиентами и сервером MySQL. Многие из понятий, обсуждаемых здесь, не специфические для MySQL: те же самые общие идеи применимы вообще почти ко всем прикладным программам.
При запуске MySQL следуйте этим руководящим принципам:
user
В БАЗЕ ДАННЫХ mysql
!
GRANT
и
REVOKE
используются для управления доступом к MySQL. Не
предоставляйте большие привилегии, чем необходимо. Никогда не предоставляйте
привилегии всем хостам.
Контрольный список:
mysql -u root
. Если Вы способны соединиться
успешно с сервером без запроса о пароле, Вы имеете проблемы. Любой может
соединяться с Вашим сервером MySQL как MySQL пользователь root
с полными привилегиями! Поставьте пароль пользователя.
SHOW GRANTS
и проверьте, кто имеет
доступ к какой базе данных. Удалите те привилегии, которые не являются
необходимыми, с помощью команды REVOKE
.MD5()
или другую одностороннюю хеш-функцию.
nmap
. MySQL по умолчанию использует порт 3306. Этот порт
должен быть недоступен кому попало. Другой простой способ проверить, является
или нет Ваш порт MySQL открытым, состоит в том, чтобы попробовать следующую
команду с некоторой удаленной машины, где server_host
задает
имя хоста Вашего сервера MySQL:
shell> telnet server_host 3306Если Вы получаете подключение и некоторые символы, порт открыт, и должен быть закрыт на Вашем firewall или маршрутизаторе, если Вы не имеете причин хранить его открытым. Если
telnet
только висит или от подключения
отказываются, все ХОРОШО; порт блокирован.; DROP DATABASE mysql;
''.
Также не забудьте проверять числовые данные. Иногда помогает заключить все
числовые значения в апострофы. Например: SELECT * FROM table WHERE
ID='234'
вместо SELECT * FROM table WHERE ID=234
.
MySQL автоматически преобразует эту строку в число и удаляет нечисловые
символы из нее. Контрольный список:
%22
(`"'), %23
(`#') и %27
(`'').
addslashes()
. Начиная с PHP 4.0.3,
появилась функция mysql_escape_string()
, которая основана на
одноименной функции в MySQL C API.mysql_escape_string()
.escape
и quote
для потоков запроса.quote()
.PreparedStatement
.tcpdump
и
strings
. Для большинства случаев Вы можете проверять, шифрованы
или нет потоки данных MySQL, выдавая команду:
shell> tcpdump -l -i eth0 -w - src or dst port 3306|stringsЭто работает под Linux и должно работать с маленькими модификациями под другими системами. Если Вы не видите данные, это не всегда означает, что они фактически зашифрованы. Если Вы нуждаетесь в хорошей защите, Вы должны проконсультироваться с экспертом защиты.
Когда Вы соединяетесь с сервером MySQL, Вы обычно должны использовать пароль. Он не передается открытым текстом, однако, алгоритм шифрования не очень силен, и с некоторым усилием умный нападаюший может расколоть пароль, если может перехватить трафик. Если подключение между пользователем и сервером проходит недоверенную сеть, Вы должны использовать SSH-туннель, чтобы шифровать связь. Увы, хакеры сделали шифрование совершенно мирной связи обычным делом. А думали ли мы все, что через три года будем совершенно спокойно воспринимать шифрование данных не в военных системах, а дома?
Вся другая информация будет перемещена как текст, который может читаться
любым, кто способен наблюдать подключение. Если Вы обеспокоены относительно
этого, Вы можете использовать сжатый протокол (в MySQL версии 3.22 и выше),
чтобы делать такое чтение намного тяжелее. Чтобы сделать связь более
безопасной, Вы должны использовать ssh
. Вы можете скачать
исходные тексты клиентской части ssh
с
http://www.openssh.org, коммерческая
версия клиента ssh
доступна на
http://www.ssh.com. Теперь Вы можете
получить шифрованное TCP/IP подключение к серверу MySQL.
Чтобы сделать систему MySQL безопасной, Вы должны внимательно рассмотреть следующие предложения:
mysql -u other_user db_name
, если этот самый
other_user
не имеет никакого пароля. Это общее поведение при
работе с прикладными программами клиент/сервер, где клиент может определять
любое имя пользователя.
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
. Подробности в разделе
"11.3.2 Как выполнить MySQL
как нормальный пользователь"..
--skip-symlink
). Это особенно важно, если Вы выполняете
mysqld
как root, так как любой пользователь, который имеет
доступ для записи к каталогам данных, может удалить любой файл в системе!
mysqld
является единственным, кому позволено чтение-запись в
каталогах баз данных.
mysqladmin processlist
показывает текст в настоящее время
выполняющихся запросов, так что любой пользователь, которому дозволено эту
команду выдавать, мигом увидит, что кто-то выдает запрос типа
UPDATE user SET password=PASSWORD('Ваш_надежный_пароль')
. Я
понимаю, что не все приходит в голову, но много систем взломали именно из-за
таких неочевидных дыр в защите. mysqld
резервирует подключение
для пользователей, которые имеют привилегию process, чтобы
MySQL-пользователь root
мог войти и работать, даже если все
нормальные подключения уже находятся в использовании.
mysqld
daemon! Чтобы сделать это
немного более безопасным, все файлы, сгенерированные
SELECT ... INTO OUTFILE
читаются кем угодно, и Вы не можете
записывать поверх существующих файлов.
Привилегия file может также
использоваться, чтобы читать любой файл, доступный для Unix-пользователя, от
имени которого выполняется сервер. Это может быть злоупотреблено, например,
используя LOAD DATA
, чтобы загрузить /etc/passwd в
таблицу, которая может затем читаться с помощью SELECT
.
max_user_connections
в mysqld
.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
mysqld
должно быть выполнено через сокеты Unix. Эта опция очень
рекомендуется на системах, где позволяются только локальные запросы. Эта
опция не подходит для систем, которые используют MIT-PTHREADS потому, что
пакет MIT-PTHREADS не поддерживает Unix-сокеты.
--skip-show-database
SHOW DATABASES
не будет возвращать ничего.Первичная функция системы привилегий MySQL состоит в том, что она должна опознать пользователя, соединяющегося с данного компьютера, и сопоставить этого пользователя с привилегиями на базе данных типа select, insert, update и delete.
Дополнительные функциональные возможности включают способность иметь
анонимного пользователя и предоставлять привилегии для MySQL-функций, типа
LOAD DATA INFILE
, и административных операций.
Система привилегий MySQL гарантирует, что все пользователи могут делать точно те дела, которые им будут позволены. Когда Вы соединяетесь с сервером MySQL, Вы будете идентифицированы не только по логину, который ввели, но и по адресу хоста, с которого зашли в сеть.
MySQL позволяет Вам отличить пользователей с различных компьютеров, которые, случается, имеют то же самое имя, Вы можете предоставлять один набор привилегий для подключений с одной системы, и совсем другой для того же имени, но с другой машины.
Управление доступом MySQL включает две стадии:
Сервер использует таблицы user
, db
и
host
в базе данных mysql
на обеих стадиях
управления доступа. Поля в этих таблицах показаны ниже:
Имя таблицы | user |
db | host |
Поля контекста | Host |
Host | Host |
User | Db |
Db | |
Password | User | ||
Поля привилегий | Select_priv
| Select_priv | Select_priv |
Insert_priv | Insert_priv
| Insert_priv | |
Update_priv | Update_priv
| Update_priv | |
Delete_priv | Delete_priv
| Delete_priv | |
Index_priv | Index_priv |
Index_priv | |
Alter_priv | Alter_priv |
Alter_priv | |
Create_priv | Create_priv
| Create_priv | |
Drop_priv | Drop_priv |
Drop_priv | |
Grant_priv | Grant_priv |
Grant_priv | |
References_priv | |||
Reload_priv | |||
Shutdown_priv | |||
Process_priv | |||
File_priv |
Для второй стадии управления доступом (проверка запроса) сервер может,
если запрос включает таблицы, дополнительно консультироваться с таблицами
tables_priv
и columns_priv
. Поля этих таблиц:
Имя таблицы | tables_priv |
columns_priv |
Поля контекста | Host |
Host |
Db | Db | |
User | User
| |
Table_name | Table_name |
|
Column_name | ||
Поля привилегий | Table_priv
| Column_priv |
Column_priv | ||
Прочие поля | Timestamp |
Timestamp |
Grantor |
Каждая таблица содержит поля области (контекста) и поля привилегий.
Поля контекста определяют область (контекст) каждой записи в таблицах, то
есть тот контекст, в котором применяется данная запись. Например, запись в
таблице user
со значениями Host
и User
'thomas.joker.botik.ru'
и 'bob'
соответственно
использовалась бы для подтверждения подключений, сделанных на сервер
пользователем bob
с компьютера thomas.joker.botik.ru
.
Точно так же запись таблицы db
с полями Host
,
User
и Db
, выставленными соответственно в
thomas.joker.botik.ru
, bob
и reports
,
использовалась бы, когда bob
соединяется с компьютера
thomas.joker.botik.ru
, чтобы обратиться к базе данных отчетов
(reports
). Таблицы tables_priv
и
columns_priv
хранят поля области (контекста), указывающие
таблицы или комбинации таблицы/столбца, к которым применяется каждая запись.
Для целей проверки доступа значения Host
нечувствительны к регистру. Зато User
, Password
,
Db
и значения Table_name
еще как чувствительны!
Column_name
нечувствительны в MySQL версии 3.22.12 или позже.
Поля привилегий указывают привилегии, предоставленные записью таблицы, то есть какие операции могут выполняться. Сервер объединяет информацию из различных таблиц предоставления привилегий, чтобы сформировать полное описание прав данного пользователя. Правила, используемые, чтобы это сделать, подробно описаны в разделе "10.9 Контроль доступа, стадия 2: Проверка запросов".
Поля контекста представляют собой строки, объявленные как показано ниже. Значение по умолчанию для каждой: пустая строка:
Имя поля | Тип | |
Host | CHAR(60) | |
User | CHAR(16) | |
Password | CHAR(16) | |
Db | CHAR(64) |
(CHAR(60) для таблиц tables_priv и
columns_priv ) |
Table_name | CHAR(60) | |
Column_name | CHAR(60) |
В таблицах user
, db
и host
все поля
привилегий объявлены как ENUM('N','Y')
: каждое может иметь
значение 'N'
или 'Y'
, значение по умолчанию
'N'
.
В таблицах tables_priv
и columns_priv
поля
привилегий объявлены как поля SET
:
Имя таблицы | Имя поля | Возможные элементы набора |
tables_priv | Table_priv |
'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant',
'References', 'Index', 'Alter' |
tables_priv | Column_priv |
'Select', 'Insert', 'Update', 'References' |
columns_priv | Column_priv |
'Select', 'Insert', 'Update', 'References' |
Сервер использует таблицы предоставления подобно этому алгоритму:
user
определяют,
позволять или отклонить входящие подключения. Для позволенных подключений
любые привилегии, предоставленные в таблице user
, указывают
глобальные привилегии пользователя. Эти привилегии обращаются ко всем
базам данных на сервере.
db
и host
используются вместе:
db
определяют, которые
пользователи к каким базам данных с каких компьютеров могут обращаться. Поля
привилегий определяют, какие операции позволяются.
host
используется как расширение таблицы
db
, когда Вы хотите использовать запись из таблицы
db
, чтобы обратиться к нескольким компьютерам. Например, если Вы
хотите, чтобы пользователь мог работать с базой данных с нескольких
компьютеров в Вашей сети, оставьте значение Host
пустым в записи
пользователя таблицы db
, затем заполните таблицу
host
, создав в ней запись для каждого из компьютеров. Этот
механизм описан более подробно в разделе
"10.9 Контроль доступа,
стадия 2: Проверка запросов".tables_priv
и columns_priv
подобны
таблице db
, но более точны: они применяются в уровнях столбца и
таблицы, а не на уровне всей базы данных.Обратите внимание, что административные привилегии
(reload, shutdown и т.д.) определены только
в таблице user
. Это потому, что административные операции
выполняются непосредственно на сервере и не специфические для базы данных,
так что нет никакой причины внести в список такие привилегии в других
таблицах. Фактически, только таблица user
должна использоваться,
чтобы определить, можете ли Вы выполнять административную операцию или нет.
Привилегия file также определена только в таблице
user
. Это не административная привилегия, но ведь и Ваша
способность читать или писать файлы на компьютере сервера также независима от
базы данных, к которой Вы обращаетесь!
Сервер mysqld
читает содержание таблиц только один раз, при
своем запуске. Изменения для таблиц предоставления привилегий вступают в
силу как сказано в разделе "10.11
Когда изменения привилегий вступают в силу".
Когда Вы изменяете содержание таблиц предоставления, стоит удостовериться,
что Ваши изменения установили привилегии так, как Вы хотите. Для справки в
диагностировании проблем обратитесь в раздел
"10.10 Причины ошибки Access
denied
. Проблемы с защитой подробно рассмотрены в разделе
"10.2 Как защитить MySQL от хакеров".
Полезный диагностический инструмент: скрипт mysqlaccess
,
который Yves Carlier предоставил для дистрибутива MySQL. Вызовите
mysqlaccess
с опцией --help
, чтобы выяснить, как
это работает. Обратите внимание, что mysqlaccess
проверяет
доступ, используя только таблицы user
, db
и
host
. Это не проверяет привилегии уровня столбца или таблицы.
Информация относительно привилегий пользователя сохранена в таблицах
user
, db
, host
,
tables_priv
и columns_priv
в базе данных
mysql
. Сервер MySQL читает содержание этих таблиц при запуске
и при обстоятельствах, перечисленных в разделе
"10.11 Когда изменения
привилегий вступают в силу".
Имена, используемые в этом руководстве, чтобы обратиться к привилегиям, обеспеченным MySQL, показываются ниже, наряду с именем столбца таблицы, связанным с каждой привилегией в таблицах предоставления привилегий и контекста, в котором данная привилегия применяется:
Привилегия | Столбец | Контекст (поле) действия |
select | Select_priv | таблицы |
insert | Insert_priv | таблицы |
update | Update_priv | таблицы |
delete | Delete_priv | таблицы |
index | Index_priv | таблицы |
alter | Alter_priv | таблицы |
create | Create_priv | базы данных, таблицы или индексы |
drop | Drop_priv | базы данных или таблицы |
grant | Grant_priv | базы данных или таблицы |
references | References_priv |
базы данных или таблицы |
reload | Reload_priv | серверное администрирование |
shutdown | Shutdown_priv | серверное администрирование |
process | Process_priv | серверное администрирование |
file | File_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
соответствуют привилегиям:
Привилегия | Команды, разрешенные держателям данной привилегии |
reload | reload ,
refresh , flush-privileges ,
flush-hosts , flush-logs и
flush-tables |
shutdown | shutdown |
process | processlist ,
kill |
Команда reload
сообщает, что сервер должен заново прочитать
таблицы предоставления привилегий. Команда refresh
сбрасывает на
диск все таблицы, закрывает и заново открывает журналы. Привилегия
flush-privileges
является синонимом для reload
.
Другие команды flush-*
выполняют функции, подобные
refresh
, но в более ограниченном контексте, и могут быть
предпочтительны в некоторых ситуациях. Например, если Вы хотите только
сбросить на диск журналы, команда flush-logs
представляет собой
лучший выбор, чем refresh
.
Команда shutdown
выключает сервер.
Команда processlist
отображает информацию относительно
процессов, выполняющихся внутри сервера. Команда kill
уничтожает
потоки сервера. Вы всегда можете отображать или уничтожать Ваши собственные
процессы, но Вы нуждаетесь в привилегии process, чтобы
отображать или уничтожать процессы,
инициализированные другими пользователями.
Некоторые предосторожности при предоставлении привилегий:
SELECT
.
Это включает содержание всех баз данных на сервере!
mysql
могут использоваться, чтобы
изменить пароли и другую информацию привилегий доступа. Пароли сохранены
зашифрованными, так что злонамеренный пользователь не сможет просто читать
их, чтобы узнать простой текстовый пароль. Если пользователь может обращаться
к столбцу пароля в mysql.user
, он может использовать это, чтобы
зарегистрировать нового пользователя на сервере MySQL.Имеются некоторые вещи, которые Вы не можете делать с системой привилегий 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
.
mysql
использует значения по умолчанию для параметров
подключения, которые отсутствуют в командной строке:
localhost
.
-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
mysql
в переменной
MYSQL_HOST
. Имя пользователя MySQL может быть определено,
используя USER
(это только для Windows). Пароль может быть
определен, используя MYSQL_PWD
(но это опасно! Подробности по
этому вопросу чуть ниже).
Когда Вы пытаетесь соединиться с сервером MySQL, он принимает или отклоняет подключение, исходя из Вашей идентификации и того, можете ли Вы подтвердить ее паролем. Если нет, сервер отвергает доступ полностью. Иначе сервер принимает подключение, затем вводит Стадию 2 и ждет запросы.
Идентификация основана на двух частях информации:
Проверка выполняется, используя три поля области (контекста) таблицы
user
(Host
, User
и
Password
). Сервер принимает подключение только, если запись
таблицы user
соответствует Вашему hostname и имени пользователя,
и Вы вводите правильный пароль.
Значения в полях области (контекста) таблицы user
могут быть
определены следующим образом:
Host
может быть hostname, IP-адресом или
localhost
, чтобы указать локальный компьютер.
Host
.
'%'
поля Host
соответствует любому
имени хоста (hostname).
Host
означает, что привилегия должна быть
получена методом операции логического AND с записью в таблице
host
, которая соответствует данному имени. Вы можете найти
большее количество информации относительно этого в следующей главе.
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.joker.botik.ru' | 'lnz' |
lnz , связавшийся с машины thomas.joker.botik.ru |
'thomas.joker.botik.ru' | '' | Любой
пользователь, связавшийся с машины thomas.joker.botik.ru |
'%' | 'lnz' |
lnz , связавшийся с любой машины |
'%' | '' | Любой пользователь, связавшийся с любой машины |
'%.joker.botik.ru' | 'lnz' |
lnz , связавшийся с любой машины в домене joker.botik.ru |
'x.y.%' | 'lnz' | lnz
, связавшийся с x.y.net , x.y.com ,
x.y.edu и т.д. |
'144.155.166.177' | 'lnz' |
lnz , связавшийся с машины с IP-адресом
144.155.166.177 |
'144.155.166.%' | 'lnz' |
lnz , связавшийся с любой машины в сети 144.155.166
коасса C |
'144.155.166.0/255.255.255.0' | 'lnz'
| Аналогично предыдущему примеру |
Поскольку Вы можете использовать символы подстановки в IP-адресах в поле
Host
(например, 144.155.166.%
, чтобы
соответствовать каждому компьютеру в подсети), есть возможность, что кто-то
может попробовать эксплуатировать это свойство, именуя свой компьютер
144.155.166.somewhere.com
. Чтобы мешать таким попыткам, MySQL
отвергает соответствие имен хостов, которые начинаются с цифр и точки. Таким
образом, если Вы имеете компьютер с именем наподобие
3.6.foo.com
, его имя никогда не будет соответствовать столбцу
Host
таблиц. Только IP-адрес может соответствовать символам
подстановки в IP-адресе.
Входящее подключение может быть согласовано более, чем с одной записью в
таблице user
. Например, подключение пользователя
lnz
с машины thomas.joker.botik.ru
согласовано
несколькими записями, показанными выше. Как сервер выбирает, которую запись
использовать в данной ситуации? Он решает этот вопрос, сортируя таблицу
user
после ее чтения при запуске. Затем записи просматриваются в
отсортированном порядке. Используется первое совпадение.
Сортировка таблицы user
работает следующим образом.
Предположим, что таблица user
выглядит следующим образом:
+-----------+---------+- | Host | User | ... +-----------+---------+- | % | root | ... | % | alexmv | ... | localhost | root | ... | localhost | | ... +-----------+---------+-
Когда сервер читает таблицу, он располагает записи с наиболее
специфическими значениями Host
вначале ('%'
в
столбце Host
означает любой компьютер, а, стало быть, наименее
специфический). Записи с одинаковыми значениями Host
упорядочиваются с наиболее специфическими значениями User
(пустое значение User
означает любого пользователя, и наименее
специфическое). Возникающая в результате сортировки таблица user
выглядит следующим образом:
+-----------+---------+- | Host | User | ... +-----------+---------+- | localhost | root | ... | localhost | | ... | % | alexmv | ... | % | root | ... +-----------+---------+-
Когда
предпринято подключение, сервер просматривает отсортированные записи и
использует первое найденное соответствие. Для подключения пользователя
alexmv
с машины localhost
записи со значением
localhost
в столбце Host
окажутся первыми. Из них
подходит запись с пустым именем пользователя. Запись
'%'/alexmv
тоже подходит, но она не первая.
Имеется другой пример. Предположите, что таблица user
выглядит следующим образом:
+-----------------------+---------+- | Host | User | ... +-----------------------+---------+- | % | alexmv | ... | thomas.joker.botik.ru | | ... +-----------------------+---------+-
Отсортированная таблица будет выглядеть так:
+-----------------------+---------+- | Host | User | ... +-----------------------+---------+- | thomas.joker.botik.ru | | ... | % | alexmv | ... +-----------------------+---------+-
Подключение пользователя alexmv
с машины
thomas.joker.botik.ru
согласовано первой записью в то время, как
подключение alexmv
с машины rustex.botik.ru
соответствует второй записи.
Общее неправильное мнение состоит в том, что первыми будут использованы записи, в которых имя пользователя указано явно. Это не так! Только что было показано, что запись, использованная первой, имени пользователя в явном виде не имела вовсе.
Если Вы имеете проблемы при соединении с сервером, распечатайте таблицу
user
и отсортируйте ее вручную, чтобы видеть, где первое
соответствие будет сделано.
Как только Вы устанавливаете подключение, сервер вводит Стадию 2. Для
каждого запроса, который входит на подключении, сервер проверяет, имеете ли
Вы достаточные привилегии, чтобы выполнить его, основываясь на типе операции.
Эти привилегии могут исходить из любой из таблиц: user
,
db
, host
, tables_priv
или
columns_priv
. Таблицы предоставления привилегий управляются с
помощью команд GRANT
и REVOKE
. Подробности в
разделе "10.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
:
db
соответствия полей
Host
, Db
и User
. Поля
Host
и User
должны соответствовать hostname
соединяющегося клиентского компьютера и MySQL-имени пользователя. Поле
Db
должно соответствовать базе данных, к которой пользователь
хочет обращаться. Если не имеется никакой записи для Host
и
User
, доступ будет отклонен.
db
и ее поле
Host
не пустое, то данная запись определяет специфические для
базы данных привилегии пользователя.
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
),
чтобы удостовериться, что Ваши привилегии доступа фактически установлены так,
как Вы ожидаете.
Access denied
Если Вы сталкиваетесь с ошибкой Access denied
, когда пробуете
соединиться с сервером MySQL, посмотрите список ниже. Там приведены наиболее
часто встречающиеся проблемы. Большинство проблем тоносится к администратору,
и их решение находится вне прав доступа обычного пользователя. Так что, если
описанное ниже не помогает, обратитесь к администратору сервера.
shell> mysqladmin -u username -pxxxx ver Access denied for user: 'username@localhost' (Using password: YES)Это означает, что Вы используете неправильный пароль. Подробности в разделе "10.12 Установка паролей". Если Вы получаете вышеупомянутую ошибку, даже если Вы не определили пароль, это означает, что есть неправильный пароль в файле
my.ini
.
Вы можете отказаться от использования файлов опций с помощью параметра
командной строки --no-defaults
:
shell> mysqladmin --no-defaults -u username ver
PASSWORD()
, если Вы устанавливаете
пароль инструкцией INSERT
, UPDATE
или SET
PASSWORD
. Функция PASSWORD()
не нужна, если Вы
определяете пароль, используя инструкцию GRANT ... INDENTIFIED
BY
или вызов команды mysqladmin password
. Подробности в
разделе "10.12 Установка паролей".
localhost
представляет собой синоним для Вашего локального
hostname, а также заданный по умолчанию компьютер, с которым клиент пробует
соединяться, если Вы не определяете никакого компьютер явно. Однако,
подключения с localhost
не работают, если Вы работаете на
системе, которая использует MIT-pthreads (подключения localhost
сделаны, используя Unix-сокеты, которые не поддержаны MIT-pthreads). Чтобы
избежать этой проблемы на таких системах, Вы должны использовать опцию
--host
, чтобы назвать компьютер сервера явно. Это будет делать
TCP/IP-подключение (не через сокеты!) к серверу mysqld
. В этом
случае Вы должны иметь Ваш реальный hostname в записях таблицы
user
на компьютере сервера (даже если Вы запускаете клиент и
сервер на одной физической машине).
Access denied
при попытке
соединиться с базой данных с помощью вызова
mysql -u user_name db_name
, Вы можете иметь проблему с таблицей
user
. Обратитесь к администратору.
user
, которая
точно соответствует hostname и имени пользователя, которые были даны в
сообщении об ошибках. Например, если Вы получаете сообщение об ошибках,
которое содержит строку Using password: NO
, это означает, что Вы
пробовали войти в систему без пароля.
shell> mysqladmin -u root -pxxxx -h some-hostname ver Access denied for user: 'root' (Using password: YES)Это означает, что MySQL получил некоторую ошибку при попытке преобразования между IP и hostname. Если Ваш клиент и сервер исполняются на одной машине, свяжитесь с
localhost
.
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
.
db
или host
:
Access to database deniedЕсли запись из таблицы
db
имеет пустое значение в столбце
Host
удостоверьтесь, что имеется одна или большее количество
соответствующих записей в таблице host
, определяющих, к которым
компьютерам применяется запись таблицы db
. Если Вы получаете
ошибку при использование команд SQL SELECT ... INTO OUTFILE
или
LOAD DATA INFILE
, Ваша запись в таблице user
,
вероятно, не имеет привилегию file.
Access denied
, когда Вы выполняете клиента без
параметров вообще, удостоверьтесь, что Вы не определили старый пароль в любом
из файлов опций!
mysql -u user_name db_name
или
mysql -u user_name -pyour_pass db_name
. Если Вы способны
подключить использование mysql
, имеется проблема с Вашей
программой, а не с привилегиями доступа. Обратите внимание, что нет пробелов
между -p
и паролем. Вы можете также использовать синтаксис
--password=your_pass
, чтобы определить пароль. Если Вы
используете единственную опцию -p
, MySQL запросит Вас
относительно ввода пароля.
mysqldump mysql
.
Как всегда регистрируйте Вашу проблему при помощи скрипта
mysqlbug
. Подробности в разделе
"Как сообщать о сбоях и проблемах".При запуске mysqld
все содержание таблиц предоставления
привилегий читается в память и становится действующим.
Модификации к таблицам предоставления, которые Вы выполняете используя
GRANT
, REVOKE
или SET PASSWORD
вступают в силу немедленно.
Если Вы изменяете таблицы предоставления вручную (используя операторы
INSERT
, UPDATE
), Вы должны выполнить инструкцию
FLUSH PRIVILEGES
или запустить
mysqladmin flush-privileges
, или mysqladmin reload
,
чтобы сообщить, что сервер должен перезагрузил таблицы предоставления. Иначе
Ваши изменения не будут иметь никакого эффекта, пока Вы не перезапустите
сервер. Если Вы изменяете таблицы предоставления вручную, но забываете
перезагружать привилегии, Вы будете часто задаваться вопросом, почему Ваши
изменения не делают вообще ничего!
Когда сервер обращает внимания, что таблицы предоставления были изменены, на существующие подключения пользователей это воздействуют следующим образом:
USE db_name
.Изменения глобальных привилегий и пароля воздействуют, когда пользователь соединится в следующий раз.
В большинстве случаев Вы должны использовать GRANT
, чтобы
установить Ваших пользователей и их пароли, так что следующее касается только
пользоваателей профессионального уровня.
Примеры в предшествующих разделах иллюстрируют важный принцип: когда Вы
сохраняете непустой пароль, используя инструкции INSERT
или
UPDATE
, Вы должны использовать функцию PASSWORD()
для его шифрования. Это потому, что таблица user
хранит пароли в
зашифрованной форме, а не как открытый текст. Если Вы забываете этот факт,
Вы, вероятно, будет пытаться устанавливать пароли подобно этому примеру:
shell> mysql -u root mysql mysql> INSERT INTO user (Host,User,Password) VALUES('%','alexmv','biscuit'); mysql> FLUSH PRIVILEGES;
Результат: открытый текст 'biscuit'
будет сохранен как пароль
в таблице user
. Когда пользователь alexmv
попытается подключиться к серверу, клиент mysql
шифрует его
пароль с помощью вызова функции PASSWORD()
, генерирует вектор
аутентификации, основанный на зашифрованном пароле и
произвольном числе, полученном с сервера, и посылает результат сервера. Он
использует значение password
в таблице user
(а там не зашифрованное значение biscuit
!),
чтобы выполнить те же самые вычисления, и сравнивает результаты. Разумеется,
они отличаются, и сервер отклоняет подключение (а Вы долго пытаетесь понять,
почему ничего не работает):
shell> mysql -u alexmv -pbiscuit test Access denied
Пароли должны быть зашифрованы, когда они вставлены в таблицу
user
, так что инструкция INSERT
должна быть
определена подобно этому:
mysql> INSERT INTO user (Host,User,Password) VALUES('%','alexmv',PASSWORD('biscuit'));
Вы должны также использовать функцию PASSWORD()
, когда Вы
применяете инструкции SET PASSWORD
:
mysql> SET PASSWORD FOR alexmv@"%" = PASSWORD('biscuit');
Если Вы устанавливаете пароли, используя инструкции
GRANT ... IDENTIFIED BY
или вызов команды mysqladmin
password
, функция PASSWORD()
уже не нужна: там она
вызывается автоматически, так что Вы должны определить пароль
biscuit
примерно так (вот что мешало не путать людей, а сделать
единую процедуру настройки?!):
mysql> GRANT USAGE ON *.* TO alexmv@"%" IDENTIFIED BY 'biscuit';
или примерно так:
shell> mysqladmin -u alexmv password biscuit
ОБРАТИТЕ ВНИМАНИЕ: PASSWORD()
не выполняет
шифрование пароля так, как это делается в Unix.
Нецелесообразно определять Ваш пароль так, что его могут увидеть другие пользователи. Методы, которые Вы можете использовать, чтобы определить Ваш пароль, когда Вы выполняете программы-клиенты, перечислены ниже, наряду с оценкой рисков каждого метода:
mysql.user
. Знание зашифрованного пароля для пользователя делает
возможным вход в систему под именем этого пользователя.
-pyour_pass
или
--password=your_pass
в командной строке. Это удобно, но опасно
потому, что Ваш пароль становится видимым программам состояния системы
(например, ps
), которые могут вызываться другими пользователями,
чтобы отобразить командные строки. Клиенты MySQL обнуляют командные строки,
чтобы их не было видно в процессе выполнения, но имеется краткий интервал, в
течение которого значение является видимым.
-p
или --password
(без
определенного значения your_pass
). В этом случае
программа-клиент запросит пароль с терминала:
shell> mysql -u user_name -p Enter password: ********Символы * представляют Ваш пароль. Это более безопасно, чем определить пароль прямо в командной строке потому, что это не видно другим пользователям. Однако, этот метод ввода пароля подходит только для программ, которые Вы выполняете в интерактивном режиме. Если Вы хотите вызывать клиента из скрипта, который выполняется не в интерактивном режиме, не имеется никакой возможности ввести пароль с терминала. На некоторых системах Вы можете даже обнаружить, что первая строка Вашего скрипта читается и неправильно интерпретируется как Ваш пароль!
[client]
файла
.my.cnf в Вашем основном каталоге:
[client] password=your_passЕсли Вы сохраняете Ваш пароль в файле .my.cnf, не должен быть доступен на чтение (тем более на запись) никому, кроме Вас. Удостоверьтесь, что режим доступа файла
400
или 600
.
MYSQL_PWD
, но этот метод должен рассматриваться как чрезвычайно
опасный и не должен использоваться. Некоторые версии ps
включают
опцию, чтобы отобразить среду управления процессами. Ваш пароль будет видим
всем желающим использовать такую команду. Даже на системах без такой версии
ps
неблагоразумно считать, что не имеется никакого другого
метода наблюдать среды процесса.В целом, самые безопасные методы состоят в том, чтобы иметь запрос программы-клиента для пароля или определять пароль в правильно защищенном файле личных настроек .my.cnf.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |