Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / MySQL / Администрирование баз данных /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


Общие проблемы безопасности и система привилегий доступа MySQL - Программирование от RIN.RU
Общие проблемы безопасности и система привилегий доступа 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. Обратитесь к разделу Файлы параметров "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


    Обратитесь к разделу Файлы параметров "my.cnf".

  • Параметры соединения можно задавать через переменные окружения. Для mysql можно задать хост при помощи MYSQL_HOST. Для задания имени пользователя для MySQL можно использовать USER (это относится только к ОС Windows). Пароль может быть задан с помощью MYSQL_PWD (но это небезопасно, см. следующий раздел). Обратитесь к разделу Переменные окружения.




Управление доступом, этап 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-адрес code>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 не разрешены имена хостов, начинающиеся с цифр и точки. Другими словами, имени хоста типа 1.2.foo.com, никогда не найдется соответствия в столбцах Host таблиц привилегий. IP-адресу с шаблонными символами может соответствовать только IP-адрес.


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


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


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


При считывании этой таблицы сервер упорядочивает записи, начиная с наиболее конкретных значений в столбце Host ("%" в столбце Host означает "любой хост" и является наименее конкретным). Записи с одинаковым значением в столбце Host упорядочиваются между собой начиная с наиболее конкретных значений в столбце User (пустое значение в столбце User означает "любой пользователь" и является наименее конкретным). Окончательно отсортированная таблица user имеет следующий вид:


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


При попытке подсоединения сервер просматривает отсортированные записи и использует первую подходящую запись. Для подсоединения с localhost пользователя jeffrey первыми подходящими записями являются записи со значением "localhost" в столбце Host. Из них запись с пустым значением имени пользователя соответствует и имени подсоединяющегося хоста и имени пользователя. (запись "%"/"jeffrey" тоже подошла бы, но она -- не первая подходящая в этой таблице).


Рассмотрим другой пример. Пусть таблица user имеет вид:


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


Отсортированная таблица выглядит следующим образом:


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


Для подсоединения пользователя jeffrey с thomas.loc.gov подходит первая запись, в то время как для подсоединения jeffrey с whitehouse.gov - вторая.


Существует распространенное заблуждение: иногда думают, что при поиске записей для данного имени пользователя, соответствующих определенному подсоединению, сервер первыми будет использовать записи, в которых этот пользователь указан явно. Это абсолютно неверно, как и продемонстрировано в предыдущем примере: для подсоединения пользователя jeffrey с thomas.loc.gov первой подходящей записью является не запись, содержащая значение "jeffrey" в поле User, а запись, не содержащая имени пользователя вовсе!


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


<<<  НазадВперед  >>>
 1  2  3  4  5  6  7  8 


 8  Комментарии к статье  8 8  Обсудить в чате

8  В тему

Администрирование баз данных

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

Управление учетными записями пользователей MySQL

Предотвращение катастроф и восстановление

Справочник по языку администрирования баз данных

Локализация MySQL и использование национальных алфавитов

Серверные сценарии и утилиты MySQL

Клиентские сценарии и утилиты MySQL

Файлы журналов MySQL

Репликация в MySQL

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь