Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Администрирование MySQL.doc
Скачиваний:
3
Добавлен:
18.04.2019
Размер:
1.3 Mб
Скачать

Внутренняя безопасность: защита доступа к каталогу данных

Сервер MySQL включает гибкую систему привилегий, реализованную через таблицы разрешений базы данных mysql. Изменяя содержимое этих таблиц, можно предоставлять или запрещать доступ определенным клиентам. Именно таким образом обеспечивается защита от неавторизированного сетевого доступа к данным. Однако нет смысла тратить много времени и усилий на обеспечение надежной защиты баз данных от доступа сетевых пользователей, если локальный пользователь, работающий на компьютере с сервером наряду с администратором, сможет легко просматривать и изменять содержимое каталога данных. Этот вид защиты можно проигнорировать, лишь будучи полностью уверенным, что никто другой не сможет зарегистрироваться и работать на компьютере, используемом для запуска сервера MySQL

Максимальную защиту необходимо обеспечить следующим категориям.

  • Файлы базы данных. Очевидно, что необходимо постоянно поддерживать закрытость баз данных сервера. Владельцы баз данных обычно вполне обоснованно полагают, что содержимое их баз данных закрыто для других пользователей. Даже если они так не считают, все равно не стоит выставлять информацию на всеобщее обозрение или делать ее открытой из-за плохой защиты каталога данных.

  • Учетные файлы. Файлы общего журнала и журнала обновлений также должны быть надежно защищены, поскольку они включают тексты запросов. Ведь любой пользователь, обладающий доступом к файлам журналов, сможет легко отследить все транзакции с базами данных.

Важность подобной защиты еще более подчеркивается тем фактом, что в файлах журналов регистрируются даже запросы с операторами grant и SET password, включающие пароли. (Вообще-то, в MySQL используется шифрование паролей, однако оно применяется только после установления соединения с предварительной проверкой пароля. Процесс же установки пароля включает выполнение таких операторов, как GRANT, INSERT иSET PASSWORD. В файлы журналов они заносятся в обычной текстовой форме.) Взломщику, получившему доступ к файлам журналов, достаточно запустить команду grep, чтобы раскрыть важную информацию операторовgrant и password.

Не следует предоставлять пользователям компьютера, на котором установлен сервер, права чтения для файлов каталога данных, поскольку они могут легко повредить файлы состояния и таблицы баз данных. Не менее опасен и доступ с правами чтения. Обладая возможностью чтения файлов таблицы, очень легко "украсть" эти файлы и позволить другому серверу MySQL самому показать содержимое таблицы в виде простого текста. Как? Да очень просто.

  1. Проинсталлируйте собственную версию MySQL на компьютере с сервером, установив отдельные значения порта, разъема и каталога данных.

  2. Запустите сценарий mysql_install_db для инициализации каталога данных. Это позволит получить доступ к серверу в качестве MySQL-пользователя root, получив полный контроль над механизмом доступа. Параллельно будет создана база данных test.

  3. Скопируйте файлы, соответствующие "украденной" таблице или таблицам в подкаталог test каталога данных сервера.

  4. Запустите второй сервер. Вот те на! Доступ к таблицам открыт. Оператор show tables from test указывает на наличие копий "украденных" таблиц, а с помощью оператора SELECT * можно увидеть их содержимое.

  5. Очень "злые" пользователи могут изменить полномочия учетной записи анонимного пользователя сервера, в результате чего к серверу для доступа к базе данных 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 и определить права владения и режим данных файлов и каталогов. Выполните следующие действия.

  1. Перейдите в каталог данных:

  2. % cd DATADIR

  3. Присвойте права владения всеми файлами каталога данных одной учетной записи, под управлением которой запускается сервер. (Эту операцию необходимо выполнить, зарегистрировавшись в качестве пользователяroot.) В данном пособии для такой учетной записи используются имя пользователя mysqladm и группы mysqlgrp. Изменить права владения можно с помощью одной из следующих команд:

  4. # chown -R mysqladm.mysqlgrp .

  5. # find . -follow -type d -print|xargs chown mysqladm.mysqlgrp

  6. Измените режим доступа к каталогу данных и каталогам баз данных, чтобы прочитать их смог только пользователь mysqladm. В результате этого доступ к каталогу данных не смогут получить другие пользователи. Изменить режим можно с помощью одной из приведенных ниже команд, зарегистрировавшись в качестве пользователя root или mysqladm (последнее предпочтительней, поскольку позволяет минимизировать число команд, запущенных пользователем root):

  7. % chmod -R go-rwx

  8. % find . -follow -type d -print | xargs chmod go-rwx

  9. Теперь права владения и режим содержимого каталога данных присвоены пользователю 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 содержат поля области, которые ограничивают область применения записи до отдельной таблицы базы данных или отдельного столбца таблицы.