- •Кто и откуда может подключаться к серверу
- •Какой уровень привилегий должен иметь пользователь и на доступ к чему эти привилегии предоставляются
- •Как определить имя локального компьютера в таблице разрешений
- •Нужны ли пользователю административные привилегии
- •Отмена привилегий и удаление пользователей
- •Головоломка с привилегиями
- •Использование mysqlcheck для сопровождения и аварийного восстановления таблиц.
- •Mysqldump, получение дампов данных и структуры таблицы
- •Mysqlhotcopy, копирование баз данных и таблиц MySql
- •Способ хранения таблиц и баз данных
- •Выделенные разделы
- •Типы таблиц
- •Столбцы
- •Резервирование и копирование баз данных с помощью программы mysqldump
- •Использование методов прямого копирования
- •Репликация баз данных
- •Восстановление данных из архивов
- •Восстановление базы данных
- •Восстановление отдельных таблиц
- •Внутренняя безопасность: защита доступа к каталогу данных
- •Столбцы привилегий таблицы разрешений
- •Привилегии баз данных и таблиц
- •Административные привилегии
- •Как сервер управляет доступом клиентов
- •Проверка запроса
- •Как хранятся пароли в таблице user
- •Порядок сравнения столбцов
- •Как минимизировать риск при работе с таблицами разрешений
- •Установка пользователей без помощи оператора grant
- •Головоломка с привилегиями (продолжение)
Внутренняя безопасность: защита доступа к каталогу данных
Сервер MySQL включает гибкую систему привилегий, реализованную через таблицы разрешений базы данных mysql. Изменяя содержимое этих таблиц, можно предоставлять или запрещать доступ определенным клиентам. Именно таким образом обеспечивается защита от неавторизированного сетевого доступа к данным. Однако нет смысла тратить много времени и усилий на обеспечение надежной защиты баз данных от доступа сетевых пользователей, если локальный пользователь, работающий на компьютере с сервером наряду с администратором, сможет легко просматривать и изменять содержимое каталога данных. Этот вид защиты можно проигнорировать, лишь будучи полностью уверенным, что никто другой не сможет зарегистрироваться и работать на компьютере, используемом для запуска сервера MySQL
Максимальную защиту необходимо обеспечить следующим категориям.
Файлы базы данных. Очевидно, что необходимо постоянно поддерживать закрытость баз данных сервера. Владельцы баз данных обычно вполне обоснованно полагают, что содержимое их баз данных закрыто для других пользователей. Даже если они так не считают, все равно не стоит выставлять информацию на всеобщее обозрение или делать ее открытой из-за плохой защиты каталога данных.
Учетные файлы. Файлы общего журнала и журнала обновлений также должны быть надежно защищены, поскольку они включают тексты запросов. Ведь любой пользователь, обладающий доступом к файлам журналов, сможет легко отследить все транзакции с базами данных.
Важность подобной защиты еще более подчеркивается тем фактом, что в файлах журналов регистрируются даже запросы с операторами grant и SET password, включающие пароли. (Вообще-то, в MySQL используется шифрование паролей, однако оно применяется только после установления соединения с предварительной проверкой пароля. Процесс же установки пароля включает выполнение таких операторов, как GRANT, INSERT иSET PASSWORD. В файлы журналов они заносятся в обычной текстовой форме.) Взломщику, получившему доступ к файлам журналов, достаточно запустить команду grep, чтобы раскрыть важную информацию операторовgrant и password.
Не следует предоставлять пользователям компьютера, на котором установлен сервер, права чтения для файлов каталога данных, поскольку они могут легко повредить файлы состояния и таблицы баз данных. Не менее опасен и доступ с правами чтения. Обладая возможностью чтения файлов таблицы, очень легко "украсть" эти файлы и позволить другому серверу MySQL самому показать содержимое таблицы в виде простого текста. Как? Да очень просто.
Проинсталлируйте собственную версию MySQL на компьютере с сервером, установив отдельные значения порта, разъема и каталога данных.
Запустите сценарий mysql_install_db для инициализации каталога данных. Это позволит получить доступ к серверу в качестве MySQL-пользователя root, получив полный контроль над механизмом доступа. Параллельно будет создана база данных test.
Скопируйте файлы, соответствующие "украденной" таблице или таблицам в подкаталог test каталога данных сервера.
Запустите второй сервер. Вот те на! Доступ к таблицам открыт. Оператор show tables from test указывает на наличие копий "украденных" таблиц, а с помощью оператора SELECT * можно увидеть их содержимое.
Очень "злые" пользователи могут изменить полномочия учетной записи анонимного пользователя сервера, в результате чего к серверу для доступа к базе данных test сможет подключиться любой. В результате этих нехитрых действий содержимое украденных таблиц становится открытым для всех.
Задумайтесь об этом. Вне всяких сомнений, ни один администратор не захочет столкнуться с такой ситуацией.
Для определения, расположены ли в каталоге данных какие-либо незащищенные файлы и подкаталоги, достаточно запустить в нем команду ls -1. Найдите все файлы и каталоги, для которых активизированы "групповые" или "другие" полномочия. Вот для примера краткий список незащищенных элементов каталога данных, среди которых встречаются и подкаталоги баз данных.
% ls -1
total 10148
drwxrwxr-x 11 mysqladm wheel 1024 May 8 12:20 .
drwxr-xr-x 22 root wheel 512 May 8 13:31 ..
drwx------ 2 mysqladm mysqlgrp 512 Apr 16 15:57 menagerle
drwxrwxr-x 2 mysqladm wheel 512 Jan 25 20:43 mysql
drwxrwxr-x 7 mysqladm wheel 512 Aug 31 1998 sql-bench
drwxrwxr-x 2 mysqladm wheel 1536 May 6 06:11 test
drwx------ 2 mysqladm wheel 1024 May 8 18:43 tmp
Как видите, для доступа к одним каталогам используются правильные полномочия, для других — нет. Такая ситуация стала результатом использования сервера в течение долгого периода времени. Менее ограничивающие полномочия созданы более старыми версиями серверов, которые были менее жестки в отношении прав доступа, чем новые. (Обратите внимание, что наиболее ограничивающие доступ каталоги menagerie и tmp имеют более позднее время создания.) Последние версии MySQL обязательно проверят, чтобы эти файлы смогли прочитать только пользователи, под именем которых работает сервер.
Давайте попробуем настроить эти полномочия, чтобы доступ к файлам мог получить только пользователь сервера. Для этого можно воспользоваться средствами защиты файловой системы UNIX и определить права владения и режим данных файлов и каталогов. Выполните следующие действия.
Перейдите в каталог данных:
% cd DATADIR
Присвойте права владения всеми файлами каталога данных одной учетной записи, под управлением которой запускается сервер. (Эту операцию необходимо выполнить, зарегистрировавшись в качестве пользователяroot.) В данном пособии для такой учетной записи используются имя пользователя mysqladm и группы mysqlgrp. Изменить права владения можно с помощью одной из следующих команд:
# chown -R mysqladm.mysqlgrp .
# find . -follow -type d -print|xargs chown mysqladm.mysqlgrp
Измените режим доступа к каталогу данных и каталогам баз данных, чтобы прочитать их смог только пользователь mysqladm. В результате этого доступ к каталогу данных не смогут получить другие пользователи. Изменить режим можно с помощью одной из приведенных ниже команд, зарегистрировавшись в качестве пользователя root или mysqladm (последнее предпочтительней, поскольку позволяет минимизировать число команд, запущенных пользователем root):
% chmod -R go-rwx
% find . -follow -type d -print | xargs chmod go-rwx
Теперь права владения и режим содержимого каталога данных присвоены пользователю mysqladm. Осталось убедиться, что сервер отныне будет запускаться в качестве пользователя mysqladm, поскольку только этот пользователь имеет доступ к каталогу данных. Процедура запуска сервера в качестве нового пользователя (неroot) детально описана в лекции 2, "Общее администрирование MySQL".
После выполнения всех описанных выше действий остается лишь убедиться в правильности установки полномочий для доступа к каталогу данных.
% ls -1
total 10148
drwxrwxr-x 11 mysqladm wheel 1024 May 8 12:20 .
drwxr-xr-x 22 root wheel 512 May 8 13:31 ..
drwx------ 2 mysqladm mysqlgrp 512 Apr 16 15:57 menagerle
drwxrwxr-x 2 mysqladm wheel 512 Jan 25 20:43 mysql
drwxrwxr-x 7 mysqladm wheel 512 Aug 31 1998 sql-bench
drwxrwxr-x 2 mysqladm wheel 1536 May 6 06:11 test
drwx------ 2 mysqladm wheel 1024 May 8 18:43 tmp
...
Внешняя безопасность: защита сетевого доступа
Система безопасности MySQL достаточно гибка, поскольку позволяет настроить привилегии доступа пользователей множеством различных способов. Как правило, установка привилегий реализуется с помощью операторов GRANT и revoke, которые изменяют таблицы разрешений, управляющие клиентским доступом. Некоторые администраторы, тем не менее, все еще используют старые версии MySQL, которые не поддерживают эти операторы (до версии MySQL 3.22.11). Иногда также администраторы замечают, что при установке с помощью операторов GRANT и REVOKEпривилегии функционируют не так, как хотелось бы. В подобных ситуациях весьма полезным может оказаться знание таблиц разрешений MySQL и принципов использования их сервером для определения полномочий. Владеющий подобными знаниями администратор может добавлять, удалять или изменять привилегии пользователей посредством изменения собственнотаблиц разрешений. Более того, исследование таблиц позволяет гораздо быстрей диагностировать проблемы, связанные с доступом.
Автор предполагает, что читатель уже ознакомился с материалом лекции 3"Управление пользовательскими учетными записями", лекции 2 "Общее администрирование MySQL" и разобрался в принципах работы операторовgrant и revoke. Их применение — удобный способ установки пользовательских учетных записей MySQL и связанных с ними привилегий. Но эти операторы являют собой лишь оболочку. Реальные действия выполняются в таблицах разрешений сервера MySQL.
Структура и содержимое таблиц разрешений MySQL
Управление доступом к базам данных MySQL для клиентов, подключившихся к серверу через сеть, осуществляется с помощью содержимого таблиц разрешений. Эти таблицы входят в состав базы данных mysql и инициализируются в процессе инсталляции MySQL на компьютере. В табл. 1 и 2 представлено краткое описание структур пяти таблиц разрешений:
user, db, host,
tables_priv И columns_priv.
Таблица 1. Структура таблиц разрешений user, db и host |
|
|||
Столбцы области доступа |
|
|||
user |
db |
host |
|
|
host |
host |
host |
|
|
user |
db |
db |
|
|
password |
user |
|
|
|
Столбцы привилегий базы данных / таблицы |
|
|||
Alter priv |
Alter priv |
Alter priv |
|
|
Create priv |
Create priv |
Create priv |
|
|
Delete priv |
Delete priv |
Delete priv |
|
|
Drop priv |
Drop priv |
Drop priv |
|
|
Index priv |
Index priv |
Index priv |
|
|
Insert priv |
Insert priv |
Insert priv |
|
|
References priv |
References priv |
References priv |
|
|
Select priv |
Select priv |
Select priv |
|
|
Update priv |
Update priv |
Update priv |
|
|
Столбцы административных привилегий |
|
|||
File priv |
Grant priv |
Grant priv |
|
|
Grant priv |
|
|
|
|
Process priv |
|
|
|
|
Reload priv |
|
|
|
|
Shutdown priv |
|
|
|
|
Таблица 2. Структура таблиц привилегий tables privt и columns privt |
||||
Столбцы области доступа |
||||
Tables priv |
columns priv |
|||
Host |
Host |
|||
Db |
Db |
|||
User |
User |
|||
Table name |
Table name |
|||
Column name |
|
|||
Столбец привилегий |
||||
Table priv |
Column priv |
Таблицы разрешений содержат следующую информацию.
user. Таблица user содержит список всех пользователей, которые могут подключаться к серверу, а также их пароли и все глобальные привилегии, если таковые применяются. Все указанные в этой таблице привилегии являются глобальными и применимы ко всем базам данных. Так, например, если активизировать в этой таблице привилегию delete, соответствующий пользователь сможет удалить записи из любой таблицы. Следовательно, необходимо тщательно все обдумать, прежде чем присваивать такую привилегию.
db. Таблица db содержит список всех баз данных и пользователей, обладающих полномочиями на доступ к ним. Определенные в этой таблице привилегии применимы ко всем таблицам соответствующей базы данных.
host. Таблица host применяется вместе с таблицей db и определяет привилегии доступа к базам данных определенного компьютера. Уровень этого контроля более высокий, чем при использовании одной лишь таблицыdb. Операторы GRANT и REVOKE не могут изменять содержимое этой таблицы, поэтому на некоторых компьютерах она вообще не используется.
tables_priv. Таблица tables_priv определяет привилегии доступа к таблицам. Эти привилегии применимы ко всем столбцам определенной таблицы.
columns_priv. Таблица columns_priv определяет привилегии доступа к столбцам. Эти привилегии применимы к отдельным столбцам соответствующей таблицы.
В расположенном далее пункте "Установка пользователей без помощи оператора GRANT" рассказывается, как оператор grant изменяет информацию этих таблиц и как с помощью непосредственного редактирования аналогичных результатов может достичь администратор.
Таблицы tablespriv и columspriv впервые появились в MySQL версии 3.22.11 (вместе с оператором grant). Поэтому администраторы старых версий MySQL могут найти в базе данных mysql своего сервера только таблицыuser, db и host. Если же эти таблицы не появляются даже после обновления до версии 3.22.11 или более поздней, запустите для их создания сценарий mysql_fix_privileges_tables.
Отсутствие таблицы rowpriv объясняется невозможностью предоставления в MySQL привилегий на уровне строк. Нельзя, например, предоставить пользователю доступ только к отдельным строкам таблицы. Обеспечить подобную возможность реально можно только посредством написания соответствующей программы. Для блокировки данных на уровне записей можно использовать функцию get_lock().
Таблицы разрешений содержат столбцы двух видов: столбцы области, определяющие область применения записи, и столбцы привилегий, определяющие присваиваемые привилегии. (Некоторые таблицы разрешений включают и другого рода столбцы, однако здесь они не рассматриваются.)
Столбцы области применения таблицы разрешений
Столбцы области применения таблицы разрешений определяют, когда же применяются записи таблиц. Каждый элемент таблицы разрешений включает значения столбцов User и Host. Эти значения определяют, что данный элемент применяется при подключении определенного пользователя (User) к конкретному компьютеру (Host). (Таблица Host является исключением в этом отношении. Она используется особым способом, который в данной лекции не рассматривается.) Кроме того, другие таблицы могут содержать дополнительные столбцы. Таблица db, например, включает также столбец Db, определяющий базу данных, к которой применяется запись. Аналогичным образом таблицы tables_priv и columns_priv содержат поля области, которые ограничивают область применения записи до отдельной таблицы базы данных или отдельного столбца таблицы.