Безопасность систем баз данных. Учебное пособие
.pdf‘the_password’;
Query OK, 0 rows affected (0.00 sec)
Запрос создает пользователяMySQL prepodavatel и разрешает ему передавать свои привилегии для базы данных music другим пользователям. Поскольку привилегия GRANT OPTION задается на уровне базы данных(prestupnost.*), пользователь prepodavatel может передать свои привилегии для этой базы данных, а также для любой таблицы или столбца в этой БД. Привилегия GRANT OPTION всегда разрешает
пользователю передавать свои права на любом более низком уровне, а также передавать все последующие привилегии, которые ему присваиваются.
Теперь протестируем новую привилегию пользователя prepodavatel. Для этого необходимо подключиться как пользователь
MySQL root:
Теперьпередадимнашипривилегии другомупользователю:
mysql> GRANT ALL ON prestupnost.* TO 'laborant'@'localhost';
Query OK, 0 rows affected (0.00 sec)
Запрос передает все привилегии новому пользователюlaborant (без пароля). Он не передает привилегию GRANT OPTION, однако при желании это можно сделать:
mysql> GRANT GRANT OPTION ON prestupnost.* TO
'laborant'@'localhost'; |
|
|
|
Query OK, 0 rows affected (0.00 sec) |
|
||
Теперь |
пользователь laborant |
имеет |
возможность |
выполнять в базе данных prestupnost те же операции, что и pre- |
|||
podavatel. |
|
|
|
Существует возможность передать привилегиюGRANT |
|||
OPTION в |
отдельной инструкции, которая подтверждает и |
||
другие привилегии. Далее представлен пример использования альтернативного синтаксиса:
mysql> GRANT ALL ON prestupnost.* to 'laborant'@'localhost' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
111
Запрос выполняет те же операции, что и предыдущий пример из двух этапов для пользователя laborant.
Пользователи могут передать привилегии на том же или более низком уровне. Рассмотрим пример, который выполняется
с подключением под учетной записью prepodavatel:
mysql> GRANT ALL ON music.artist TO 'rose'®'localhost';
Query OK, 0 rows affected (0.00 sec)
Поскольку prepodavatel обладает всеми привилегиями для всех таблиц базы данныхprestupnost, он может передать все
привилегии |
для |
таблицыgruppirovka |
любому |
новому |
пользователю. |
|
|
|
|
Как и большинство других серверов баз данных, MySQL имеет пользователей с привилегиями, определяющими их права на создание, модифицирование, удаление БД и выполнение запросов, а также на модифицирование привилегий и управление сервером. На практике это управление может бытькрупно-
структурным, |
когда пользователю разрешен |
или |
запрещен |
|
доступ |
к |
серверу, или мелкоструктурным, |
при |
котором |
пользователь имеет доступ лишь к определенным таблицам базы данных или даже к немногим столбцам таблицы. Некоторые
серверы БД поддерживают только крупноструктурное управление, а другие, в том числе и MySQL, — как крупноструктурный, так и мелкоструктурный контроль доступа к данным.
Сервер MySQL позволяет управлять получением доступа пользователей к серверу, базам данных, таблицам и столбцам на сервере, а также определять для них типы действий, которые они могут выполнять с этими структурами. Например, MySQL
разрешает |
явным |
образом управлять правом |
пользователей |
запускать |
инструкции SELECT, UPDATE, INSERT и |
DELETE, |
|
использовать для структур выраженияLOCK TABLES, ALTER, а |
|||
также создавать |
или удалять индексы. По большей части |
||
задавать пользователей с правом доступа и модификации данных в базе, но без привилегий настройки конфигурации сервера, изменения структуры БД или получения доступа к другим базам данных.
112
Пользователи |
MySQL |
отличаются |
от |
|
пользователей |
|
||||||||
операционной |
системы |
компьютера |
сервера. Настраивая |
|
||||||||||
компьютер, |
автоматически |
|
создаются |
учетные |
записи |
|
||||||||
суперпользователя, |
позволяющие |
конфигурировать |
сервер. |
В |
|
|||||||||
системе Linux или Mac OS X таким пользователем является root, |
|
|||||||||||||
а в Windows — это Administrator. Помимо |
суперпользователя |
|
||||||||||||
создается |
еще |
|
несколько |
учетных |
записей |
для |
работы |
с |
||||||
сервером. |
Например, |
может |
|
быть |
учетная |
запись |
||||||||
суперпользователя, которая применялась только при установке и |
|
|||||||||||||
конфигурировании |
программного |
обеспечения |
или |
нового |
|
|||||||||
текстового редактора. Для записи, чтения электронной почты, |
|
|||||||||||||
работы |
с Web и |
выполнения |
других операций |
вполне |
хватает |
|
||||||||
обычной учетной записи. |
|
|
|
|
|
|
|
|
|
|
||||
Обычная учетная запись не может получать доступ или |
|
|||||||||||||
модифицировать важные системные файлы, например, получать |
|
|||||||||||||
доступ к настройкам аппаратной поддержки или к журналам |
|
|||||||||||||
регистрации |
и |
|
файлам |
данных |
сервераMySQL. |
В |
|
|||||||
однопользовательской |
|
системе |
|
|
применение |
м |
||||||||
привилегированной учетной записи для выполнения ежедневной |
|
|||||||||||||
работы |
|
снижает |
вероятность |
случайного |
удаления |
важных |
|
|||||||
системных файлов или установки злонамеренных программ. На |
|
|||||||||||||
корпоративном сервере такая защита играет важную роль. Она |
|
|||||||||||||
не |
только |
дает |
возможность |
предотвратить |
случайные |
|||||||||
повреждения или злонамеренные атаки, но и обеспечивает |
|
|||||||||||||
конфиденциальность файлов и данных. |
|
|
|
|
|
|
|
|||||||
Если системная учетная запись на сервере может получать |
|
|||||||||||||
доступ к конфигурации MySQL, то она в состоянии обойтись без |
|
|||||||||||||
монитора |
(или |
любого иного клиентаMySQL) и |
выполнить |
|
||||||||||
действия непосредственно на сервере или |
в |
базах |
данных. |
|
||||||||||
Например, системный пользователь root может манипулировать |
|
|||||||||||||
в системе любым экземпляром MySQL, а обычный пользователь |
|
|||||||||||||
— лишь экземплярами, запущенными под его учетной записью. |
|
|||||||||||||
С помощью текстового редактора можно просматривать данные, |
|
|||||||||||||
индексы и структуры баз данных или |
же |
просто |
копировать |
|
||||||||||
куда-нибудь базы данных и получать к ним доступ посредством |
|
|||||||||||||
другой |
инсталляции MySQL. Поэтому |
вам следует |
принять |
|
||||||||||
113
стандартные |
меры |
предосторожности |
|
для |
поддержки |
|||
физической |
защиты |
,серверапостоянно |
|
обновлять |
||||
операционную |
|
систему, |
добавить |
сетевой |
брандмауэр, |
|||
использовать соответствующие полномочия для файлов и папок |
||||||||
и требовать сложные пароли. Помните, что если сервер не |
||||||||
защищен |
или |
взломан, то сервер MySQL полностью |
лишается |
|||||
защиты независимо от конфигурации пользователей и - при |
||||||||
вилегий MySQL. Точно так же следует позаботиться о защите |
||||||||
доступа к резервным копиям баз данных. |
|
|
|
|
||||
Создание |
и управление новыми пользователями. Для |
|||||||
создания |
нового |
пользователя |
нужно |
иметь |
полномочия. |
|||
Таковыми обладает пользователь root, поэтому мы подключимся к монитору как пользователь root:
mysql --user=root --password=12345
Теперь создадим нового пользователяkursant, который будет подключаться из той же системы, в которой запущен сервер MySQL (localhost). Предоставим этому пользователю все привилегии для всех таблиц базы prestupnostданных
(pretsupnost.*) и назначим пароль the_password:
mysql> GRANT ALL ON prestupnost.* TO ‘kursant’@’localhost’ IDENTIFIED BY ‘the_password’;
Query OK, 0 rows affected (0.02 sec)
Эта инструкция создает нового пользователя и назначает некоторые привилегии. Теперь обсудим в деталях, что именно было сделано.
Инструкция GRANT выдает привилегии пользователям. Сразу за ключевым словомGRANT следует список заданных привилегий. В нашем случае заданы привилегииALL (все простые привилегии). После списка привилегий нужно добавить ключевое слово ON вместе со списком баз данных и таблиц, для которых назначаются привилегии. В данном примере выданы привилегии для prestupnost.*, то есть БДprestupnost и всех ее таблиц. Если указанная учетная запись MySQL не существует, то она будет создана автоматически инструкцией GRANT.
В данном примере назначены привилегии для‘kursant’@’localhost’ это означает, что пользователь имеет имяkursant и может подключаться к серверу толькоlocalhostс —
114
машины, на которой установлен сервер баз данных. Для |
|
|||||||
пользовательских |
|
имен |
существует |
|
ограничение |
|||
максимальную длину, составляющую 16 символов. Символ «@» |
|
|||||||
говорит о том, что пользователь пытается подключиться |
к |
|||||||
серверу из указанного хоста. Учетная |
запись |
пользователя |
|
|||||
MySQL |
не |
|
должна |
соответствовать |
системны |
|||
пользовательским учетным записям на этом хосте и не имеет |
||||||||
никакого отношения к адресам электронной почты. Кавычки, в |
|
|||||||
которые заключены имя пользователя и имя клиентского хоста, |
|
|||||||
являются опциональными. Они нужны |
только в том случае, |
|||||||
когда в имени пользователя или хоста |
есть |
особые символы, |
||||||
такие как дефисы (-) или групповые символы. Например, можно |
|
|||||||
написать следующее: |
|
|
|
|
|
|
||
mysql> GRANT ALL ON prestupnost.* TO kur- |
|
|||||||
sant@localhost IDENTIFIED BY ‘the_password’; |
|
|
||||||
Query OK, 0 rows affected (0.02 sec) |
|
|
|
|||||
Тем не менее, рекомендуется всегда использовать кавычки |
|
|||||||
во избежание неприятных сюрпризов. |
|
|
|
|
||||
Опциональное |
выражение IDENTIFIED BY 'the_password' |
|
||||||
задает пользовательский пароль the_password. На длину пароля |
|
|||||||
ограничений не существует. |
|
|
|
|
|
|||
Теперь |
немного |
поэкспериментируем |
с |
новы |
||||
пользователем. Следует выйти из монитора с помощью команды |
|
|||||||
QUIT. Затем запустить его снова с |
использованием учетной |
|||||||
записи kursant: |
|
|
|
|
|
|
|
|
mysql --user=kursant --password=the_password |
|
|||||||
На этот раз для параметраuser |
задаем kursant, а в |
|
||||||
параметре password указали пароль этого пользователя. Вновь |
|
|||||||
должно появиться приглашение командной строки mysql. Можно |
|
|||||||
войти в базу данныхprestupnost с помощью командыUSE |
|
|||||||
prestupnost; и клавиши Enter. Попробуем |
запустить |
простой |
|
|||||
запрос: |
|
|
|
|
|
|
|
|
mysql> SELECT * FROM presupnik;
Должен появиться список преступников.
До сих пор видно было границ наших привилегий. Попробуем войти в служебную базу данных mysql:
115
mysql> USE |
mysql; |
|
|
|
|
|
||
ERROR 1044 (42000): Access denied for user: |
|
|||||||
лгкыфте@'localhost' to database ‘mysql’. |
|
|
||||||
Сервер MySQL указывает, что наш новый пользователь не |
|
|||||||
имеет права доступа к БДmysql. Действительно, если запросить |
|
|||||||
доступные MySQL базы данных, то этот сервер покажет только |
|
|||||||
доступные базы данных. |
|
|
|
|
|
|||
Пользователь без каких-либо привилегий работы с базами |
|
|||||||
данных |
не |
сможет |
увидеть |
или |
использовать |
эту |
базу |
|
(исключение составляет пользователь с глобальной привилегией |
|
|||||||
SHOW DATABASE). |
|
|
|
|
|
|
||
Теперь попробуем создать новую базу данных: |
|
|
||||||
mysql> CREATE DATABASE some_new_database; |
|
|
||||||
ERROR 1044 (42000): Access denied for user |
|
|
||||||
‘kursant’@’localhost’ to database ' |
|
|
|
|||||
some_new_database'. |
|
|
|
|
|
|||
Ничего не получилось, потому что когда заходили на |
|
|||||||
сервер |
MySQL |
как |
пользователь root, то |
не назначали |
для |
|
||
пользователя kursant привилегию создавать новые базы данных. |
|
|||||||
Теперь создадим второго пользователя, который может |
|
|||||||
получать доступ только к таблицеgruppirovka базы данных |
|
|||||||
prestupnost {prestupnost.gruppirovka). Затем следует выйти из |
|
|||||||
программы монитора (либо запустите монитор с |
другого |
|
||||||
терминала или окна командной строки) и вновь подключится к |
|
|||||||
серверу в качестве пользователя root. После этого создать нового |
|
|||||||
пользователя: |
|
|
|
|
|
|
|
|
mysql> GRANT ALL ON prestupnost.gruppirovka TO |
|
|||||||
->'analitik'@'localhost' |
IDENTIFIED |
BY |
|
|||||
'the_password'; |
|
|
|
|
|
|
||
Query OK, 0 rows affected (0.01 sec) |
|
|
||||||
Указываем |
таблицу gruppirovka |
базы |
данныхprestupnost |
|
||||
как prestupnost.gruppirovka. Если вы хотите предоставить доступ |
|
|||||||
к нескольким таблицам (но не ко всем) базы данных (или к |
|
|||||||
таблицам из различных ),БДто следует вводить несколько |
|
|||||||
инструкций GRANT. Например, чтобы добавить доступ к таблице |
|
|||||||
116
prestupnik для вновь созданного пользователя, введим следующее:
mysql> GRANT ALL ON prestupnost.prestupnik TO ->'analitik'@'localhost';
Query OK, 0 rows affected (0.01 sec)
Поскольку вновь используется пользовательское имя и местоположение 'analitik'@'localhost', то нет необходимости предоставлять пароль во второй инструкции. Пароль был задан во время создания пользователя и не изменялся во второй инструкции.
Можно разрешить пользователю получать доступ только к определенным столбцам таблицы. Например, разрешить пользователю kursant получать лишь доступ чтения(READ) к
столбцам prestupnik_name и prestupnik_id таблицы prestupnik: mysql> GRANT SELECT (prestupnik_name, prestup-
nik_id) ON prestupnost.prestupnik TO 'kursant'@'localhost';
Query OK, 0 rows affected (0.01 sec)
Здесь синтаксис отличается от предыдущих примеров. Вместо указания привилегийALL задавался стильSELECT, а также перечислены в скобках столбцы, к которым применяется эта привилегия (в данном случае это столбцы prestupnik_name и prestupnik_id). В остальной части инструкции используется такой же синтаксис, как и в предыдущих примерах. Предоставить все привилегии на уровне столбцов нет возможности. Необходимо указать каждый отдельно.
|
|
9.2. Создание удаленных пользователей |
|||
Предоставляя пользователю |
права на |
подключение к |
|||
серверу с другого компьютера, необходимо указать хост, с |
|||||
которого |
он |
сможет |
это |
(делатьудаленный |
клиент). |
Предположим, что у вас установлена корпоративная сеть, где |
|||||
ваша машина |
имеет личныйIР-адрес 192.168.1.2, доменом |
||||
является work.ru, а ваш компьютер имеет имяcomp5 (то есть полное имя компьютера — comp5.work.ru). Допустим также, что сервер MySQL запущен на машине comp5 и в сети есть еще две
117
машины: comp1.work.ru — с IP-адресом 192.168.1.4 и |
|
||||||||||||
comp2.work.ru — с IP-адресом 192.168.1.6. |
|
|
|
|
|
|
|||||||
|
Пользовательские |
учетные |
записи |
на |
сервереMySQL |
|
|||||||
(пользователи, |
или |
учетные |
записиMySQL) отличаются |
от |
|
||||||||
учетных записей на хост-машинах (системные пользователи, или |
|
||||||||||||
учетные записи в операционной системе). |
|
|
|
|
|
|
|||||||
|
Если |
доступ |
для |
пользователя ‘kursant’@‘localhost’ |
|
||||||||
разрешен, то именно этого правила и придерживается сервер |
|
||||||||||||
MySQL. Можно подключаться только с localhost. Все остальные |
|
||||||||||||
подключения, в том числе реальный IP-адрес или домен машины |
|
||||||||||||
localhost, запрещены. Если вы хотите разрешить доступ с |
|
||||||||||||
192.168.1.4 |
(эквивалентным |
|
доменным |
именем |
является |
||||||||
comp1.work.ru), то вам следует подтвердить |
эти |
привилегии |
|
||||||||||
путем создания нового пользователя с именемkursant и хостом |
|
||||||||||||
192.168.1.4. Отметим, что каждая пара пользовательского имени |
|
||||||||||||
и |
хоста |
|
рассматривается |
как |
отдельный |
пользователь |
с |
||||||
собственным паролем. |
|
|
|
|
|
|
|
|
|
||||
|
Войдите в монитор как пользовательroot и введите |
|
|||||||||||
следующую команду: |
|
|
|
|
|
|
|
|
|
|
|||
|
mysql> GRANT ALL ON *.* TO ‘kur- |
|
|
|
|
|
|||||||
sant'@'192.168.1.4’ IDENTIFIED BY 'the_password'; |
|
||||||||||||
|
Query OK, 0 rows affected (0.00 sec) |
|
|
|
|
||||||||
|
Вы также можете вместо ip – адреса использовать имя |
|
|||||||||||
хоста |
|
comp1.work.ru |
|
|
при |
|
|
условии |
|
корре |
|||
отконфигурированного сервера доменных имен (DNS — Domain |
|
||||||||||||
Name Server). |
|
|
|
|
|
|
|
|
|
|
|
||
|
Теперь вы можете запускать мониторMySQL на машине |
|
|||||||||||
comp1.work.ru и подключаться к comp5.work.ru, вводя команду: |
|
||||||||||||
|
mysql --user=kursant --host=comp5.work.ru -- |
|
|||||||||||
password=the_password |
|
|
|
|
|
|
|
|
|
||||
|
Welcome |
to |
the |
MySQL |
monitor. |
Commands |
end |
|
|||||
with ; or \g.
Your MySQL connection id is 52 to server version: 5.0.22-standard-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
118
Использование IP-адресов 192.168.1.2 для comp5.work.ru и |
|
|||||||||
192.168.1.4 |
для |
comp1.work.ru |
обеспечивает |
большую |
защиту, |
|
||||
поскольку IP-адреса сложнее угадать, чем доменные имена. |
|
|
|
|||||||
До сих пор для каждогоIP-адреса мы создавали нового |
|
|||||||||
пользователя. Однако на практике этот метод не всегда удобен, |
|
|||||||||
поскольку необходимо поддерживать всех пользователей и |
|
|||||||||
синхронизировать |
их |
привилегии, если |
доступ |
с |
трех |
|
||||
компьютеров осуществляется на одном уровне. Тем не менее, |
|
|||||||||
данный метод позволяет отличать удаленных пользователей с |
|
|||||||||
одним и тем же именем, а так же предлагает гибкую |
|
|||||||||
настраиваемую политику при подключении пользователей с |
|
|||||||||
удаленных компьютеров. |
|
|
|
|
|
|
|
|||
Рассмотрим другие способы подключения пользователя с |
|
|||||||||
разных |
компьютеров. |
Например, |
вы |
можете |
позволить |
|
||||
пользователю |
подключаться |
со |
всех |
компьютеров |
подсети, |
|
||||
используя |
один |
или |
несколько |
групповых |
символов |
в |
||||
инструкции |
GRANT. Чтобы разрешить пользователюprepoda- |
|
||||||||
vatel подключаться |
к |
серверу с |
любой машины, запустите |
|
||||||
следующую инструкцию: |
|
|
|
|
|
|
|
|||
mysql> GRANT ALL ON *.* TO 'prepodavatel'@'%' |
|
|
||||||||
IDENTIFIED BY 'the_password'; |
|
|
|
|
|
|||||
Query OK, 0 rows affected (0.01 sec) |
|
|
|
|||||||
Как и в случае с операторомSQL LIKE, групповой символ «%» соответствует любой строке, так что данная запись соответствует любому имени компьютера. В результате будут разрешены подключения для пользователяprepodavatel с любой машины в сети.
Групповые символы можно использовать и в IP-адресах. В качестве примера разрешим подключения со всех , машин разрешив доступ для диапазона IP-адресов 192.168.1.%.
Для этого запустим следующий запрос: mysql> GRANT ALL ON *.* TO 'labo-
rant'@'192.168.1.%' IDENTIFIED BY 'the_password';
Query OK, 0 rows affected (0.01 sec)
119
Можно сбросить сразу несколько таблиц, указав их имена в одной инструкции и разделив их запятыми:
mysql> DROP TABLE IF EXISTS temp, tempi, temp2; Query OK, 0 rows affected, 3 warnings (0.00 sec)
При удалении любых структур необходимо создать резервные копии бызы данных, которые позволят восстановить утраченные данные в результате ошибочных действий.
Контрольные вопросы
1.Какие уровни управления привелегией ALTER?
2.Какие привелегии и уровни в MySQL?
3.Каково назначение привелегии GRANT OPTION?
120
