MySQL. Библиотека профессионала - Аткинсон Л
..pdf492 |
Глава 27. Безопасность |
|
|
The |
following |
rules are used: |
|
|
|
matching |
|
host |
processed: host field is not empty in |
||
user |
|
|
|
Access rights |
|
|
|
for USER |
from HOST |
to DB |
NOTE: |
A password is required for user |
BEWARE: |
Any user with the appropriate permissions has access to |
|
your |
|
Check your |
The following rules are used: |
|
db |
|
host |
processed: host field is not empty in |
user |
|
Access rights
for USER from HOST to DB NEW
NOTE: |
A password |
is |
for user |
The following rules |
are used: |
|
|
db |
matching |
|
|
host |
processed: host field is not empty in |
||
user |
|
|
|
Проверить существующие привилегии позволяет также инструкция SHOW GRANTS
Она возвращает результаты в виде инструкций которые были выполнены при задании привилегий указанного пользователя (листинг 27.3). Такие результаты проще понять,чемтаблицысобозначениями и
Обеспечение безопасности 493
Лучший принцип управления привилегиями —свести их к минимуму. Позволяйте пользователям выполнять только те действия, которые от них ожидаются. Например, если есть группа Web приложений, обращающихся к серверу MySQL, создайте для каждого приложения отдельную пользовательскую учетную запись и предоставьте этому пользователю право манипулировать таблицами только одной базы данных. Не разрешайте пользователю менять определения таблиц или создавать индексы, если только не предполагается выполнять этидействия регулярно. Таким образом, ошибка в приложении, открывающая пользователям возможность вводить произвольные за просы, не даст им разрушить другие базы данных.
Большинству пользователей не нужны глобальные привилегии. Наличие глобаль ной привилегии Select позволит им просматривать содержимое всех баз данных, в том числе где хранятся описания привилегий и пароли. Привилегия Process дает пользователю возможность следить за чужими запросами, включая те, в которых задаются пароли. Короче говоря, глобальные привилегии предназначены для адми нистраторов баз данных.
Ограничьте количество узлов, от которых могут поступать запросы. Не разрешай те пользователям регистрироваться на сервере с произвольного компьютера. Даже если пользователи подключаются к системе посредством коммутируемых каналов связи, разрешите соединения только от одного провайдера. Иногда имеет смысл до пускать подключения только с локального узла. В этом случае пользователи вынужде ны будут сначала регистрироваться на компьютере, где установлена база данных, т.е. проходить двойную проверку: при входе в операционную систему и при входе в про грамму MySQL.
Доступ к базе привилегий нужен только администратору. Не позволяйте другим пользователям работать с этой базой данных. Если они смогут прочесть содержимое таблицы то смогут зарегистрироваться на сервере от имени любого пользова теля, так как увидятвсе пароли. Пароли хранятся в зашифрованном виде, но клиенты MySQL передают серверу именно зашифрованные пароли.
Обеспечение безопасности
Чтобы обеспечить безопасность сервера баз данных, необходимо тщательно спла нировать работу системы. Старайтесь использовать пароли, которые невозможно ни угадать, ни подсмотреть. Избегайте хранения паролей в незашифрованном виде как в самой базе данных, так и записанными на бумажке. Если такая бумажка при
494 Глава 27. Безопасность |
|
клеена к монитору, что нередко происходит, то любой сможет в |
хозяина |
пароля зарегистрироваться в системе под его именем. Многократное использование паролей тоже нежелательно, так как от взлома одной системы не должныстрадать другие системы, даже если пользователям лень запоминать "лишние" пароли. Меры предосторожности лишними не бывают!
Выработайте политику выбора надлежащих паролей. Пароли, представляющие собой обычные слова, элементарно взламываются специальными программами мето дом последовательного перебора. Самыми эффективными являются случайные ком бинации букв, чисел и знаков но такие пароли трудно запоминать. Суще ствует популярная методика выбора паролей. Ее суть заключается в том, что пароль составляется из первых букв какой нибудь легко запоминающейся фразы. Например, пароль соответствует фразе "The Lord the Rings Tolkien Такой пароль содержит смесь строчных и прописных букв, чисел и знаков пунктуации и имеетмаксимальнуюдлину—16 символов.
Никогда не задавайте пароль в командной строке. Пусть клиентская программа сама попросит ввести его. Команды, вводимые в интерпретаторе, видны любому лю, просматривающему список процессов. Функции клиентской библиотеки MySQL стараются максимально быстро очищать командную строку, но все равно в течение роткого промежутка времени она остается общедоступной. Пароли можно также хра нить вличном конфигурационном файле (см. главу 14, "Утилиты командной строки").
Бывают ситуации, когда пароли приходится хранить в исходном виде. Один из примеров — Web приложение. Программа должна регистрироваться на сервере, по этому она хранит строку пароля, передаваемую клиентской библиотеке. Утилита strings, имеющаяся в большинстве версий UNIX, позволяет легко просматривать текстовые строки, включенные в исполняемый файл. Ограничьте доступ к таким файлам. Убедитесь, что файл, в котором содержится пароль, не находится в катало
доступных |
Если Web приложение выполняется от имени |
ного пользователя, поместите пароль в конфигурационный файл. |
Для особо |
недоверчивых существует такое средство, как опция демона |
При |
ее наличии демон выполняет обратное преобразование доменных имен, |
проверяя совпадение IP адресов. Например, если IP адресу 192.168.100.128 вует имя но поиск этого имени в оканчивается неудачей или оказывается, что за этим именем закреплен другой адрес, то программа MySQL отка зывается устанавливать соединение. Можно также воспользоваться опцией name resolve, которая вообще отключит процедуру поиска доменных имен. В этом случае в столбцах Host таблиц привилегий будут разрешены только IP адреса.
Если в системе поддерживаются |
|
и работа ведется с базой данных, |
расположенной на локальномузле, задайте опцию |
Она отклю |
|
чит поддержку |
Соединения можно будет устанавливать только |
|
через |
|
|
Не стоит слепо доверять данным, поступающим из внешнего мира. Пользователи могут передавать цепочки байтов, нарушающие работоспособность системы или при водящие к неожиданным результатам. Представим себе приложение, заносящее в базу данных запись с помощью инструкции INSERT, аргумент для которой ся пользователем. Если в состав аргумента входит одинарная кавычка, она послужит сигналом к завершению строкового литерала. Это открывает возможность для изменения инструкции. Чтобы этого избежать, защищайте специальные символы от
|
Обеспечение безопасности 495 |
интерпретации, например с помощью |
или пользуйтесь |
параметризованными запросами, как в |
Нельзя защитить от интерпретации |
специальные символы числовых литералов, но можно удалить их в приложении, вы полнив операцию приведения или взять в одинарные кавычки, чтобы позво лить программе MySQL самой осуществить нужное преобразование. Если числовой литерал заключен в одинарные кавычки, программа преобразует строку в число в случае необходимости.
Безопасность можно обеспечивать на физическом уровне. Очень часто под сервер баз данных выделяют отдельный компьютер. В этом случае можно будет запретить все подключения к серверу, кроме тех, которые устанавливаются через порт 3306,
контролируемый программой MySQL. |
|
Еще более радикальное |
создание двух сетей. В такой схеме общедос |
тупный компьютер принимает запросы от внешних пользователей через один сете вой интерфейс, а другой интерфейс служит для подключения к локальной сети, в ко торой работает сервер баз данных. В результате сервер освобождается от обслужива ния внешнего трафика. Рассмотрим рис. 27.2. Пользователи запрашивают HTML страницы у Web сервера, выполняю щегося на общедоступном компьютере. В ответ на
это Web приложение, написанное на |
подключается к серверу баз данных, |
|
пользуя IP адрес из частного диапазона, начинающийся на 10. Чтобы дополнительно |
||
защитить |
можно поставить на пути во внешний мирбрандмауэр. |
Рис. 27,2. Вынесение сервера в отдельную сеть
Программа MySQL поддерживает обмен сжатыми и зашифрованными данными между клиентом и сервером. Сжатие позволяет уменьшить трафик и представить данные в более защищенном виде. Благодаря шифрованию генерируются данные, ко торые сможет прочитать только авторизованный получатель. шифрования при меняется протокол SSL (SecureSockets Layer — протокол защищенных
Как объяснялось в главе 2, "Инсталляция MySQL", сервер MySQL должен выпол няться от имени пользователя, учетная записькоторого создана специально для этих целей. Нельзя предоставлять серверу права суперпользователя, чтобы избежать си туации, когда из за ошибки разработчиков MySQL злоумышленники получают воз можность запускать программы на сервере.
В дистрибутив MySQL входит утилита позволяющая запускать не сколько серверов на одном компьютере. Это обеспечивает дополнительную безопас ность в которой работает много пользователей. Каждый пользователь может управлять собственной базой данных, что избавляет администратора от необходимости тщательно продумывать схему передачи привилегий. Подробнее об организации госерверной среды рассказывается в главе 29, "Распределенные базы данных".
ПЕРЕНОС ДАННЫХ В РАЗНЫЕ СУБД
этой
Переключение между СУБД Устранение Использование режима ANSI Уникальные свойства MySQL
главе рассказывается о том, чем MySQL отличается от других СУБД и в чем особенности имеющейся в данной СУБД реализации языка SQL. Изложен ная информация должна помочь читателям в создании таких баз данных, кото
рые легко переносить между разными серверами. также сведения о пере носе существующих баз данных в MySQL.
Программа MySQL реализует начальный уровень стандарта SQL 92, известный как SQL2. Это самый новый из официальных стандартов, хотя ожидалось, что в 2001 г. будет принят стандарт SQL3. В MySQL реализован также протокол ODBC 2. Близкое соответствие этим стандартам упрощает написание инструкций и программ, которые одинаково интерпретируются разными СУБД.
Переключение между СУБД
Многие факторы заставляют пользователей менять СУБД. К этому могут подтолк нуть технические причины, например потребность в функциональной возможности, которой нет у текущей СУБД. Иногда просто выбирают более современный и произ водительный сервер.
Компании, как правило, предпочитают работать с официально признанными про дуктами. Их службы технической поддержки имеют опыт обслуживания таких систем, поэтому пользователи вынуждены подчиняться политике компании. Нередки случаи, когда компания работает с программными средствами единственного производителя, например Microsoft. Есть и компании, которые могут себе позволить только ПО с от крытымикодами.
Выбор СУБД зачастую диктуется сугубо финансовыми соображениями. Например, компания может предпочесть конкретную СУБД, потому что у нее заключен договор об обмене услугами с производителем этой СУБД. Маркетологи компании могут прийти к выводу, что ее продукт будет продаваться лучше, если он будет работать с популярной СУБД. Широкий интерес к программам с открытыми кодами возник в 1998 когда компания Netscape объявила о выпуске своего Web броузера на условиях
Устранение 499
CREATE TEMPORARY TABLE scratch
ID
Name
Score FLOAT
В MySQL реализованы концепции пользователей и привилегий, но не поддержива ется понятие принадлежности базы данныхили таблицы. Пользователю можно предос тавить исключительное право доступа к таблице, но сама она не хранит связь с В MySQL применяется сложная система привилегий, основанная на инструк циях GRANT и REVOKE, однако права доступа нельзя объединять в группы или роли.
В MySQL информация о привилегиях хранится в базе данных. При удалении таб лицы или базы данных привилегии, относящиеся к удаленномуобъекту, остаются до тех пор, пока не будет выполнена инструкция REVOKE. He полагайтесь на то, что сер вер самостоятельно удалит привилегии.
Стандартные комментарии SQL начинаются с двух дефисов. В MySQL такой тип комментариев поддерживается, но за дефисами обязательно должен следовать про бел. Это позволяет избежать путаницы с математическими выражениями. Обратимся к табл. 28.1. Третья строка левой инструкции выглядит как комментарий, но ее можно
рассматривать и как часть выражения 1 |
|
что даст 2 в результате. В правой |
инструкции используются комментарии в стиле языка С. |
||
в стиле языка SQL |
Комментарии в стиле языка С |
|
UPDATE scratch |
UPDATE |
scratch |
(отладка) |
1 |
(отладка) */ |
WHERE |
WHERE |
|
Синтаксис комментариев рассматривался в главе 13, "Инструкции SQL". При пе реносе из другой СУБД в MySQL может потребоваться вставлять про бел в каждый комментарий.
В MySQL любое выражение со значением NULL равно NULL. NULL — это не то же самое, что False. Выражение NULL AND FALSE равно NULL, а не FALSE.
В некоторых СУБД поддерживается инструкция SELECT, позволяющая вставлять результаты запроса в другую таблицу. В MySQL для этих целей используется инструк ция INSERT. В нейможно указывать не список значений в скобках, а подчиненную инструкцию SELECT.
Некоторые СУБД позволяют создавать таблицы помощью инструкции SELECT. В табл. 28.2 демонстрируется создание временной копии таблицы. Левая инструкция записана в соответствии с синтаксисом MS SQL Server. Правая инструкция делает то же самое в MySQL.
Oracle
SELECT |
|| |
|| |
Устранение 501
Помимо внутренних объединений, создаваемых с помощью предложения WHERE, в MySQL используются специальные операторы объединений в предложении FROM. Например, поддерживается оператор LEFT JOIN. В других СУБД подобного рода операторы, такие как или применяются в предложении WHERE.
Имена функций существенно различаются в зависимости от СУБД. Встроенные функции MySQL были перечислены вглаве 12, "Встроенные функции". Замену обыч но найти несложно. Например, в Oracle текущее время хранится в переменной SYSDATE, в MS SQL оно определяется с помощью функции GETDATE а в MySQL—с помощьюфункцииNOW
Для совместимости с другими СУБД в MySQL создан ряд псевдонимов. В частно сти, имеется функция SYSDATE эквивалентная одноименной системной перемен ной Oracle. Поддерживаются также функции ODBC.
ВMySQL реализован механизм транзакций, но лишь для некоторых типов таблиц.
Кним не относится стандартный тип по крайней мере в версии 3.23. От дельные SQL инструкции выполняются в атомарном режиме, поэтому, если форми ровать собственные транзакции не нужно, таблицы MylSAM вполне подойдут.
Для таблиц тех типов, которые поддерживают транзакции, ведутся журналы тран закций. На их основе работают инструкции COMMIT и ROLLBACK. Если сервер внезап но зависает и его приходится принудительно перезапускать, прежнее состояние лиц автоматически восстанавливается по журналу и целостность данных не наруша ется. Таблицы MylSAM могут повреждаться из за сбоев сервера. Обычно админист раторы MySQL регулярно выполняют соответствующие проверки. Можно также на строить сервер на проверку всех таблиц при каждом запуске.
ВMySQL таблицы блокируются при помощи инструкции LOCK TABLES. Есть СУБД, которые позволяют блокировать таблицу в инструкции SELECT. О вопросах блокировки рассказывалось в главах 9, "Транзакции и параллельные вычисления", и 13, "Инструкции SQL".
Вглаве 9 речь также шла об имитации последовательностей. В MySQL нет отдель ного объекта, отвечающего за выделение уникальных идентификаторов. Вместо это го первичный ключ помечается специальным флагом, благодаря которому ему будут автоматически присваиваться целые числа. Кроме того, можно смоделировать после довательность с помощью таблицы, состоящей из одной ячейки. Обратимся к табл. 28.4. В левой части приведена инструкция Oracle, которая создает последова тельность с интервалом приращения 5, начинающуюся с числа 50. В правой части по казаны эквивалентные инструкции MySQL.
Oracle |
|
|
MySQL |
|
Создание |
последовательно |
Создание |
последовательности */ |
|
сти |
|
|
CREATE TABLE invoice_seq |
|
CREATE SEQUENCE invoice_seq |
INT |
|||
INCREMENT |
BY |
5 |
|
|
START WITH |
50; |
INSERT INTO invoice_seq |
||
|
|
|
VALUES |
(50); |