Н.И. Вьюкова, В.А. Галатенко
АО "Инфосистемы Джет", тел. (095) 972 -1182
- Основные понятия
- Основные категории пользователей СУБД INGRES
- Виды привилегий в СУБД INGRES
- Использование представлений для управления доступом
- Иерархия прав доступа
- Соотношение прав доступа СУБД и операционной системы
- Метки безопасности и принудительный контроль доступа
- Сохранение и восстановление баз данных
- Кластерная организация сервера баз данных
- Informix OnLine-XPS - среда высокой доступности данных
- Тиражирование данных
- Получение информации путем логических выводов
- Агрегирование данных
- Покушения на высокую готовность (доступность)
Системы управления базами данных, в особенности реляционные СУБД, стали доминирующим инструментом хранения больших массивов информации. Сколько-нибудь развитые информационные приложения полагаются не на файловые структуры операционных систем, а на многопользовательские СУБД, выполненные в технологии клиент/сервер. В этой связи обеспечение информационной безопасности СУБД и, в первую очередь, их серверных компонентов приобретает решающее значение для безопасности организации в целом.
Для СУБД важны все три основных аспекта информационной безопасности - конфиденциальность, целостность и доступность [6]. Общая идея защиты баз данных состоит в следовании рекомендациям, сформулированным для класса безопасности C2 в "Критериях оценки надежных компьютерных систем". В принципе некоторые СУБД, например INGRES, предлагают дополнения, характерные для класса B1, однако практическое применение подобных дополнений имеет смысл, только если все компоненты информационной структуры организации соответствуют категории безопасности B. Достичь этого непросто и с технической, и с финансовой точек зрения. Следует, кроме того, учитывать два обстоятельства. Во-первых, для подавляющего большинства коммерческих организаций класс безопасности C2 достаточен. Во-вторых, более защищенные версии отстают по содержательным возможностям от обычных "собратьев", так что поборники секретности по сути обречены на использование морально устаревших (хотя и тщательно проверенных) продуктов со всеми вытекающими последствиями в плане сопровождения.
Можно назвать следующие основные направления борьбы с потенциальными угрозами конфиденциальности и целостности данных:
- идентификация и проверка подлинности (аутентификация) пользователей;
- управление доступом к данным;
- механизм подотчетности всех действий, влияющих на безопасность;
- защита регистрационной информации от искажений и ее анализ;
- очистка объектов перед их повторным использованием;
- защита информации, передаваемой по линиям связи.
Все эти универсальные рекомендации применимы и к СУБД, и методы проведения их в жизнь с той или иной степенью детальности будут рассмотрены в настоящей работе. Кроме того, специфика СУБД делает потенциально возможными новые угрозы и, соответственно, требует особых мер защиты (например, использования представлений как средства управления доступом). Особые меры также будут рассмотрены. Внимание будет уделено и механизмам поддержания высокой готовности серверов баз данных.
Необходимо, однако, сделать несколько оговорок. В плане идентификации и проверки подлинности СУБД, как правило, полагаются на соответствующие механизмы операционных систем, поэтому на этой теме мы подробно останавливаться не будем.
Предполагается, что читатель знаком с основными понятиями СУБД. Их превосходное изложение можно найти в [1]. Там же подробно рассматриваются средства поддержания целостности данных: транзакции, правила, события. По этой причине мы затронем лишь некоторые аспекты контроля целостности.
Очистка объектов перед их повторным использованием реализуется операционной системой и СУБД прозрачным для пользователя образом, поэтому в данной работе не обсуждается.
Защита информации, передаваемой по линиям связи, или, в случае СУБД, защита коммуникаций между сервером и клиентами - это отдельная тема, далеко выходящая за рамки настоящей публикации. Мы ограничимся перечислением основных сервисов коммуникационной безопасности.
Мы подробно рассмотрим средства управления доступом, механизмы подотчетности и некоторые аспекты обеспечения высокой готовности. Затем будут проанализированы угрозы, специфичные для СУБД, и соответствующие меры противодействия.
Для иллюстрации излагаемых понятий и средств будут использоваться СУБД INGRES, Informix и Oracle.
Идентификация и проверка подлинности пользователей
Обычно в СУБД для идентификации и проверки подлинности пользователей применяются либо соответствующие механизмы операционной системы, либо SQL-оператор CONNECT. Например, в случае СУБД Oracle оператор CONNECT имеет следующий вид:
CONNECT пользователь[/пароль] [@база_данных];
Если пароль опущен, для его ввода выдается приглашение и на время выключается эхоотображение.
Так или иначе, в момент начала сеанса работы с сервером баз данных пользователь идентифицируется своим именем, а средством аутентификации служит пароль. Детали этого процесса определяются реализацией клиентской части приложения.
Обратим внимание на следующее обстоятельство. Некоторые операционные системы, в частности UNIX, позволяют во время запуска программы менять действующий идентификатор пользователя. Приложение, работающее с базой данных, как правило, имеет привилегии, значительно превосходящие привилегии обычных пользователей. Естественно, что при этом приложение предоставляет тщательно продуманный, строго фиксированный набор возможностей. Если пользователь сумеет тем или иным способом завершить приложение, но сохранить подключение к серверу баз данных, ему станут доступны по существу любые действия с данными.
Аутентификация на основе пароля затрудняет повторные проверки во время сеанса работы с сервером баз данных (как неудобные для пользователей) и практически исключает такие проверки перед каждой транзакцией. В результате оставленный без присмотра терминал может стать причиной нарушения информационной безопасности базы данных. Средства аутентификации на основе личных карточек или эквивалентного механизма дали бы приложению большую свободу в реализации контроля за подлинностью пользователей.
Управление доступом в СУБД INGRES
Основные понятия
Когда говорят об управлении доступом, различают два вида сущностей - активные и пассивные. Активные сущности (субъекты) осуществляют доступ к пассивным сущностям - объектам. Субъекты - это пользователи или, точнее, приложения, выступающие от их имени. Объектами, к которым регулируется доступ (будем называть их первичными объектами), являются базы данных, таблицы, представления и процедуры. Возможность для субъекта пользоваться другими объектами, например формами, отчетами, графиками и т.п., определяется доступом к первичным объектам.
Обычно в СУБД применяется произвольное управление доступом, когда владелец объекта передает права доступа к нему (чаще говорят - привилегии) по своему усмотрению. Привилегии могут передаваться субъектам (отдельным пользователям), группам, ролям или всем пользователям.
Группа - это именованная совокупность пользователей. Объединение субъектов в группы облегчает администрирование баз данных и, как правило, строится на основе формальной или фактической структуры организации. Каждый пользователь может входить в несколько групп. Когда пользователь тем или иным способом инициирует сеанс работы с базой данных, он может указать, от имени какой из своих групп он выступает. Кроме того, для пользователя обычно определяют подразумеваемую группу.
Роль - это еще один возможный именованный носитель привилегий. С ролью не ассоциируют перечень допустимых пользователей - вместо этого роли защищают паролями. В момент начала сеанса с базой данных можно специфицировать используемую роль (обычно с помощью флагов или эквивалентного механизма) и ее пароль, если таковой имеется.
Привилегии роли имеют приоритет над привилегиями пользователей и групп. Иными словами, пользователю как субъекту не обязательно иметь права доступа к объектам, обрабатываемым приложениям с определенной ролью.
Нетрудно усмотреть аналогию между ролью и таким средством ОС UNIX, как программы с битом переустановки действующего идентификатора пользователя. В обоих случаях пользователь на время получает привилегии, которыми он, вообще говоря, не обладает, но эти привилегии используются строго контролируемым образом. Роли позволяют реализовать "содержательные" привилегии, то есть привилегии, характер которых определяется не реляционной моделью или реализацией сервера баз данных, а функциональными возможностями прикладной системы.
Отметим, что в СУБД Oracle под ролью понимается набор привилегий. Такие роли служат средством структуризации привилегий и облегчают их модификацию.
Совокупность всех пользователей именуется как PUBLIC. Придание привилегий PUBLIC - удобный способ задать подразумеваемые права доступа.
Основные категории пользователей СУБД INGRES
Пользователей СУБД INGRES можно разбить на три категории:
- администратор сервера баз данных. Он ведает установкой, конфигурированием сервера, регистрацией пользователей, групп, ролей и т.п. Администратор сервера имеет имя ingres. Прямо или косвенно он обладает всеми привилегиями, которые имеют или могут иметь другие пользователи;
- администраторы базы данных. К этой категории относится любой пользователь, создавший базу данных, и, следовательно, являющийся ее владельцем. Он может предоставлять другим пользователям доступ к базе и к содержащимся в ней объектам. Администратор базы отвечает за ее сохранение и восстановление. В принципе в организации может быть много администраторов баз данных. Чтобы пользователь мог создать базу и стать ее администратором, он должен получить (вероятно, от администратора сервера) привилегию creatdb;
- прочие (конечные) пользователи. Они оперируют данными, хранящимися в базах, в рамках выделенных им привилегий.
В последующих разделах будет детально проанализирована система привилегий СУБД INGRES. Здесь мы отметим только, что администратор сервера баз данных, как самый привилегированный пользователь, нуждается в особой защите. Компрометация его пароля фактически означает компрометацию сервера и всех хранящихся на нем баз данных.
Поручать администрирование различных баз данных разным людям имеет смысл только тогда, когда эти базы независимы, и по отношению к ним не придется проводить согласованную политику выделения привилегий или резервного копирования. В таком случае каждый из администраторов будет знать ровно столько, сколько необходимо.
Можно провести аналогию между пользователем ingres и администраторами баз данных, с одной стороны, и суперпользователем операционной системы (root в случае ОС UNIX) и служебными пользователями (в ОС UNIX это могут быть bin, lp, uucp и т.д.), с другой стороны. Введение служебных пользователей позволяет администрировать функциональные подсистемы, не получая привилегий суперпользователя. Точно также информацию, хранящуюся на сервере баз данных, можно разделить на отсеки, так что компрометация администратора одного отсека не означает обязательной компрометации другого.
Виды привилегий в СУБД INGRES
Привилегии в СУБД INGRES можно подразделить на две категории: привилегии безопасности и привилегии доступа. Привилегии безопасности позволяют выполнять административные действия. Привилегии доступа, в соответствии с названием, определяют права доступа субъектов к определенным объектам.
Привилегии безопасности
Привилегии безопасности всегда выделяются конкретному пользователю (а не группе, роли или всем) во время его создания (оператором CREATE USER) или изменения характеристик (оператором ALTER USER). Таких привилегий пять:
- security - право управлять безопасностью СУБД и отслеживать действия пользователей. Пользователь с этой привилегией может подключаться к любой базе данных, создавать, удалять и изменять характеристики пользователей, групп и ролей, передавать права на доступ к базам данным другим пользователям, управлять записью регистрационной информации, отслеживать запросы других пользователей и, наконец, запускать INGRES-команды от имени других пользователей. Привилегия security необходима администратору сервера баз данных, а также лицу, персонально отвечающему за информационную безопасность. Передача этой привилегии другим пользователям (например, администраторам баз данных) увеличивает число потенциально слабых мест в защите сервера баз данных;
- createdb - право на создание и удаление баз данных. Этой привилегией, помимо администратора сервера, должны обладать пользователи, которым отводится роль администраторов отдельных баз данных;
- operator - право на выполнение действий, которые традиционно относят к компетенции оператора. Имеются в виду запуск и остановка сервера, сохранение и восстановление информации. Помимо администраторов сервера и баз данных этой привилегией целесообразно наделить также администратора операционной системы;
- maintain_locations - право на управление расположением баз данных на дисках. Этой привилегией должны обладать администраторы сервера баз данных и операционной системы;
- trace - право на изменение состояния флагов отладочной трассировки INGRES. Данная привилегия полезна администратору сервера баз данных и другим знающим пользователям при анализе сложных, непонятных ситуаций.
Приведем пример оператора CREATE USER, с помощью которого заводится пользователь bill с правом на создание баз данных и на выполнение функций оператора:
CREATE USER bill WITH PRIVILEGES createdb, operator; {Создать пользователя bill с привилегиями createdb и operator}
Для пользователя можно определить подразумеваемую группу:
CREATE USER mary WITH GROUP shoe_grp; {Создать пользователя mary с подразумеваемой группой shoe_grp}
Последующее изменение привилегий безопасности для пользователя bill можно выполнять посредством оператора ALTER USER. Оператор DROP USER позволяет удалить пользователя. Примеры:
ALTER USER bill DROP PRIVILEGES createdb; {Лишить пользователя bill права на создание баз данных} DROP USER bill; {Удалить пользователя bill}
Привилегии доступа
Привилегии доступа выделяются пользователям, группам, ролям или всем посредством оператора GRANT и изымаются с помощью оператора REVOKE. Эти привилегии, как правило, присваивает владелец соответствующих объектов (он же - администратор базы данных) или обладатель привилегии security (обычно администратор сервера баз данных).
Прежде чем присваивать привилегии группам и ролям, их (группы и роли) необходимо создать с помощью операторов CREATE GROUP и CREATE ROLE. При создании группы задается список входящих в нее пользователей:
CREATE GROUP sales WITH USERS = (bill, mary, joe); {Создать группу sales с тремя пользователями - bill, mary, joe}
Для изменения состава группы служит оператор ALTER GROUP:
ALTER GROUP sales ADD USERS (austin); {Добавить в группу sales пользователя austin} ALTER GROUP sales DROP USERS (joe); {Удалить из группы sales пользователя joe}
Оператор DROP GROUP позволяет удалять группы, правда, только после того, как опустошен список членов группы:
ALTER GROUP sales DROP all; {Опустошить список членов группы sales} DROP GROUP sales; {Удалить группу sales}
При создании ролей можно указать ассоциируемый с ними пароль, например:
CREATE ROLE dly_sales WITH PASSWORD = "el1332"; {Создать роль dly_sales с паролем el1332}
Оператор ALTER ROLE служит для изменения паролей ролей, а DROP ROLE - для удаления ролей.
Напомним, что создавать и удалять именованные носители привилегий, а также изменять их характеристики может лишь пользователь с привилегией security. При совершении подобных действий необходимо иметь подключение к базе данных iidbdb, в которой хранятся сведения о субъектах и их привилегиях.
Привилегии доступа можно подразделить в соответствии с видами объектов, к которым они относятся. В СУБД INGRES таких видов пять:
- таблицы и представления;
- процедуры;
- базы данных;
- сервер баз данных;
- события.
Присваивание привилегий доступа производится с помощью оператора GRANT. В самом общем виде оператор GRANT имеет следующий формат:
GRANT привилегии ON объекты TO кому;
Применительно к таблицам и представлениям можно управлять следующими правами доступа:
SELECT - право на выборку данных;
INSERT - право на добавление данных;
DELETE - право на удаление данных;
UPDATE - право на обновление данных (можно указать определенные столбцы, разрешенные для обновления);
REFERENCES - право на использование внешних ключей, ссылающихся на данную таблицу (можно указать определенные столбцы).
По умолчанию пользователь не имеет никаких прав доступа к таблицам и представлениям - их необходимо передать с помощью операторов GRANT. Приведем несколько примеров:
GRANT SELECT, INSERT, DELETE ON employee TO joe; {Предоставить пользователю joe право на выборку, добавление и удаление данных из таблицы employee} GRANT SELECT, UPDATE (empname, empaddress) ON employee TO bill, mary; {Предоставить пользователям bill и mary право на выборку из таблицы employee и на изменение столбцов empname и empaddress} GRANT ALL ON phonelist TO PUBLIC; {Предоставить всем пользователям все права доступа к таблице phonelist}
По отношению к процедуре можно предоставить право на выполнение. При этом не нужно заботиться о выделении прав доступа к объектам, обрабатываемым процедурой - их наличие не обязательно. Таким образом, процедуры баз данных являются удобным средством предоставления контролируемого доступа для выполнения строго определенных действий над данными.
Приведем пример предоставления права выполнения процедуры integ_check всем пользователям:
GRANT EXECUTE ON PROCEDURE integ_check TO PUBLIC;
Права доступа к базе данных как к единому целому может предоставлять ее администратор или пользователь с привилегией security. Эти "права" на самом деле устанавливают ряд ограничений на использование базы данных, то есть по сути являются запретительными. Имеется в виду ограничение на число операций ввода/вывода или число строк, возвращаемых одним запросом, ограничение права создания таблиц и процедур и т.п. По умолчанию пользователь не ограничен количественными лимитами и получает право на создание объектов в базе.
Отметим, что при создании базы данных указывается ее статус - общий или личный. Это влияет на подразумеваемые права доступа к базе. По умолчанию право на подключение к общей базе предоставляется всем. Право на подключение к личной базе нужно передавать явным образом. Право на подключение необходимо для выполнения всех прочих операций с базой и содержащимися в ней объектами.
В следующей таблице сведены права доступа к базе данных и их подразумеваемые значения.
Таблица 1. |
Привилегии (которые в данном случае точнее было бы назвать ограничениями) QUERY_IO_LIMIT и QUERY_ROW_LIMIT проверяются на основании оценок, выданных оптимизатором запросов INGRES. Если оптимизатор предсказывает, что запрос превысит отведенный лимит числа операций ввода/вывода или возвращаемых строк, он (запрос) отвергается. Наложение подобных количественных ограничений препятствует монополизации сервера одним клиентом и может использоваться как один из инструментов поддержания высокой готовности.
Приведем несколько примеров операторов управления доступом к базам данных:
GRANT NOCREATE_TABLE, NOCREATE_PROCEDURE ON DATABASE new_accts TO GROUP clerks; {Запретить членам группы clerks создавать таблицы и процедуры в базе данных new_accts} GRANT QUERY_ROW_LIMIT 250 ON DATABASE customers TO mary; {Разрешить пользователю mary получать в качестве результатов одного запроса не более 250 строк}
Обратим внимание на следующее любопытное обстоятельство. По умолчанию все пользователи имеют право создавать процедуры в базах данных. Если бы они при этом автоматически получали права на выполнение, то смогли бы осуществить, по существу, любую операцию с данными, поскольку выполнение процедуры не требует прав доступа к обрабатываемым объектам. К счастью, для передачи привилегии доступа к объектам и, в частности, для предоставления права на выполнение процедуры надо быть не только владельцем объекта, но и администратором базы данных. Мы видим, насколько осторожно нужно относиться к предоставлению привилегий выполнения по отношению к новым, непроверенным процедурам. В принципе достаточно одного "троянского коня", чтобы скомпрометировать всю базу данных. Процедуры являются столь же гибким, но и столь же опасным средством, что и UNIX-программы с битом переустановки действующего идентификатора пользователя.
Отметим, что запретительные привилегии в принципе можно наложить на администратора базы данных или администратора сервера, однако они не будут иметь силы. Тем самым злоумышленник лишен возможности ограничить права доступа администраторов. В частности, он не может создать личную "секретную" базу данных, к которой не будет иметь доступ пользователь ingres. Правда, у подобного положения есть и оборотная сторона - компрометация пароля администратора сервера предоставляет злоумышленнику неограниченные права доступа ко всем базам данных.
Права доступа к серверу распространяются на все базы данных, обслуживаемые данным сервером. Набор этих прав тот же, что и для отдельных баз данных. Приведем пример оператора, предоставляющего обладателям роли creators право на создание таблиц во всех базах данных:
GRANT CREATE_TABLE ON CURRENT INSTALLATION TO ROLE creators;
Привилегии, явно определенные для отдельных баз, имеют приоритет над привилегиями сервера.
Механизм событий подробно рассмотрен в [1]. Здесь мы отметим лишь, что по отношению к событиям имеются две привилегии - RAISE и REGISTER. Первая позволяет возбуждать события, вторая - регистрироваться для их получения.
Оператор GRANT может содержать необязательную часть, принципиально важную для защиты СУБД. Имеется в виду конструкция
GRANT ... ... WITH GRANT OPTION;
Подобный оператор GRANT передает не только указанные в нем привилегии, но и права на их дальнейшую передачу. Так, оператор
GRANT SELECT ON employee TO bill WITH GRANT OPTION;
дает возможность пользователю bill осуществлять выборку из таблицы employee и передавать это право другим субъектам. Очевидно, что использование конструкции WITH GRANT OPTION ведет к децентрализации контроля над привилегиями и содержит потенциальную угрозу безопасности данных.
Для отмены привилегий, выданных ранее (как разрешительных, так и запретительных), служит оператор REVOKE. Синтаксически он аналогичен GRANT с заменой слова TO на FROM. Например, следующий оператор
REVOKE QUERY_ROW_LIMIT ON DATABASE employee FROM ROLE review_emp;
отменит ограничение на число результирующих строк в одном запросе, если ранее оно было наложено на роль review_emp.
Получение информации о привилегиях
Важно не только давать и отбирать привилегии, но и иметь информацию о том, какими правами доступа обладает каждый из субъектов. Подобные данные можно получить с помощью функции dbmsinfo, а также путем анализа содержимого таблиц в базе данных iidbdb.
Функция dbmsinfo возвращает права доступа к базе, относящиеся к текущему подключению. Можно узнать имена действующих группы и роли, значения количественных ограничений, наличие привилегий для создания таблиц и процедур и т.п.
Таблицы iiusergroup, iirole и iidbprivileges базы данных iidbdb содержат, соответственно, список групп и их состав, перечень ролей вместе с зашифрованными паролями и сведения о привилегиях доступа к базам данных. Так, таблица iiusergroup состоит из трех столбцов:
- groupid - имя группы;
- groupmem - имя члена группы;
- reserve - резервный столбец.
Средствами SQL из этих таблиц можно извлечь необходимую информацию.
Использование представлений для управления доступом
СУБД предоставляют специфическое средство управления доступом - представления. Представления позволяют сделать видимыми для субъектов определенные столбцы базовых таблиц (реализовать проекцию) или отобрать определенные строки (реализовать селекцию). Не предоставляя субъектам прав доступа к базовым таблицам и сконструировав подходящие представления, администратор базы данных защитит таблицы от несанкционированного доступа и снабдит каждого пользователя своим видением базы данных, когда недоступные объекты как бы не существуют.
Приведем пример создания представления, содержащего два столбца исходной таблицы и включающего в себя только строки с определенным значением одного из столбцов:
CREATE VIEW empview AS SELECT name, dept FROM employee WHERE dept = "shoe";
Предоставим всем право на выборку из этого представления:
GRANT SELECT ON empview TO PUBLIC;
Субъекты, осуществляющие доступ к представлению empview, могут пытаться запросить сведения об отделах, отличных от shoe, например:
SELECT * FROM empview WHERE dept = "toy";
но в ответ просто получат результат из нуля строк, а не код ответа, свидетельствующий о нарушении прав доступа. Это принципиально важно, так как лишает злоумышленника возможности получить список отделов косвенным образом, анализируя коды ответов, возвращаемые после обработки SQL-запросов.
Иерархия прав доступа
Оператор GRANT и другие средства управления доступом СУБД INGRES позволяют реализовать следующие виды ограничения доступа:
- операционные ограничения (за счет прав доступа SELECT, INSERT, UPDATE, DELETE, применимых ко всем или только некоторым столбцам таблицы);
- ограничения по значениям (за счет механизма представлений);
- ограничения на ресурсы (за счет привилегий доступа к базам данных).
При обработке запроса СУБД INGRES сначала проверяет права доступа к объектам. Если операционные ограничения оказываются нарушенными, запрос отвергается с выдачей соответствующей диагностики. Нарушение ограничений на значения влияет только на количество результирующих строк; никакой диагностики при этом не выдается (см. предыдущий пункт). Наконец, после учета двух предыдущих ограничений, запрос поступает на обработку оптимизатору. Если тот обнаружит превышение ограничений на ресурсы, запрос будет отвергнут с выдачей соответствующей диагностики.
На иерархию привилегий можно посмотреть и с другой точки зрения. Каждый пользователь, помимо собственных, имеет привилегии PUBLIC. Кроме этого, он может входить в различные группы и запускать приложения с определенными ролями. Как соотносятся между собой права, предоставленные различным именованным носителям привилегий?
Иерархия авторизации выглядит для СУБД INGRES следующим образом:
- роль (высший приоритет);
- пользователь;
- группа;
- PUBLIC (низший приоритет).
Для каждого объекта, к которому осуществляется доступ, INGRES пытается отыскать в иерархии привилегию, относящуюся к запрашиваемому виду доступа (SELECT, EXECUTE и т.п.). Например, при попытке доступа к таблице с целью обновления, INGRES проверяет привилегии роли, пользователя, группы и всех пользователей. Если хотя бы на одном уровне иерархии привилегия UPDATE имеется, запрос передается для дальнейшей обработки. В противном случае используется подразумеваемое право доступа, которое предписывает отвергнуть запрос.
Рассмотрим подробнее трактовку ограничений на ресурсы. Пусть, например, на всех четырех уровнях иерархии специфицированы свои ограничения на число результирующих строк запроса (привилегия QUERY_ROW_LIMIT):
роль 1700;
пользователь 1500;
группа 2000;
PUBLIC 1000.
Если пользователь в момент начала сеанса работы с СУБД INGRES задал и роль, и группу, будет использовано ограничение, накладываемое ролью (1700). Если бы привилегия QUERY_ROW_LIMIT для роли отсутствовала или пользователь не задал роль в начале сеанса работы с INGRES, пользователь смог бы получать результаты не более чем из 1500 строк и т.п. Если бы привилегия QUERY_ROW_LIMIT вообще не была специфицирована ни на одном уровне иерархии, СУБД INGRES воспользовалась бы подразумеваемым значением, которое в данном случае означает отсутствие ограничений на число результирующих строк.
Обычно используемая роль и группа задаются, соответственно, как аргументы опций -R и -G в командной строке запуска приложения. Пример:
QBF -Gaccounting company_db
Если опция -G отсутствует, применяется подразумеваемая группа пользователя, если таковая имеется. Наконец, если в командной строке sql задана опция -uпользователь, то в число проверяемых входят также привилегии указанного пользователя.
Соотношение прав доступа СУБД и операционной системы
Данные, хранящиеся средствами СУБД, располагаются в файлах и/или логических томах операционной системы. Соответственно, и доступ к этим данным возможен как с помощью СУБД, так и посредством утилит ОС. Так называемая естественная защита баз данных, являющаяся следствием относительно сложного формата их хранения, едва ли способна остановить злоумышленника.
Чтобы средствами ОС нельзя было скомпрометировать базу данных и сопутствующую информацию, например журналы транзакций, необходимо установить максимально жесткий режим доступа к соответствующим файлам и томам. Для UNIX-систем целесообразно предоставить право непосредственного доступа только пользователям root, ingres и, быть может, администраторам баз данных. Все прочие субъекты должны осуществлять доступ к базам с помощью программ со взведенным битом переустановки действующего идентификатора пользователя.
Приведем пример приложения на встроенном SQL, контролирующего действующий идентификатор пользователя.
#include ... #define DBA "fred" /* ** Пример приложения, которое не ** требует от пользователя ** каких-либо прав доступа к ** обрабатываемой информации, ** но полагается на механизм ** переустановки действующего ** идентификатора пользователя. */ main (){ EXEC SQL begin declare section; char username [32]; char dbname [32]; EXEC SQL end declare section; int user; int ret_val = 0; struct passwd *getpwnam (); struct passwd *password_entry; password_entry = getpwnam(DBA); /* ** Проверим действующий иденти- ** фикатор пользователя на сов- ** падение со значением DBA. ** В случае отрицательного ** результата выдадим сообщение ** об ошибке. */ if((user = geteuid())!= (password_entry-<\>>pw_uid)){ fprintf (stderr, "\nError starting application. Contact the DBA.\n"); ret_val = 1; exit (ret_val); } . . . EXEC SQL connect dbname; /* ** Покажем, что соединение было ** выполнено от имени DBA */ EXEC SQL select username () into :username; printf("User is %s\n", username); . . . EXEC SQL disconnect; . . . }
Данные из базы могут экспортироваться в файлы операционной системы или другие хранилища. Возможен и обратный процесс импорта данных. Необходимо следить за тем, чтобы подобные операции не понижали уровня защищенности информации. Сделать это, вообще говоря, непросто. Во-первых, операционная система (например, персонального компьютера) может не обеспечивать должной защиты. Во-вторых, даже для развитых ОС необходимо установить и поддерживать соответствие между механизмами защиты СУБД и операционных систем. При большом числе пользователей (порядка нескольких сотен) данная задача становится очень сложной. Видимо, наиболее практичное решение сводится к административному контролю за экспортом/импортом информации.
Можно предположить, что исходные тексты сколько-нибудь сложных процедур баз данных будут храниться в файлах операционной системы, формально не имеющих отношения к СУБД. Потенциально возможно нелегальное изменение исходного текста, которое, как было показано ранее, способно привести к серьезным нарушениям информационной безопасности. Вероятно, и здесь лучшим средством является административный контроль за размещением процедур в базах данных и за передачей прав на их выполнение.
СУБД и ОС предлагают во многом сходные средства защиты данных. Более того, многие СУБД просто полагаются на операционную систему в плане идентификации и проверки подлинности пользователей. Тем не менее даже для таких "дружественных" сервисов проведение в жизнь согласованной политики безопасности является очень сложным делом. На практике приходится всячески ограничивать информационный обмен между СУБД и ОС.
Метки безопасности и принудительный контроль доступа
Выше были описаны средства произвольного управления доступом, характерные для уровня безопасности C. Как уже указывалось, они в принципе достаточны для подавляющего большинства коммерческих приложений. Тем не менее они не решают одной весьма важной задачи - задачи слежения за передачей информации. Средства произвольного управления доступом не могут помешать авторизованному пользователю законным образом получить секретную информацию и затем сделать ее доступной для других, неавторизованных пользователей. Нетрудно понять, почему это так. При произвольном управлении доступом привилегии существуют отдельно от данных (в случае реляционных СУБД - отдельно от строк реляционных таблиц). В результате данные оказываются "обезличенными", и ничто не мешает передать их кому угодно даже средствами самой СУБД.
В "Критериях оценки надежных компьютерных систем" применительно к системам уровня безопасности B описан механизм меток безопасности, реализованный в версии INGRES/ Enhanced Security (INGRES с повышенной безопасностью). Применять эту версию на практике имеет смысл только в сочетании с операционной системой и другими программными компонентами того же уровня безопасности. Тем не менее рассмотрение реализации меточной безопасности в СУБД INGRES интересно с познавательной точки зрения, а сам подход, основанный на разделении данных по уровням секретности и категориям доступа, может оказаться полезным при проектировании системы привилегий многочисленных пользователей по отношению к большим массивам данных.
В СУБД INGRES/Enhanced Security к каждой реляционной таблице неявно добавляется столбец, содержащий метки безопасности строк таблицы. Метка безопасности состоит из трех компонентов:
· уровень секретности. Смысл этого компонента зависит от приложения. В частности, возможен традиционный спектр уровней от "совершенно секретно" до "несекретно";
· категории. Понятие категории позволяет разделить данные на "отсеки" и тем самым повысить надежность системы безопасности. В коммерческих приложениях категориями могут служить "финансы", "кадры", "материальные ценности" и т.п. Ниже назначение категорий разъясняется более подробно;
· области. Является дополнительным средством деления информации на отсеки. На практике компонент "область" может действительно иметь географический смысл, обозначая, например, страну, к которой относятся данные.
Каждый пользователь СУБД INGRES/ Enhanced Security характеризуется степенью благонадежности, которая также определяется меткой безопасности, присвоенной данному пользователю. Пользователь может получить доступ к данным, если степень его благонадежности удовлетворяет требованиям соответствующей метки безопасности. Более точно:
· уровень секретности пользователя должен быть не ниже уровня секретности данных;
· набор категорий, заданных в метке безопасности данных, должен целиком содержаться в метке безопасности пользователя;
· набор областей, заданных в метке безопасности пользователя, должен целиком содержаться в метке безопасности данных.
Рассмотрим пример. Пусть данные имеют уровень секретности "конфиденциально", принадлежат категории "финансы" и относятся к областям "Россия" и "СНГ". Далее, пусть степень благонадежности пользователя характеризуется меткой безопасности с уровнем секретности "совершенно секретно", категориями "финансы" и "кадры", а также областью "Россия". Такой пользователь получит доступ к данным. Если бы, однако, в метке пользователя была указана только категории "кадры", в доступе к данным ему было бы отказано, несмотря на его "совершенно секретный" уровень.
Когда пользователь производит выборку данных из таблицы, он получает только те строки, меткам безопасности которых удовлетворяет степень его благонадежности. Для совместимости с обычными версиями СУБД, столбец с метками безопасности не включается в результирующую информацию.
Отметим, что механизм меток безопасности не отменяет, а дополняет произвольное управление доступом. Пользователи по-прежнему могут оперировать таблицами только в рамках своих привилегий, но даже при наличии привилегии SELECT им доступна, вообще говоря, только часть данных.
При добавлении или изменении строк они, как правило, наследуют метки безопасности пользователя, инициировавшего операцию. Таким образом, даже если авторизованный пользователь перепишет секретную информацию в общедоступную таблицу, менее благонадежные пользователи не смогут ее прочитать.
Специальная привилегия, DOWNGRADE, позволяет изменять метки безопасности, ассоциированные с данными. Подобная возможность необходима, например, для коррекции меток, по тем или иным причинам оказавшихся неправильными.
Представляется естественным, что СУБД INGRES/Enhanced Security допускает не только скрытое, но и явное включение меток безопасности в реляционные таблицы. Появился новый тип данных, security label, поддерживающий соответствующие операции сравнения.
INGRES/Enhanced Security - первая СУБД, получившая сертификат, эквивалентный аттестации на класс безопасности B1. Вероятно, метки безопасности постепенно войдут в стандартный репертуар систем управления базами данных.
Поддержание целостности данных в СУБД INGRES
Для коммерческих организаций обеспечение целостности данных по крайней мере не менее важно, чем обеспечение конфиденциальности. Конечно, неприятно, когда кто-то подглядывает за суммами на счетах клиентов, но гораздо хуже, когда в процессе перевода денег со счета на счет часть суммы исчезает в неизвестном направлении.
Известно, что главными врагами баз данных являются не внешние злоумышленники, а ошибки оборудования, администраторов, прикладных программ и пользователей. Защита от подобных ошибок - главная тема этого раздела.
С точки зрения пользователя СУБД, основными средствами поддержания целостности данных являются ограничения и правила.
Ограничения
Ограничения могут относиться к таблицам или отдельным столбцам. Ограничения на столбцы задаются при создании таблицы, в операторах CREATE TABLE. Приведем пример подобного оператора, содержащего ограничения разных видов:
CREATE TABLE person( name char(10) NOT NULL, age integer CHECK (age <\>> 17) id integer REFERENCES idtable(id), );
Здесь требуется, чтобы имя было непустым (обязательно задавалось), а значение возраста было больше 17. Так называемые ссылочные ограничения, использованные в определении столбца id, будут рассмотрены ниже.
Табличные ограничения относятся к группе столбцов и могут задаваться как при создании таблицы, так и позже, посредством оператора ALTER TABLE. Приведем пример табличного ограничения, заданного в операторе CREATE TABLE:
CREATE TABLE names( firstname char(20), lastname char(20), unique (firstname, lastname) ); {Имя и фамилия должны в совокупности однозначно идентифицировать строку таблицы names}
Следующий пример содержит именованное ограничение, связывающее значения в двух столбцах:
CREATE TABLE dept ( dname char(10), budget money, expenses money, CONSTRAINT check_amount CHECK (budget > 0 and expenses <= budget)); {Бюджет должен быть положительным, а расходы не должны выходить за рамки бюджета}
Ссылочные ограничения отвечают за целостность связей между таблицами. Подобное ограничение требует, чтобы каждому значению в столбце или группе столбцов одной таблицы соответствовало ровно одно значение в другой таблице. Название ограничения объясняется тем, что такие значения играют роль ссылок между таблицами в реляционной модели.
Приведем пример ссылочного ограничения:
CREATE TABLE emp(ename char(10), edept char(10) references dept(dname)); {Ни один работник не должен числиться в неизвестном отделе}
Ограничения всех видов накладываются владельцем таблицы и влияют на исход последующих операций с данными. Перед завершением выполнения SQL-оператора производится проверка имеющихся ограничений. При обнаружении нарушений СУБД сигнализирует о ненормальном завершении и аннулирует внесенные оператором изменения.
Отметим, что для наложения ссылочного ограничения необходимо обладать привилегией REFERENCES по отношению к таблице, на которую делается ссылка (dept в примере выше).
Ограничения можно не только накладывать, но и отменять. При этом между ограничениями могут существовать зависимости, и отмена одного из них может потребовать ликвидации других (ссылочных) ограничений, зависящих от первоначального. Рассмотрим следующий пример:
CREATE TABLE dept( name char(10) NOT NULL, location char(20), CONSTRAINT dept_unique UNIQUE(name) ); CREATE TABLE emp(name char(10), salary decimal(10,2), edept char(10) CONSTRAINT empref REFERENCES dept(name));
Если требуется удалить ограничение dept_unique, можно воспользоваться следующим оператором:
ALTER TABLE dept DROP CONSTRAINT dept_unique cascade;
Слово cascade означает, что следует удалить также все ограничения, прямо или косвенно зависящие от dept_unique. В данном случае будет изъято ограничение empref. Если вместо cascade указать restrict, то есть сделать попытку удалить только ограничение dept_unique, СУБД зафиксирует ошибку. Тем самым обеспечивается целостность системы ограничений.
Получить информацию об ограничениях, наложенных на таблицы, можно с помощью оператора
HELP INTEGRITY таблица[,таблица]3/4
В СУБД INGRES делается попытка примирить контроль ограничений и эффективность функционирования. При массовом копировании данных контроль ограничений отключается. Это значит, что необходимо дополнять копирование запуском процедуры глобальной проверки целостности.
Правила
Правила позволяют вызывать выполнение заданных действий при определенных изменениях базы данных. Обычно действие - это вызов процедуры. Правила ассоциируются с таблицами и срабатывают при изменении этих таблиц.
В отличие от ограничений, которые являются лишь средством контроля относительно простых условий, правила позволяют проверять и поддерживать сколько угодно сложные соотношения между элементами данных в базе.
Приведем пример, связанный с удалением элементов из таблицы, содержащей информацию о людях. После удаления информации об отце следует позаботиться о том, чтобы не осталось "сирот", то есть требуется удалить всех потомков (прямых и косвенных) данного отца. Тем самым будет обеспечена ссылочная целостность.
CREATE TABLE person (name char(20) NOT NULL UNIQUE, parent char (20)); {Для простоты предполагается, что имя однозначно характеризует человека} {В столбце parent хранятся имена родителей} CREATE PROCEDURE delete_children (me varchar(10)) AS DECLARE msg varchar(80) NOT NULL; BEGIN msg = "Deleting child(ren) from ""+:me+"""; message :msg; DELETE FROM person WHERE parent = :me; IF iirowcount <\>> 0 THEN msg="Deleted"+varchar(:iirowcount)+ "child(ren) from ""+:me+"""; ELSE msg = "No children deleted from "" + :me + """; ENDIF; message :msg; END; CREATE RULE cascade_delete AFTER DELETE FROM person EXECUTE PROCEDURE delete_children(me=old.name); {Вызывать процедуру delete_children после удаления элемента таблицы person}
Обратим внимание на несколько обстоятельств. Во-первых, процедура delete_children, выполняемая в результате срабатывания правила cascade_delete, вызывает рекурсивное обращение к этому правилу и, следовательно, к самой себе. Во-вторых, таблица person также является в некотором смысле рекурсивной, поскольку столбец parent представляет собой ссылку на столбец name. Целостность по этой ссылке и поддерживается правилом cascade_delete. В третьих, поскольку правило срабатывает в момент изменения таблицы, ему должны быть доступны оба состояния - старое (до изменения) и новое. Обычно они обозначаются именами OLD и NEW.
Рассмотрим еще один пример, показывающий, как средствами SQL можно контролировать уровень доступа к данным. Здесь предполагается, что в столбце sec_label хранятся текстовые обозначения уровня секретности строк. Строки, помеченные как "top secret", может удалять и изменять только пользователь с именем topgun.
CREATE PROCEDURE security_violation AS DECLARE err varchar(80) NOT NULL; BEGIN err="ERROR: UPDATE SECURITY VIOLATION BY USER"" +varchar(user)+"""; RAISE ERROR 8001 :err; END
CREATE RULE reject_update AFTER DELETE, UPDATE OF secret WHERE old.sec_label="top secret" AND user != "topgun" EXECUTE PROCEDURE security_violation;
Разумеется, с помощью правил и процедур можно реализовать сколь угодно сложные действия, поддерживающие содержательную целостность данных, хранящихся в нескольких таблицах. Мы, однако, ограничимся приведенными примерами.
Как и в случае ограничений, проверка правил отключается при массовых операциях копирования. Администратор базы данных может также явным образом отменить проверку правил, воспользовавшись оператором SET NORULES.
Оператор SET RULES позволит затем восстановить работу механизма правил. По умолчанию этот механизм включен.
Для удаления правил служит оператор
DROP RULE правило;
СУБД INGRES обеспечивает автоматическое удаление правил в тех случаях, когда удаляется соответствующая таблица. Тем самым поддерживается целостность системы таблиц и правил.
В контексте информационной безопасности важно отметить, что создать правило, ассоциируемое с таблицей, может владелец этой таблицы, имеющий право на выполнение соответствующей процедуры. Пользователь, действия которого вызывают срабатывание правила, должен обладать лишь необходимыми правами доступа к таблице. Тем самым правила неявно расширяют привилегии пользователей. Подобные расширения нуждаются в строгом административном контроле, поскольку даже незначительное изменение правила или ассоциированной процедуры может кардинально повлиять на защищенность данных. Ошибка же в сложной системе правил вообще чревата непредсказуемыми последствиями.
Регистрация действий пользователей в СУБД Informix
Регистрация действий пользователей, так или иначе влияющих на информационную безопасность, является фактором, сдерживающим потенциальных злоумышленников и позволяющим расследовать уже случившиеся нарушения.
Более точно, журнал регистрационной информации может использоваться для следующих целей:
- обнаружение необычных или подозрительных действий пользователей и идентификации лиц, совершающих эти действия;
- обнаружение попыток несанкционированного доступа;
- оценка возможных последствий состоявшегося нарушения информационной безопасности;
- оказание помощи в расследовании случаев нарушения безопасности;
- организация пассивной защиты от нелегальных действий. Пользователи, зная, что их действия фиксируются, могут не решиться на незаконные операции. Чтобы данная цель достигалась, необходимо довести до сведения каждого пользователя, что каждое его действие регистрируется и что за незаконные операции он может понести наказание.
Регистрируемые события
В терминологии регистрационной службы любое действие, способное изменить состояние базы данных, называется событием и может регистрироваться. В СУБД Informix события обозначаются четырехбуквенными мнемониками. Приведем перечень событий, наиболее важных с точки зрения безопасности.
Таблица 2. |
Кроме перечисленных, могут регистрироваться события, связанные с управлением транзакциями, запуском административных утилит и т.д.
Даже приведенный неполный перечень показывает, насколько широк спектр событий, которые могут регистрироваться. Разумеется, регистрация всех событий для всех пользователей существенно снизит эффективность работы СУБД. Администратор СУБД (или лицо, отвечающее за информационную безопасность) должен выбрать приемлемый баланс между безопасностью и эффективностью.
Рекомендуется регистрировать по крайней мере следующие события:
- передача привилегий доступа к базе данных (GRDB);
- лишение привилегий доступа к базе данных (RVDB);
- передача привилегий доступа к таблице (GRTB);
- лишение привилегий доступа к таблице (RVTB);
- открытие базы данных (OPDB).
Перечисленные события происходят нечасто, однако их фиксация позволяет составить представление о том, чем интересуется каждый из пользователей. Если какой-либо пользователь замечен в подозрительных действиях, для него можно включить режим регистрации всех событий. Для администратора СУБД и лица, отвечающего за безопасность, подобный режим должен быть включен постоянно.
Отметим, что у пользователя нет возможности узнать, какие из его действий регистрируются. Целесообразно поддерживать в нем уверенность, что регистрируется все или почти все.
Управление набором регистрируемых событий
Для управления набором регистрируемых событий в СУБД Informix используются маски событий. Три стандартные маски с именами _default, _require и _exclude формируют стандартное регистрационное окружение. Кроме того, для отдельных пользователей могут быть заданы персональные маски с именами, совпадающими с входными именами этих пользователей.
Результирующее регистрационное окружение пользователя формируется следующим образом:
- Берется маска _default или маска пользователя, если таковая имеется.
- В число регистрируемых дополнительно включаются события, заданные маской _require.
- Из числа регистрируемых исключаются события, заданные маской _exclude, при условии, что они не были упомянуты в маске _require.
Таким образом, в СУБД Informix выполнено одно из требований к системам класса безопасности C2, предписывающее возможность задания своего перечня регистрируемых событий для каждого пользователя.
Маски можно формировать с помощью утилиты onaudit. Приведем пример командной строки, позволяющей добавить к маске _default регистрацию событий, вызываемых операциями со строками таблиц:
onaudit -m -u _default -e +DLRW,INRW,RDRW,UPRW
С помощью утилиты onaudit можно выдать состояние той или иной маски, создать, модифицировать или удалить ее. Та же утилита (и это важно отметить) позволяет включать и выключать регистрацию событий сервером СУБД Informix.
Анализ регистрационной информации
Регистрационная информация накапливается в файлах операционной системы. Эти файлы состоят из записей, содержащих следующие поля:
- ONLN - фиксированное поле, обозначающее события, фиксируемые сервером Informix-OnLine;
- дата и время события;
- имя клиентского компьютера, инициировавшего событие;
- идентификатор клиентского процесса, инициировавшего событие;
- имя серверного компьютера;
- имя пользователя;
- код завершения действия, вызвавшего событие;
- мнемоника события;
- дополнительные поля, идентифицирующие базы данных, таблицы и другие объекты, вовлеченные в событие.
С помощью утилиты onshowaudit можно отобрать часть регистрационной информации и организовать ее просмотр или, воспользовавшись утилитой dbload, загрузить ее в базу данных и анализировать затем SQL-средствами. Регистрационная служба СУБД Informix является субъектно-ориентированной в том смысле, что можно задать свой набор отслеживаемых событий для каждого пользователя (субъекта), однако нет возможности указать имена объектов (таблиц, процедур и т.п.), операции с которыми отслеживались бы особым образом. Вместо этого предлагается полагаться на средства анализа регистрационной информации. Очевидно, после загрузки регистрационного журнала в базу данных можно отобрать сведения по сколь угодно сложному критерию и сгенерировать отчет, по существу, произвольного вида.
Регистрационные файлы и результат их загрузки в базу данных нуждаются в защите. В частности, для файлов рекомендуется установить в качестве владельца пользователя root, владеющей группой сделать informix, а режим доступа положить равным 0660 (доступ на чтение и запись только для владельца и группы).
Регистрационная информация нуждается в ежедневном анализе. В противном случае реакция на подозрительные действия или нарушения окажется запоздалой. В первом приближении подозрительными можно считать действия, завершившиеся ненормальным образом, то есть с ненулевым кодом. Более сложные эвристики могут опираться на статистический анализ спектра пользовательских действий. Как уже указывалось, после обнаружения подозрительной активности целесообразно включить режим регистрации всех действий пользователя и/или принять административные меры.
Средства поддержания высокой готовности
В коммерческих приложениях высокая готовность аппаратно-программных комплексов является важнейшим фактором. Применительно к СУБД средства поддержания высокой готовности должны обеспечивать нейтрализацию аппаратных отказов, особенно касающихся дисков, а также восстановление после ошибок обслуживающего персонала или прикладных программ.
Подобные средства должны с самого начала закладываться в архитектуру комплекса. Например, необходимо использовать тот или иной вид избыточных дисковых массивов. Конечно, это сделает аппаратно-программное решение более дорогим, но зато убережет от возможных убытков во время эксплуатации.
Сохранение и восстановление баз данных
Сохранение информации, хранящейся в базе данных, на ленты или диски, которые затем помещаются в безопасное место - давно используемый, практичный способ поддержания высокой готовности сервера баз данных.
В СУБД Informix служба сохранения и восстановления называется ON-Archive. Она предоставляет разнообразные, весьма продвинутые возможности, направленные на оптимизацию и автоматизацию работы этой службы, на защиту сохраненных данных от несанкционированного доступа, наконец, на восстановление информации после особенно тяжелых повреждений.
Основные понятия
Далее для простоты мы будем говорить о сохранении баз данных, хотя на самом деле архивируются более сложные объекты - так называемые пространства баз данных и сопутствующая информация, необходимая для последующего восстановления.
Под архивированием баз данных понимается процесс их сохранения на ленточных или дисковых томах. Архив отражает состояние базы данных, соответствующее определенному моменту времени (времени начала архивирования).
Резервное копирование логических журналов транзакций сохраняет файлы журналов, заполненные и готовые для копирования. Логические журналы транзакций и, соответственно, их резервные копии хранят сведения о действиях сервера баз данных, произведенных после архивирования или предыдущего резервного копирования. Интерпретация этих журналов позволяет восстановить базу данных до состояния, более позднего, чем момент последнего архивирования.
В качестве собирательного названия для архивирования и резервного копирования будет использоваться термин "сохранение".
Сохранение выполняется на один или несколько логических томов. Логический том - это или ленточный том, или каталог на диске.
Тома объединяются в наборы. Каждый том должен входить в набор. В операциях сохранения задается именно набор томов, куда направляется копия. Оператор (если он отслеживает процесс сохранения) может в ответ на запросы выбирать конкретные тома по своему усмотрению.
Восстановление позволяет воссоздать базу данных на основании информации, хранящейся в архиве и/или на резервной копии. Различают физическое и логическое восстановление.
При физическом восстановлении используется только архивная информация.
Логическое восстановление дополнительно опирается на интерпретацию сохраненных журналов транзакций, что позволяет получить более свежее состояние базы данных ("накатить вперед" заархивированное состояние).
Обзор возможностей системы ON-Archive
Система ON-Archive предоставляет следующие основные возможности:
- архивирование баз данных. Возможно архивирование в горячем режиме, без прерывания нормальной работы сервера баз данных. Можно одновременно сохранять несколько баз данных с помощью соответствующего числа устройств;
- резервное копирование журналов транзакций. Возможно копирование в непрерывном режиме, когда процесс копирования ждет заполнения очередного журнального файла, после чего сохраняет этот файл на ленте или диске. Сервер базы данных может затем использовать данный файл для новой порции журнальной информации;
- сохранение на удаленных устройствах, то есть устройствах, подключенных к другим компьютерам. Возможно одновременное сохранение базы данных на нескольких устройствах (локальных и/или удаленных);
- восстановление баз данных с помощью архивов и резервных копий. Возможно выборочное сохранение и восстановление отдельных баз данных;
- выполнение сохранения в соответствии с предварительно составленным расписанием. Возможна работа без вмешательства оператора;
- поддержание информации об архивах и резервных копиях. Доступ к этой информации осуществляется стандартными SQL-средствами;
- сжатие и шифрование информации в процессе сохранения;
- управление доступом к сохраненной информации;
- изменение режима журнализации.
Система ON-Archive может работать в трех режимах:
- под управлением оператора. В этом режиме оператор выдает команды на сохранение и восстановление, а система ON-Archive просит его установить те или другие тома и выдает на консоль сообщения об ошибках;
- в автоматическом режиме. В этом случае обработкой запросов занимается специальная программа, так называемый виртуальный оператор. Предполагается, что все тома, необходимые для сохранения или восстановления, уже установлены. Если при сохранении оказывается, что это не так, виртуальный оператор направляет информацию на транзитные тома, с которых, как предполагается, данные будут переписаны на постоянные носители. В случае возникновения ошибочных ситуаций виртуальный оператор отправляет администратору электронное письмо;
- в аварийном режиме. Работа в подобном режиме необходима в случае разрушения таблиц, в которых ON-Archive хранит свою информацию. Естественно, работа в аварийном режиме требует от оператора (администратора) большого числа ручных операций.
Основные компоненты системы ON-Archive
Система ON-Archive включает в себя ряд специализированных утилит, а также таблицы, хранящиеся в базе данных sysmaster.
Основной можно считать утилиту onarchive, позволяющую конфигурировать систему ON-Archive (в частности, определять наборы томов и привилегии пользователей), а также вводить и выполнять запросы на сохранение и восстановление информации. У этой утилиты есть свой командный язык и система меню. Перечислим наиболее употребительные команды из репертуара onarchive.
Таблица 3. |
С целью оптимизации система ON-Archive поддерживает архивы трех уровней. На уровне 0 создается полная копия базы данных. В архив уровня 1 попадают лишь данные, модифицированные после предыдущего полного архивирования. Наконец, архив уровня 2 состоит из информации, изменившейся с момента архивирования на уровне 1. Подобная система позволяет сократить время архивирования и тем самым фактически повышает надежность работы системы ON-Archive.
Другие средства повышения надежности, предоставляемые утилитой onarchive, - это добавление и проверка контрольных сумм архивов и резервных копий, возможность копирования носителей с сохраненной информацией, проверка меток томов перед записью (защищает от случайной перезаписи).
Перед архивированием на уровне 0 рекомендуется выполнять проверку непротиворечивости состояния баз данных и сопутствующей информации. Для этого служит утилита oncheck. Если по какой-либо причине нет возможности запускать oncheck перед каждым архивированием на уровне 0, необходимо хранить полные копии баз данных до следующей проверки непротиворечивости.
Утилита onautovop представляет собой реализацию виртуального оператора, выполняющего введенные ранее запросы в автоматическом режиме.
Утилита ondatartr позволяет пользователям root и informix восстанавливать не только базы данных, но и саму конфигурацию системы ON-Archive после особенно тяжелых повреждений. Тем самым ondatartr поддерживает работу в аварийном режиме. Общение с утилитой ondatartr происходит на командном языке, аналогичном языку onarchive.
Программа oncatalgr является демоном, обслуживающим подключение к базе данных sysmaster, хранящей, в частности, таблицы системы ON-Archive. Запуск этой программы должен предшествовать всем прочим действиям в рамках системы ON-Archive.
Таблицы системы ON-Archive хранят:
- определения томов и их наборов;
- определения наборов баз данных, обслуживаемых на предмет сохранения и восстановления;
- журнал запросов на сохранение и восстановление;
- сведения о правах доступа пользователей к резервным носителям;
- другую информацию.
Управление доступом к сохраненной информации
В конфигурационном файле системы ON-Archive задаются уровни привилегий, на которых она функционирует. Таких уровней три:
- OPERATOR - на данном уровне операции сохранения и восстановления могут выполнять только пользователи root и informix;
- GROUP - здесь право пользования системой ON-Archive получают все члены группы super_archive. Правда, они подвергаются контролю прав доступа.
- OWNER - дает право на сохранение и восстановление всем пользователям, однако они подвергаются проверке прав доступа и могут контролировать только собственные запросы.
Конфигурация может включать в себя любую комбинацию этих трех уровней.
При определении наборов томов задается класс доступа к ним. Если набор объявлен как системный (SYSTEM), к томам, входящим в него, может обращаться любой пользователь. С личными (USER) наборами могут оперировать только те, кто перечислен в списке управления доступом, следующим за спецификатором USER. Если нужно, чтобы к личному набору имели доступ члены группы super_archive, их нужно включить в этот список. Пользователи root и informix могут оперировать со всеми наборами.
С томом или набором томов можно ассоциировать права доступа - на чтение, запись и удаление (последнее право позволяет удалить определение тома или набора из таблиц системы ON-Archive). Чтобы права принимались во внимание, набор должен быть системным или же пользователь должен входить в список управления доступом.
Тома, помеченные как транзитные (то есть содержащие информацию, записанную на них виртуальным оператором) или импортируемые (хранящие данные, принесенные с другой системы), доступны только на чтение.
Дополнительным средством ограничения доступа к сохраненной информации является ее шифрование. В стандартной поставке Informix-OnLine поддерживает только шифрование методом исключающего или (правда, ключ может быть многобайтным), однако по согласованию с фирмой Informix возможно использование других криптографических методов (например, сертифицированных в той или иной стране).
Мы видим, что администратору СУБД предоставлен широкий выбор средств, обеспечивающих актуальность сохраненной информации и ее защиту от несанкционированного доступа.
Кластерная организация сервера баз данных
Средства сохранения и восстановления, описанные в предыдущем разделе, позволяют относительно быстро (за несколько десятков минут) восстановить работоспособность сервера баз данных с минимальными потерями пользовательской информации (могут пропасть результаты транзакций, выполненных в пределах нескольких минут перед отказом). К сожалению, даже эти довольно высокие показатели не всегда оказываются достаточными. Некоторые современные коммерческие приложения, например банковские или торговые, требуют поддержания постоянной работоспособности. В таком случае целесообразно обратиться к кластерной организации серверов баз данных.
Мы будем понимать под кластером конфигурацию из нескольких компьютеров (узлов), выполняющих общее приложение (такое, например, как сервер баз данных). Обычно кластер содержит также несколько дисковых подсистем, совместно используемых узлами-компьютерами, и избыточные связи между компонентами. С внешней точки зрения кластер выглядит как единое целое, а наличие нескольких узлов способствует повышению производительности и устойчивости к отказам.
В настоящем разделе будет рассмотрена разработка компании Sun Microsystems - SPARCcluster PDB Server (параллельный сервер баз данных на основе SPARC-кластера). Эту архитектуру на начало 1995 года поддерживал лишь сервер компании Oracle, однако ожидается, что компании Sybase и Informix также воспользуются преимуществами кластерной организации.
Аппаратная организация SPARCcluster PDB Server
В минимальной конфигурации SPARCcluster PDB Server состоит из двух узлов SPARCserver 1000, двух дисковых подсистем SPARCstorage Array и консоли кластера (SPARCclassic). Узлы-компьютеры соединяются между собой посредством быстрого Ethernet (100 Мбит/с), дисковые подсистемы подключаются через оптоволоконные каналы. В более мощной конфигурации вместо SPARCserver 1000 может использоваться SPARCcenter 2000, а число дисковых подсистем способно достигать 32 (до 1 Тбайта дискового пространства). Каждый узел кластера - это многопроцессорный компьютер, к которому, помимо прочих, подключены накопители на DAT-лентах (или автозагрузчики кассет с такими лентами). Все связи с компьютерами и дисковыми подсистемами продублированы.
Следующий рисунок поясняет аппаратную организацию SPARCcluster PDB Server.
Рисунок 1.
Аппаратная организация SPARCcluster PDB Server (на рисунке не показаны
связи кластера с внешнем миром.)
Подобная аппаратная архитектура обеспечивает устойчивость к отказам (никакой одиночный отказ не вызывает остановки работы кластера в целом). В то же время избыточные компоненты (компьютеры, дисковые подсистемы) отнюдь не ограничиваются ролью горячего резерва - они полностью задействованы в процессе обычной работы.
Вся аппаратура устроена так, что допускает замену в горячем режиме, без остановки других компонентов кластера.
Программная организация SPARCcluster PDB Server
Если рассматривать программную организацию SPARCcluster PDB Server в контексте надежной работы баз данных, необходимо обратить внимание еще на один компонент - фронтальную машину, на которой выполняется какой-либо монитор транзакций, например TUXEDO. С учетом этого дополнения программная организация приобретает следующий вид.
Рисунок 2.
Программная организация SPARCcluster PDB Server (узлы кластера работают
под управлением ОС Solaris версии 2.4 или выше)
Рассмотрим компоненты программного обеспечения SPARCcluster PDB Server.
Устойчивый к отказам распределенный менеджер блокировок (Fault Tolerant Distributed Lock Manager, FT-DLM) управляет параллельным доступом к базам данных, устанавливая и снимая блокировки. Кроме того, FT-DLM нейтрализует последствия отказов, снимая блокировки, установленные вышедшим из строя узлом. FT-DLM взаимодействует с сервером Oracle для поддержки неблокируемых операций чтения и для блокировки на уровне строк при записи в таблицы. В результате обеспечивается целостность и сериализация транзакций в сочетании с параллельной работой узлов кластера и параллельным доступом к нескольким дисковым подсистемам.
Распределенность менеджера блокировок означает, что на каждом узле кластера работает свой экземпляр FT-DLM и что FT-DLM умеет динамически реконфигурировать себя (как при выходе узлов из строя, так и при добавлении новых узлов). В результате выход из строя одного узла не означает краха всего сервера баз данных - сервер жив, пока работает хотя бы один менеджер блокировок.
В рассматриваемом контексте основное назначение распределенного менеджера томов - поддержка зеркалирования дисков с тем важным дополнением, что устройства, составляющие пару, могут принадлежать разным дисковым подсистемам.
Подсистема обнаружения и нейтрализации отказов постоянно отслеживает доступность ресурсов, составляющих кластер. При обнаружении неисправности запускается процесс реконфигурации, изолирующий вышедший из строя компонент при сохранении работоспособности кластера в целом (с выходом из строя диска справляется менеджер томов).
Подсистема управления кластером состоит из трех инструментов с графическим интерфейсом: консоли кластера, менеджера томов и менеджера сервера Oracle. Их интеграция обеспечивает централизованное оперативное управление всеми ресурсами кластера.
Нейтрализация отказа узла
Рассмотрим, как в SPARCcluster PDB Server реализована нейтрализация самого неприятного из отказов - отказа узла. Программное обеспечение предпринимает при этом следующие действия:
- Подсистема обнаружения отказов выявляет вышедший из строя узел.
- Создается новая конфигурация кластера, без отказавшего узла. Этот процесс занимает 1-2 минуты, в течение которых обработка транзакций приостанавливается.
- Менеджер блокировок производит восстановление:
- a) Подтвержденные транзакции от отказавшего узла (транзакции, об успешном завершении которых другие узлы кластера не успели узнать) накатываются вперед и деблокируются;
- б) Неподтвержденные транзакции от отказавшего узла откатываются и также деблокируются.
- В этот период транзакции обрабатываются исправными узлами, но, вероятно, несколько медленнее, чем обычно.
- Монитор транзакций повторно направляет в кластер неподтвержденные транзакции.
- Вышедший из строя узел ремонтируется и вновь запускается.
- Создается новая конфигурация кластера, включающая в себя отремонтированный узел.
Отметим, что все действия, исключая ремонт отказавшего компонента, выполняются в автоматическом режиме и не требуют вмешательства обслуживающего персонала. Следует учитывать, однако, что если следующая поломка случится до окончания ремонта, кластер может на какое-то время стать неработоспособным, поэтому затягивать ремонт не рекомендуется.
Строго говоря, SPARCcluster PDB Server не поддерживает одну из важных кластерных функций - с внешней точки зрения, кластер не выглядит как единое целое. Прикладные программы могут напрямую подключаться к его узлам, и тогда отказы узлов требуют нейтрализации на прикладном уровне. В то же время использование мониторов транзакций позволяет сгладить этот недостаток, обеспечивая к тому же балансировку загрузки между узлами.
Informix OnLine-XPS - среда высокой доступности данных
Сервер Informix OnLine Extended Parallel Server (OnLine-XPS) предназначен для слабосвязанных (кластерных) систем и систем с массовым параллелизмом (MPP).
Подобно аппаратным платформам, на которые он рассчитан, Informix OnLine-XPS построен на принципах неразделения ресурсов (независимости узлов). Каждый из узлов кластера или MPP-системы выполняет свой экземпляр программного обеспечения СУБД, которое включает сервисы протоколирования, восстановления, управления блокировками и буферами. Узел, на котором выполняются эти сервисы, называется ко-сервером.
Каждый ко-сервер "владеет" некоторым набором дисков и размещенными на них фрагментами баз данных (рис. 3). Как правило, ко-сервер имеет физический доступ к дискам других ко-серверов для целей аварийного переключения, но в нормальном режиме он работает только со своим набором.
Рисунок 3.
Архитектура сервера Informix OnLine-XPS
Поскольку кластеры и платформы с массовым параллелизмом состоят из относительно независимых узлов, они обладают высоким потенциалом отказоустойчивости. Informix OnLine-XPS в полной мере использует этот потенциал и предоставляет ряд взаимодополняющих гибких механизмов, которые в совокупности способны обеспечить требуемый уровень отказоустойчивости/высокой готовности данных, а именно:
- аварийное переключение ко-серверов;
- зеркалирование дисковых областей;
- тиражирование данных;
- игнорирование недоступных данных.
Степень отказоустойчивости системы зависит от фактических возможностей используемой аппаратуры. Так, реализация аварийного переключения в Informix OnLine-XPS основана на предположении, что диски являются двухпортовыми, следовательно, аппаратура должна обладать этим свойством. Предполагается, что аппаратура позволяет распознавать типы произошедших отказов (различать отказы узлов и отказы коммуникационных линий). Аппаратная архитектура должна содержать также избыточные шины сообщений для защиты от возможных сетевых сбоев.
Аварийное переключение ко-серверов выполняется следующим образом. Каждый ко-сервер владеет некоторым набором дисков, на которых располагаются фрагменты базы данных. Диски, как правило, являются двухпортовыми, и каждый из них физически соединен еще с некоторым ко-сервером Informix OnLine-XPS. Если в результате аппаратного или программного сбоя узел выходит из строя, его диски автоматически передаются во владение альтернативным ко-серверам и доступность данных сохраняется. Рассмотрим, например, конфигурацию на рис. 4. Ко-сервер 2 владеет дисками данных 3 и 4. Диск 3 подключен к альтернативному ко-серверу 1, а диск 4 - к ко-серверу 3.
Рисунок 4.
Аврийное переключение узлов
Когда обнаруживается отказ узла, Informix OnLine-XPS автоматически выполняет восстановление путем аварийного переключения. Диски, журнал транзакций, рабочую загрузку отказавшего узла берут на себя остальные ко-серверы.
При отказе узла одна или несколько транзакций могли остаться незавершенными, поэтому ко-сервер, принявший журнал вышедшего из строя узла, запускает процедуру быстрого восстановления, цель которой - привести данные в состояние физической и логической целостности. Во время этой процедуры база данных сначала восстанавливается в состояние последней контрольной точки, затем выполняется "накат" всех завершенных после этого момента транзакций и откат всех незавершенных.
Informix OnLine-XPS располагает встроенными средствами зеркалирования дисковых областей (журналов транзакций, наиболее ответственных фрагментов баз данных), что позволяет преодолевать последствия дисковых сбоев и обеспечивать непрерывную доступность данных. Informix OnLine-XPS поддерживает также аппаратные средства зеркалирования, если они имеются; преимущество его собственных программных средств в том, что они позволяют избирательно задавать множество фрагментов, подлежащих зеркалированию.
Клиентам, которые используют аппаратные платформы без поддержки двухпортовых дисков, предлагаются две опции, позволяющие так или иначе преодолеть последствия отказов: тиражирование данных и игнорирование недоступных данных. Механизм тиражирования обеспечивает доступность данных путем поддержания копии базы (или ее фрагмента) на другом узле. При отказе основного узла клиенты переключаются на другой, продолжая работать с копией данных (рис. 5).
Рисунок 5.
Тиражирование данных с основного узла на вторичный.
Во многих ситуациях при выходе из строя отдельных узлов или дисков вполне допустимой может быть неполная обработка данных, что предпочтительнее, чем полный отказ в обслуживании. Опция игнорирования позволяет обходить при обработке запросов фрагменты базы данных, если они в данный момент недоступны. Например, для запроса о распределении объемов продаж некоторого продукта по регионам может быть получен результат, в котором отсутствуют данные об объеме продаж в одном из регионов, если соответствующий диск отказал.
Существенный фактор обеспечения непрерывной доступности данных - возможность выполнять основные административные действия без останова сервера. Informix OnLine-XPS позволяет в оперативном многопользовательском режиме выполнять такие процедуры, как рефрагментация таблиц, добавление и уничтожение столбцов, создание и уничтожение индексов, сохранение и восстановление данных, замена диска, изменение конфигурации узла.
Тиражирование данных
В контексте информационной безопасности тиражирование можно рассматривать как средство повышения доступности данных. Стала легендой история про бакалейщика из Сан-Франциско, который после разрушительного землетрясения восстановил свою базу данных за 16 минут, перекачав из другого города предварительно протиражированную информацию.
Развитые возможности тиражирования предоставляет СУБД INGRES. Им посвящена статья [2]. Здесь мы рассмотрим возможности другого популярного сервера СУБД - Informix OnLine Dynamic Server (OnLine-DS) 7.1. В отличие от предыдущего раздела, речь пойдет об обычных (а не кластерных) конфигурациях.
В Informix OnLine-DS 7.1 поддерживается модель тиражирования, состоящая в полном отображении данных с основного сервера на вторичные.
В конфигурации серверов Informix OnLine-DS с тиражированием выделяется один основной и ряд вторичных серверов. На основном сервере выполняется и чтение, и обновление данных, а все изменения передаются на вторичные серверы, доступные только на чтение. В случае отказа основного сервера вторичный автоматически или вручную переводится в режим доступа на чтение и запись. Прозрачное перенаправление клиентов при отказе основного сервера не поддерживается, но оно может быть реализовано в рамках приложений.
После восстановления основного сервера возможен сценарий, при котором этот сервер становится вторичным, а бывшему вторичному, который уже функционирует в режиме чтения-записи, придается статус основного; клиенты, которые подключены к нему, продолжают работу. Таким образом, обеспечивается непрерывная доступность данных.
Тиражирование осуществляется путем передачи информации из журнала транзакций (логического журнала) в буфер тиражирования основного сервера, откуда она пересылается в буфер тиражирования вторичного сервера. Такая пересылка может происходить либо в синхронном, либо в асинхронном режиме. Синхронный режим гарантирует полную согласованность баз данных - ни одна транзакция, зафиксированная на основном сервере, не останется незафиксированной на вторичном, даже в случае сбоя основного сервера. Асинхронный режим не обеспечивает абсолютной согласованности, но улучшает рабочие характеристики системы.
Побочный положительный эффект тиражирования - возможность вынести преимущественно на вторичный сервер ресурсоемкие приложения поддержки принятия решений. В этом случае они могут выполняться с максимальным использованием средств параллельной обработки, не подавляя приложений оперативной обработки транзакций, сосредоточенных на основном сервере. Это также можно рассматривать как фактор повышения доступности данных.
Угрозы, специфичные для СУБД
Главный источник угроз, специфичных для СУБД, лежит в самой природе баз данных. Основным средством взаимодействия с СУБД является язык SQL - мощный непроцедурный инструмент определения и манипулирования данными. Хранимые процедуры добавляют к этому репертуару управляющие конструкции. Механизм правил дает возможность выстраивать сложные, трудные для анализа цепочки действий, позволяя попутно неявным образом передавать право на выполнение процедур, даже не имея, строго говоря, полномочий на это. В результате потенциальный злоумышленник получает в свои руки мощный и удобный инструментарий, а все развитие СУБД направлено на то, чтобы сделать этот инструментарий еще мощнее и удобнее.
Мы рассмотрим несколько угроз, возникающих при использовании злоумышленником средств языка SQL.
Получение информации путем логических выводов
Нередко путем логического вывода можно извлечь из базы данных информацию, на получение которой стандартными средствами у пользователя не хватает привилегий.
Следуя [3], рассмотрим больничную базу данных, состоящую из двух таблиц. В первой хранится информация о пациентах (анкетные данные, диагноз, назначения и т.п.), во второй - сведения о докторах (расписание мероприятий, перечень пациентов и т.д.). Если пользователь имеет право доступа только к таблице докторов, он тем не менее может получить косвенную информацию о диагнозах пациентов, поскольку, как правило, врачи специализируются на лечении определенных болезней.
Еще один пример - выяснение набора первичных ключей таблицы при наличии только привилегии INSERT (без привилегии SELECT). Если набор возможных значений ключей примерно известен, можно пытаться вставлять новые строки с "интересными" ключами и анализировать коды завершения SQL-операторов. Как мы видели из предыдущего примера, сам факт присутствия определенного ключа в таблице может быть весьма информативным.
Если для реализации контроля доступа используются представления и эти представления допускают модификацию, с помощью операций модификации/вставки можно получить информацию о содержимом базовых таблиц, не располагая прямым доступом к ним.
Основным средством борьбы с подобными угрозами, помимо тщательно проектирования модели данных, является механизм размножения строк. Суть его в том, что в состав первичного ключа, явно или неявно, включается метка безопасности, за счет чего появляется возможность хранить в таблице несколько экземпляров строк с одинаковыми значениями "содержательных" ключевых полей. Наиболее естественно размножение строк реализуется в СУБД, поддерживающих метки безопасности (например, в INGRES/Enhanced Security), однако и стандартными SQL-средствами можно получить удовлетворительное решение.
Продолжая медицинскую тематику, рассмотрим базу данных, состоящую из одной таблицы с двумя столбцами - имя пациента и диагноз. Предполагается, что имя является первичным ключом. Каждая из строк таблицы относится к одному из двух уровней секретности - высокому (HIGH) и низкому (LOW). Соответственно, и пользователи подразделяются на два уровня благонадежности, которые мы также будем называть высоким и низким.
К высокому уровню секретности относятся сведения о пациентах, находящихся под надзором правоохранительных органов или страдающих специфическими заболеваниями. На низком уровне располагаются данные о прочих пациентах, а также информация о некоторых "секретных" пациентах с "маскировочным" диагнозом. Части таблицы могут выглядеть примерно так:
Имя |
Диагноз |
Иванов Петров Сидоров |
СПИД Сифилис Стреляная рана |
Таблица 4.
Данные с высоким уровнем секретности.
Имя |
Диагноз |
Иванов Ивлев Ярцев Суворов |
Пневмония Рак легких Ожог второй степени Микроинфаркт |
Таблица 5.
Данные с низким уровнем секретности.
Обратим внимание на то, что сведения о пациенте по фамилии Иванов присутствуют на обоих уровнях, но содержат разные диагнозы.
Мы хотим реализовать такую дисциплину доступа, чтобы пользователи с низким уровнем благонадежности могли манипулировать только данными на своем уровне и не имели возможности сделать какие-либо выводы о присутствии в секретной половине сведений о конкретных пациентах. Пользователи с высоким уровнем благонадежности должны иметь доступ к секретной половине таблицы, а также к информации о прочих пациентах. Дезинформирующих строк о секретных пациентах они видеть не должны:
Имя |
Диагноз |
Иванов Ивлев Петров Сидоров Ярцев Суворов |
СПИД Рак легких Сифилис Стреляная рана Ожог второй степени Микроинфаркт |
Таблица 6.
Данные, доступные пользователю с высоким уровнем секретности (обратим
внимание, что строка "Иванов Пневмания" здесь отсутствует.).
Размножение строк, обеспечивающее необходимую дисциплину доступа, стандартными средствами SQL можно реализовать следующим образом:
CREATE TABLE BaseTable1( PatientName char (20), Disease char (20), Level char (10) ) WITH PRIMARY KEY (PatientName, Level); CREATE TABLE BaseTable2( UserName char (20), SecurityLevel char (10) ) WITH PRIMARY KEY (UserName); CREATE VIEW PatientInfo( PatientName, Disease ) AS SELECT PatientName, Disease FROM TABLE BaseTable1 WHERE BaseTable1.Level=( SELECT SecurityLevel FROM BaseTable2 WHERE UserName = username ()) OR( BaseTable1.Level = "LOW" AND NOT EXISTS ( SELECT * FROM BaseTable1 AS X WHERE X.PatientName = BaseTable1.PatientName AND X.Level = "HIGH"));
Всем пользователям предоставляется доступ только к представлению PatientInfo. Пользователи с низким уровнем благонадежности увидят только информацию, выдаваемую первой конструкцией WHERE, поскольку для них поле SecurityLevel имеет значение "LOW" :
WHERE BaseTable1.Level = ( SELECT SecurityLevel FROM BaseTable2 WHERE UserName = username ())
В формирование представления для благонадежных пользователей внесут вклад обе конструкции WHERE, причем в случае совпадения имен менее секретные записи будут заслонены более секретными (конструкция NOT EXISTS).
Мы видим, что в отличие от систем с меточной безопасностью, стандартные SQL-серверы предоставляют довольно тяжеловесные средства для реализации механизма размножения строк. Тем не менее эти средства не так плохи, как может показаться на первый взгляд. Можно надеяться, что оптимизатор SQL-запросов, входящий в комплект любой современной СУБД, сделает время доступа к представлению PatientInfo сравнимым с временем извлечения строк из базовых таблиц.
Нетрудно понять, что борьба с получением информации путем логического вывода актуальна не только для медицинских баз данных и что она (борьба) требует кропотливого труда при проектировании модели данных и иерархии привилегий, а также при реализации видимых пользователям представлений.
Агрегирование данных
Агрегирование - это метод получения новой информации путем комбинирования данных, добытых легальным образом из различных таблиц. Агрегированная информация может оказаться более секретной, чем каждый из компонентов, ее составивший. В качестве примера можно рассмотреть базу данных, хранящую параметры всех комплектующих, из которых будет собираться ракета, и инструкцию по сборке. Данные о каждом виде комплектующих необходимы поставщикам, инструкция по сборке (вставьте деталь A в отверстие B) - сборочному производству.
Информация об отдельных частях сама по себе не является секретной (какой смысл скрывать материал, размеры и количество гаек?). В то же время анализ всей базы позволяет узнать, как сделать ракету, что может считаться государственной тайной.
Повышение уровня секретности данных при агрегировании вполне естественно - это следствие закона перехода количества в качество. Бороться с агрегированием можно за счет тщательного проектирования модели данных и максимального ограничения доступа пользователей к информации.
Покушения на высокую готовность (доступность)
Если пользователю доступны все возможности SQL, он может довольно легко затруднить работу других пользователей инициировав, например, длительную транзакцию, захватывающую большое число таблиц). Современные многопотоковые серверы СУБД отражают лишь самые прямолинейные атаки, состоящие, например, в запуске в "часы пик" операции массовой загрузки данных. Настоятельно рекомендуется не предоставлять пользователям непосредственного SQL-доступа к базе данных, используя в качестве фильтров серверы приложений. Выбор подобной архитектуры разумен и по многим другим соображениям.
В качестве любопытной угрозы, специфичной для реляционных СУБД, упомянем ссылочные ограничения. Строго говоря, наложение такого ограничения препятствует удалению строк из таблицы, содержащей первичные ключи, хотя в современных версиях SQL можно запросить так называемое каскадное удаление. Впрочем, искажение прочих ограничений на таблицы и их столбцы по-прежнему остается опасным средством покушения на доступность данных.
Защита коммуникаций между сервером и клиентами
Проблема защиты коммуникаций между сервером и клиентами не является специфичной для СУБД, она присуща всем распределенным системам. Вполне естественно, что и решения здесь ищутся общие, такие, например, как в распределенной вычислительной среде (Distributed Computing Environment, DCE) концерна OSF. Разработчикам СУБД остается "погрузить" свои программные продукты в эту среду, что и сделала компания Informix, реализовав Informix-DCE/Net [4].
Informix-DCE/Net открывает доступ к сервисам DCE для всех инструментальных средств Informix, а также любых приложений или инструментальных комплексов от независимых поставщиков, которые используют интерфейс ODBC (рис. 8).
Рис.8. Конфигурация прикладной или инструментальной среды клиент-сервер, использующий Informix-DCE/Net.
Ключевым компонентом в реализации взаимодействий клиент-сервер в среде DCE является сервис безопасности. Основные функции, предоставляемые этим сервисом, - аутентификация, реализуемая средствами Kerberos, авторизация (проверка полномочий) и шифрование.
Informix-DCE/Net использует все средства обеспечения безопасности, имеющиеся в DCE. Например, для каждого приложения клиент-сервер администратор может задать один из пяти уровней защиты:
- защита пересылаемых данных только при установлении соединения клиента с сервером;
- защита данных только на начальном этапе выполнения удаленного вызова процедуры, когда сервер впервые получает запрос;
- подтверждение подлинности источника данных. Проверяется, все ли поступающие на сервер данные получены от определенного клиента;
- подтверждение подлинности источника и целостности данных. Проверяется, что отправленные данные не были изменены;
- подтверждение подлинности источника, целостности и конфиденциальности данных. Выполняются проверки, предусмотренные на предыдущем уровне, и осуществляется шифрование всех пересылаемых данных.
Сервис аутентификации DCE, поддерживаемый Informix-DCE/Net, существенно улучшает характеристики безопасности распределенной среды, упрощая в то же время деятельность как пользователей, так и администраторов. Достаточно иметь единое входное имя и пароль для DCE, чтобы обращаться к любой погруженной в эту среду базе данных. При запуске приложения Informix-DCE/Net запрашивает аутентификационную информацию пользователя у DCE и подключает его к требуемой базе.
Наличие единой точки администрирования входных имен и прав доступа к базам данных и приложениям способствует упорядочению общей ситуации с безопасностью. Например, если уничтожается входное имя DCE, то администратор может быть уверен, что данный пользователь уже не сможет получить доступ ни к одному из системных ресурсов.
Заключение
Конфигурация, к которой имеет доступ хотя бы один программист, не может считаться безопасной. Поэтому обеспечение информационной безопасности баз данных - дело весьма сложное, во многом в силу самой природы реляционных СУБД. Средства доступа к данным становятся все мощнее и удобнее, а защитные механизмы явно отстают. На этом фоне выделяется СУБД INGRES, содержащая наиболее широкий спектр механизмов обеспечения безопасности.
При проектировании и реализации политики безопасности следует учитывать (см., например, [5]), что для коммерческих организаций потенциальные угрозы в порядке убывания размеров ущерба располагаются следующим образом:
- Ошибки и упущения обслуживающего персонала и пользователей.
- Действия нечестных работников.
- Огонь.
- Действия обиженных работников.
- Вода.
- Действия посторонних лиц.
Мы видим, что основное внимание следует обращать на систематизацию и автоматизацию действий администраторов баз данных и сервера СУБД. Большой процент ручной работы неизбежно приведет к ошибкам (непреднамеренным), которые могут оказаться страшнее пожара.
Защита от нечестных и обиженных работников требует, в первую очередь, грамотной постановки службы учета и реагирования на подозрительные ситуации. Важна, разумеется, и психологическая атмосфера, царящая в коллективе.
Поддержание актуальных резервных копий и их хранение в безопасном месте - самое надежное средство восстановления после пожаров, наводнений и прочих бедствий. Кластерная организация сервера баз данных важна в ситуациях, когда требуется действительно непрерывная работа в течение длительного времени и потенциальная масштабируемость сервера.
Защита от посторонних пользователей может строиться на основе использования сервера аутентификации (такого, например, как Kerberos) и брандмауэра (например, Firewall-1).
Хочется еще раз подчеркнуть необходимость систематического подхода к обеспечению информационной безопасности столь сложного объекта, каковым является современный сервер баз данных.
Литература
- Ладыженский Г.М. Системы управления базами данных - коротко о главном. - Jet Info, 1995, ## 3-5.
- Ладыженский Г.М. Тиражирование данных в СУБД INGRES. - Jet Info, 1994.
- Polk T.W., Bassham L.E. Security Issues in the Database Language SQL. - NIST Special Publication 800-8.
- G. Chung. Informix-DCE/NET Technical White Paper. - Informix Systems Journal, Vol. 1, Number 3, July-August 1995.
- Manola F.A. A Personal View on DBMS Security. - in DATABASE SECURITY: Status and Prospects. C.E. Landwehr (Editor). Elsevier science Publishers B.V. (North Holland). IFIP, 1988, p. 23-34.
- Castano S., Fugini M., Martella G., Samarati P. Database Security. - Addison-Wesley, 1995.