Управление доступом, этап 1: верификация подсоединения
При попытке соединения с сервером MySQL он либо устанавливает соединение, либо отказывает в нем - на основе данных о вашей личности и того, можете ли вы подтвердить их соответствующим паролем. Если нет, сервер полностью отказывает вам в доступе. В противном случае сервер устанавливает соединение, затем переходит ко второму этапу и ожидает запросов.
Личность задается двумя порциями информации:
хостом, с которого вы подсоединяетесь
вашим именем пользователя MySQL
Проверка личности осуществляется с помощью трех полей контекста таблицы user (Host, User и Password). Сервер устанавливает соединение только в том случае, если находит в таблице user запись, в которой имя хоста и имя пользователя совпадают с введенными вами, и вы указываете правильный пароль.
Значения в полях контекста таблицы user могут задаваться следующим образом:
В поле Host может указываться имя хоста, либо его IP-адрес, либо 'localhost' для обозначения локального хоста.
В поле Host разрешается использовать шаблонные символы `%' и `_'.
Значение '%' в поле Host означает любое имя хоста.
Пустое значение в поле Host означает, что к этой привилегии должна быть добавлена запись в таблице host, совпадающая с заданным именем хоста. Дополнительную информацию по данной теме вы найдете в следующем разделе.
Начиная с версии MySQL 3.23 для значений в поле в поле Host, определенных в виде IP-адресов, можно задавать сетевую маску, указывающую, сколько разрядов адреса будет использоваться для указания номера сети. Например:
mysql> 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' | То же самое, что и в предыдущем примере |