MySQL. Библиотека профессионала - Аткинсон Л
..pdf482 Глава 26. Оптимизация
возможности
Стараться использовать меньше памя ти на этапе компиляции
Выдавать комментарии о среде компи ляции
Создавать только клиентскую программу
He создавать документацию
He создавать набор тестов производи тельности
Использовать системную версию биб лиотеки а не ту, что входит в дистрибутив
Сделать указанный набор символов основным (поумолчанию —
Использовать дополнительные набо ры символов помимо основного; аргу мент список может содержать перечень наборов символов, ключевые слова complex (включать все наборы симво лов, которые нельзя загрузить дина мически) или all (включать всенабо ры символов)
Использовать библиотеку Berkeley DB, расположеннуювуказанномкаталоге
Искать файлы заголовков Berkeley DB
каталоге
Искать библиотечные файлы Berkeley
DB в каталоге
Использовать библиотеку
Использовать библиотеку Gemini, рас положеннуювуказанномкаталоге
Когда сценарий configure окончит запустите утилиту make, чтобы создать исполняемый файл. После этого необходимо выполнить команду make которая поместит созданные файлы в соответствующие каталоги. Подроб нее об этом рассказывалось в главе 2, "Инсталляция MySQL".
главе рассказывается о том, как программа MySQL управляет привилегия ми и как можно обеспечить безопасность сервера баз данных. В MySQL приме няются списки управления доступом, традиционные для многих систем. На сервере хранятся таблицы пользовательских привилегий. Привилегии могут отно
ситься к столбцам, таблицам, базам данных или быть глобальными.
Программа MySQL выполняется в виде системного сервиса или демона, поэтому нужно учитывать средства предоставляемые операционной системой или сетевым программным обеспечением. Повысить безопасность сервера можно, ограничив к нему доступ посредством сетевого фильтра Если в базе данных хранится особо важная информация, рассмотрите возможность найма про фессионального консультанта по вопросам безопасности.
Схема привилегий
В списке управления доступом (Access Control List, ACL) указывается, какие инструк ции разрешено выполнять тем или иным пользователям. Такой список можно связать с пользователем, узлом, базой данных, таблицей или столбцом. Программа MySQL сверя ет каждое обращение к базе данных с имеющимися списками управления доступом и определяет, есть ли у пользователя право выполнить запрашиваемое действие.
Пользователи идентифицируют себя по имени, паролю и адресу узла. Пользова тельские имена и пароли MySQL не связаны напрямую с именами и паролями опера ционной системы. Просто большинство клиентов MySQL по умолчанию берет имя пользователя, которое было указано при регистрации в системе. Это довольно удоб но, хотя и не является обязательным правилом.
Пользовательские имена и пароли могут быть длиной до 16 символов. Пароль раз решается оставлять пустым. Это самый низкий уровень безопасности. Он допустим только в том когда доступ ограничивается по каким то другим критериям, на пример адресу узла.
Глава 27. Безопасность
Перечень привилегий хранится в базе данных Сценарий который запускается в ходе инсталляции программы, создает в этой базе данных пять лиц с описаниями привилегий (табл.
Таблица |
Содержимое |
|
Привилегии отдельных столбцов |
db |
Привилегии всей базы данных |
host |
Привилегии всех пользователей того или иного узла |
|
Привилегии отдельных таблиц |
user |
Глобальные привилегии |
Втаблице описываются глобальные права доступа и хранятся пользователь ские пароли. Алгоритм шифрования паролей отличается от того, который применя ется операционной системой. Пароль можно создать с помощью функции PASSWORD (см. главу 12, "Встроенные функции") или путем прямого изменения таблицы user, но удобнее всего это делать с помощью инструкции GRANT.
При попытке подключения к серверу программа MySQL обращается к таблице user и проверяет, имеет ли пользователь право на подключение. Имя, пароль и адрес узла пользователя должны соответствовать как минимум одной записи таблицы. Если этого не происходит, программа отказывает пользователю в запросе. Но даже когда подключение легитимно, пользователю может быть разрешено выполнять лишь ог раниченный набор SQL инструкций. Права доступа к данным контролируются ос тальными четырьмя таблицами базы mysql. Следует, правда, отметить, что любому зарегистрированному пользователю разрешено вводить инструкции SELECT с лите ралами в списке возвращаемыхстолбцов, например SELECT NOW
Влистинге показаны определения всех пяти таблиц привилегий.
CREATE TABLE |
|
Host |
BINARY NOT NULL DEFAULT |
Db |
BINARY NOT NULL DEFAULT |
User |
BINARY NOT NULL DEFAULT |
Table_name |
BINARY NOT NULL DEFAULT |
|
BINARY NOT NULL DEFAULT |
|
NOT NULL, |
NOT NULL DEFAULT |
|
PRIMARY KEY |
(Host, Db, User, |
CREATE TABLE db
Host BINARY NOT NULL
Db BINARY NOT NULL DEFAULT
User |
BINARY NOT NULL DEFAULT |
Select_priv |
NOT NULL DEFAULT |
|
NOT NULL DEFAULT |
Update_priv |
NOT NULL DEFAULT |
|
NOT NULL DEFAULT |
Create_priv |
NOT NULL DEFAULT |
Drop_priv |
|
NOT NULL DEFAULT |
Grant_priv |
|
NOT NULL DEFAULT |
References_priv ENUM('N1, |
NOT NULL DEFAULT |
|
Index_priv |
|
NOT NULL DEFAULT |
PRIMARY KEY |
(Host, |
NOT NULL DEFAULT |
|
||
KEY User (User) |
|
|
TYPE=MyISAM |
|
|
CREATE TABLE host |
|
|
Host |
BINARY NOT NULL DEFAULT |
|
Db |
BINARY NOT NULL DEFAULT |
|
Select_priv |
|
NOT NULL DEFAULT |
Insert_priv |
|
NOT NULL DEFAULT |
|
|
NOT NULL DEFAULT |
Delete_priv |
|
NOT NULL DEFAULT |
|
|
NOT NULL DEFAULT |
Drop_priv |
|
NOT NULL DEFAULT |
Grant_priv |
|
NOT NULL DEFAULT |
References_priv |
NOT NULL DEFAULT |
|
Index_priv |
|
NOT NULL DEFAULT |
Alter_priv |
|
NOT NULL DEFAULT |
PRIMARY KEY |
(Host, Db) |
|
TYPE=MyISAM
COMMENT='Host privileges; Merged with database privileges';
CREATE TABLE tables_priv
Host |
BINARY NOT NULL DEFAULT |
Db |
BINARY NOT NULL DEFAULT |
User |
BINARY NOT NULL DEFAULT |
|
BINARY NOT NULL DEFAULT |
Grantor |
NOT NULL DEFAULT |
Table_priv |
NOT NULL, |
|
NOT NULL DEFAULT
NOT NULL DEFAULT
PRIMARY KEY (Host, Db, User,
KEY Grantor (Grantor)
CREATE TABLE user |
|
|
Host |
BINARY NOT NULL |
DEFAULT |
User |
BINARY NOT NULL |
DEFAULT |
488 Глава 27. Безопасность
Password BINARY NOT NULL DEFAULT
Select_priv NOT NULL DEFAULT
Insert_priv NOT NULL DEFAULT
Update_priv ENUM('N', NOT NULL DEFAULT
Delete_priv NOT NULL DEFAULT
Create_priv NOT NULL DEFAULT
Drop_priv ENUM('N', NOT NULL DEFAULT
NOT NULL DEFAULT
ENUM('N', NOT NULL DEFAULT
Process_priv ENUM('N', NOT NULL DEFAULT
File_priv ENUM('N', NOT NULL DEFAULT
Grant_priv ENUM('N', NOT NULL DEFAULT
References_priv ENUM('N', NOT NULL DEFAULT
Index_priv ENUM('N', NOT NULL DEFAULT
Alter_priv ENUM('N', NOT NULL DEFAULT
PRIMARY KEY (Host, User)
and global
За каждым пользователем каждого узла в таблице user закреплен свой набор гий, заданных в виде перечислений со значениями В столбце Host содержится IP адрес либо доменное имя Разрешается использовать метасимволы % и для задания диапазона адресов. Например, выражение % com
Схема привилегий 489
именем пользователя Поскольку подобный выбор не всегда очевиден, лучше избегать пустых имен пользователей.
Таблицы и host совместноконтролируют доступ к базам данных. Подобно лице в таблице db не допускаются имена пользователей с метасимволами. При выполнении операций сравнения программа MySQL сортирует записи этой таблицы в таком порядке: имя узла, имябазы данных, имя пользователя. Другими словами, сначала выбирается наиболее точное имя узла, наиболее точное имя базы данных, а наиболее точное имя пользователя. Записи таблицы host сортиру ются сначала поимени потом — по имени базы данных.
Таблицы и tables_priv допускают наличие метасимволов в це Host, но не вдругих столбцах. Поэтому, чтобы предоставить пользователю права доступа трем столбцам таблицы, нужно задать три записи в таблице
В табл. 27.2 перечислены столбцы привилегий, встречающиеся в таблицах. Смысл каждого из них определяется таблицей, в которой он присутствует. Запись таблицы db применима ко всем таблицам базы данных. Привилегии, заданные в таблице user, являются глобальными. Есть привилегии, которые определены только на глобальном уровне. Например, право перезагрузки позволяет пользователю очищать кэш буферы, совместно используемые всеми соединениями и базами данных.
|
Описание |
|
|
Пользователь может вводить инструкцию ALTER TABLE |
|
Create_priv |
Пользователь может создавать таблицы и базы данных |
|
Delete_priv |
Пользователь может вводить инс трукцию DELETE |
|
|
Пользователь может удалять таблицы и базы данных |
|
|
Пользователь может обращаться к файлам локальной файло |
|
|
вой системы |
|
Grant_priv |
Пользователь может передавать свои привилегии другим |
|
|
пользователям |
\ |
|
|
|
|
Пользователь может добавлять или удалять индексы |
|
Insert_priv |
Пользователь может вводить инструкцию INSERT |
|
Process_priv |
Пользователь может просматривать список соединений и |
|
|
удалять соединения |
|
Reload_priv |
Пользователь может очищать буферы |
|
|
Соответствующая привилегия еще не реализована |
|
Select_priv |
Пользователь может создавать запросы к таблицам |
|
|
(инструкция SELECT) |
|
|
Пользователь может останавливать сервер |
|
Update_priv |
Пользователь может вводить инструкцию UPDATE |
490 Глава 27. Безопасность
Названия привилегий в большинстве своем соответствуют названиям инструкций поэтому легко какие права получают пользовател и благодаря той или иной привилегии. Привилегия Alter позволяет пользователю менять определения таблиц. Привилегия Create дает возможность, в зависимости от контекста, создавать таблицы или базы данных. Привилегия Delete разрешает удалять записи таблиц, а привилегия сами таблицы или базы данных. Привилегия Index позволяет создавать и уда лять индексы, привилегия Insert — вставлять записи в таблицы, а привилегии Select и Update — выполнять инструкции SELECT и UPDATE соответственно.
Привилегия разрешает пользователям выполнять инструкцию LOAD DATA INFILE, а также инструкцию SELECT с предложением INTO OUTFILE. Она определя ет лишь возможность чтения и записи файлов на сервере. Естественно, помимо этого пользователь должен иметь право чтения и записи самой таблицы. Файловые опера ции осуществляются от имени пользователя, запустившего демон Операци онная система может налагать на него свои ограничения, чтобы демон не повредил важные системные файлы.
Привилегия Grant позволяетпользователю вызывать инс трукцию GRANT для пе редачи своих привилегий другим пользователям. В инструкции GRANT разрешается указывать только те привилегии, которыми владеет текущий пользователь. Напри мер, если пользователь имеет только право создавать таблицы, то он не сможет вы полнить инструкцию GRANT RELOAD.
Привилегия Process дает пользователю возможность просматривать список единений с помощью инструкции SHOW PROCESSLIST и удалять любое соединение при помощи инструкции KILL. Подобной привилегией владеют только администра торы, имеющие доступ к утилите
Привилегия Reload позволяет пользователю вводить любую из инструкций FLUSH, описанных в главе 13, "Инструкции SQL". Обычно кэш буферы не требуют очистки, за исключением ряда случаев. При непосредственном редактировании таб личных файлов необходимо очистить табличный буфер. Если таблицы привилегий меняются в обход инструкций GRANT и REVOKE, то нужно очистить буфер привиле гий. Рядовым пользователямданная привилегия не нужна.
Привилегия Shutdown разрешает пользователю завершать работу демона mysqld. Привилегия на запуск сервера не существует, ведь если нет серверного процесса, то и некому проверять привилегию! Для перезапуска сервера необходим пользователь, обладающий соответствующими правами на уровне операционной системы. Напри мер, в Linux пользовательroot может вызвать сценарий e_mysqld.
Программа MySQL проверяет привилегии для каждой инструкции, вводимой пользователем. Процесс проверки таблиц проиллюстрирован на рис. Как только программа находит нужную привилегию, она прекращает дальнейший поиск. В пер вую очередь просматривается таблица user. Обычно у рядовых пользователей нет глобальных привилегий, поэтому программа переходит к таблицам и Каждая запись таблицы db описывает права доступа к заданной базе данных. Если поле Host является пустым, соответствующая запись должна присутствовать в таблице host. В данном случае программа выбирает только те привилегии, которые определены в обеих таблицах. Например, если в таблице db пользователю выдается привилегия Update, а в таблице host нет, программа не разрешит пользователю обновлять все таблицы базы данных.