В ходе этого урока мы с вами поговорим о средствах SQL, призванных помочь обеспечить надежное хранение данных в реляционных базах данных. Каждая реализация языка предлагает для этого свои команды, но в их основе лежат одни и те же принципы, определенные стандартом ANSI По поводу синтаксиса этих команд, как и за конкретными рекомендациями по поводу защиты данных, следует обратиться к документации той реализации SQL, которую вы используете
Основными на этом уроке будут следующие темы.
• Защита данных
• Защита данных и управление доступом
• Привилегии доступа к системе
• Привилегии доступа к объектам
• Предоставление привилегий пользователям
• Отмена привилегий
• Особенности системы защиты в базах данных
Защита данных в базах данных означает просто защиту данных от несанкционированного доступа к ним. Несанкционированный доступ включает и доступ к данным пользователей, имеющих право доступа не ко всем данным базы данных, а только к их части. К защите данных относятся и действия, направленные на недопущение несанкционированного подключения к базе данных и распределения привилегий В базе данных имеется целая иерархия пользователей, начиная от проектировщиков базы данных, людей, ответственных за ее работу (таких, как администратор базы данных), программистов и до конечных пользователей. И хотя конечные пользователи обычно являются пользователями с наиболее ограниченными привилегиями, именно для них создаются базы данных. Каждый пользователь получает в базе данных свой уровень доступа и этот уровень должен содержать минимум привилегий, необходимых для решения поставленных перед этим пользователем задач.
Различия между защитой данных и управлением пользователями
Вы можете спросить: "В чем различие между защитой данных и управлением пользователями?" В конце концов, в ходе предыдущего урока, где обсуждалось управление пользователями, кажется, рассматривались и вопросы безопасности хранения данных. Но хотя управление пользователями и защита данных действительно оказываются задачами неразрывно связанными, каждая из этих задач имеет свои цели.
Без хорошо спроектированной и отлаженной программы управления пользователями невозможно обеспечить надежное хранение и защиту данных. Пользователям назначаются имена и пароли, разрешающие им общий доступ к базе данных. Вместе с назначенными пользователям именами в базе данных должны храниться их настоящие имена, информация о должности и месте работы, номер телефона и название базы данных, к которой доступ пользователю разрешен. Начальный пароль для доступа к базе данных выдается пользователю администратором базы данных или сотрудником службы безопасности и этот пароль должен быть немедленно изменен новым пользователем при первом же входе в базу данных.
Безопасность требует и большего. Например, если пользователю уже не требуются некоторые из предоставленных ему привилегий, эти привилегии должны быть для него отменены Если же оказывается, что пользователю уже не требуется доступ к базе данных, его учетная запись должна быть из базы данных удалена.
В общем, управление пользователями представляет собой процесс создания и удаления учетных записей пользователей и наблюдение за действиями пользователей в рамках базы данных Зашита данных в базе данных означает следующий шаг в защите путем распределения привилегий для работы в рамках различных уровней доступа, отмены привилегий и принятия мер по защите различных данных, в частности, жизненно важных файлов базы данных.
Здесь мы обсуждаем привилегии доступа к базе данных потому, что эта книга посвящена SQL, а не базам данных Однако вам следует знать, что имеются и другие аспекты безопасности баз данных, в частности, защита служебных файлов базы данных, которые важны не менее чем распределение привилегий доступа Проблема обеспечения надежной защиты данных в зависимости от используемой системы управления реляционной базой данных может оказаться весьма непростой задачей
Привилегии — это уровни полномочий, предоставленных пользователю при доступе к самой базе данных и ее объектам, при манипуляции данными и при выполнении в рамках базы данных различных административных функций. Привилегии предоставляются посредством команды GRANT и отменяются посредством команды REVOKE.
То, что пользователь может подключиться к базе данных, совсем не означает того, что пользователь сможет извлечь данные из этой базы данных. Доступ данных в рамках базы данных как раз и разрешается путем назначения привилегий доступа. Различают следующие два типа привилегий доступа.
1. Привилегии доступа к системе.
2. Привилегии доступа к данным.
Привилегии доступа к системе — это привилегии, дающие возможность пользователю решать в рамках базы данных административные задачи типа создания и удаления баз данных, учетных записей пользователей, изменения и удаления различных объектов базы данных, изменения состояния объектов, изменения состояния базы данных и других подобных операций, несущих в себе при недостаточной внимательности потенциальную опасность для базы данных в целом.
Предлагаемые разными производителями баз данных привилегии доступа к системе сильно отличаются, поэтому по поводу имеющихся в рамках вашей системы привилегий доступа и правильного их использования необходимо обратиться к соответствующим разделам документации.
Вот список некоторых из привилегий доступа к системе, которые предлагаются в рамках Sybase.
CREATE DATABASE
CREATE DEFAULT
CREATE PROCEDURE
CREATE RULE
DUMP DATABASE
DUMP TRANSACTION
EXECUTE
Вот список некоторых из привилегий доступа к системе, которые предлагаются в рамках Oracle.
CREATE TABLE
CREATE ANY TABLE
ALTER ANY TABLE
DROP TABLE
CREATE USER
DROP USER
ALTER USER
ALTER DATABASE
ALTER SYSTEM
BACKUP ANY TABLE
SELECT ANY TABLE
Привилегии доступа к объектам — это уровни полномочий, предоставленных пользователю при работе с объектами базы данных, и это значит, что для выполнения определенных операций с объектами базы данных пользователю требуется предоставить соответствующие привилегии. Например, чтобы извлечь данные из таблицы другого пользователя, следует сначала получить право доступа к его данным. Привилегии доступа к объектам предоставляются пользователям базы данных владельцами объектов. Напоминаем, что владельца объекта называют также владельцем схемы.
Стандарт ANSI определяет следующие привилегии доступа к объектам.
USAGE. Разрешает использование заданной области.
SELECT. Разрешает доступ к заданной таблице.
INSERT (имя_столбца). Позволяет разместить данные в указанном столбце заданной таблицы.
INSERT. Позволяет поместить данные во все столбцы заданной таблицы.
UPDATE {имя_столбца). Позволяет изменить данные в указанном столбце заданной таблицы.
UPDATE. Позволяет изменить данные во всех столбцах заданной таблицы.
REFERENCES (имя_столбца). Позволяет сослаться в условиях целостности на указанный столбецзаданной таблицы; требуется для всех условий целостности.
REFERENCES, позволяет сослаться в условиях целостности на любой столбец заданной таблицы.
Владелец объекта автоматически наделяется всеми привилегиями относительно этого объекта. Такие привилегии могут быть разрешены также имеющейся в некоторых реализациях языка очень удобной командой GRANT OPTION, которая будет обсуждаться ниже.
Именно привилегии доступа к объектам используются для разрешения или ограничения доступа к объектам данной схемы. Эти привилегии можно использовать для защиты объектов одной схемы от доступа пользователей базы данных, имеющих право доступа к объектам другой схемы той же базы данных.
Кто предоставляет и отменяет привилегии?
Обычно право использовать команды GRANT и REVOKE имеет администратор базы данных, но если есть администратор по безопасности, то он тоже может иметь право использовать эти команды. Конкретные инструкции по поводу того, кому и какие именно привилегии следует назначить или отменить, должны исходить от руководства и желательно в письменном виде.
Привилегии доступа к объекту должен распределять владелец этого объекта. Даже администратор базы данных не имеет права давать разрешение на использование не принадлежащего ему объекта, хотя, конечно, администратор всегда имеет реальную возможность это сделать.
Доступ пользователей к базе данных изначально контролируется посредством предоставления пользователям имен и паролей, но в большинстве систем управления базами данных этим дело не ограничивается. Создание учетной записи пользователя является лишь первым шагом для разрешения доступа к данным, как и первым шагом на пути управления этим доступом.
После того, как учетная запись пользователя создано, администратор базы данных, уполномоченный по безопасности или другой сотрудник с соответствующими полномочиями должен предоставить пользователю набор полномочий соответствующего уровня для того, чтобы пользователь имел возможность выполнять необходимые ему действия, например, создавать таблицы или запрашивать данные других таблиц. Ведь какой смысл подключаться к базе данных, если в ней вам ничего не позволено делать? Кроме того, владелец схемы должен разрешить пользователю использовать объекты схемы, чтобы пользователь имел возможность выполнять свою работу.
Имеется две команды SQL, посредством которых назначаются и отменяются привилегии и тем самым предоставляется возможность управления доступом к данным. С помощью этих команд (они перечислены ниже) в реляционных базах данных распределяются как привилегии доступа к системе, так и привилегии доступа к данным.
GRANT
REVOKE
Команда GRANT используется для предоставления привилегий как на уровне доступа к системе, так и на уровне доступа к объектам тем пользователям, которые уже имеют учетные записи в базе данных.
Синтаксис оператора следующий.
GRANT Привилегия1 [, Привилегия2 ] [ ON Объект ]
ТО Имя_Пользователя [ WITH GRANT OPTION | ADMIN OPTION ]
Одну привилегию пользователю можно предоставить следующим образом.
GRANT SELECT ON EMPLOYEE_TBL TO USERI;
Право предоставлено.
Несколько привилегий пользователю можно предоставить следующим образом.
GRANT SELECT, INSERT ON EMPLOYEE_TBL TO USER1;
Право предоставлено.
Обратите внимание на то, что в случае предоставления пользователю нескольких привилегий в рамках одного оператора привилегии в списке разделяются запятыми.
Нескольким пользователям привилегии предоставляются следующим образом.
GRANT SELECT, INSERT ON EMPLOYEE_TBL TO USER1, USER2;
Grant succeeded.
Обратите внимание на фразу Grant succeeded (Право предоставлено) в выводе оператора в последнем примере. Такая фраза будет получена при успешном выполнении оператора в той реализации языка (Oracle), которая использовалась для примеров этой книги. Другие реализации SQL могут иметь свои фразы для сообщения пользователю результатов выполнения операторов.
Опция GRANT OPTION команды GRANT является достаточно мощной. Если владелец объекта предоставляет привилегии относительно объекта другому пользователю и использует при этом опцию GRANT OPTION, это значит, что последний получает право предоставлять другим привилегии использования объекта, не являясь при этом владельцем объекта. Вот пример использования опции:
GRANT SELECT ON EMPLOYEE_TBL TO USER1 WITH GRANT OPTION;
Право предоставлено.
Опция ADMIN OPTION команды GRANT подобна опции GRANT OPTION в том, что получающий привилегии пользователь наследует также и право предоставлять эти привилегии другим пользователям. Но GRANT OPTION используется для привилегий на уровне объектов, a ADMIN OPTION — на уровне системы. Когда пользователь предоставляет другому пользователю привилегии доступа к системе с опцией ADMIN OPTION, этот новый пользователь получает также и возможность предоставления другим пользователям привилегий доступа к системе. Вот пример использования опции:
GRANT SELECT ON EMPLOYEE_TBL TO USER1 WITH ADMIN OPTION;
Право предоставлено.
При удалении из базы данных учетной записи пользователя, наделенного привилегиями с опцией GRANT OPTION или ADMIN OPTION, будут отменены и привилегии тех пользователей, которые получили эти привилегии от пользователя, удаляемого из системы.
Команда REVOKE отменяет привилегии, ранее предоставленные пользователю базы данных. Команда REVOKE имеет две опции — RESTRICT и CASCADE. При использовании опции RESTRICT команда REVOKE будет успешно завершена только в том случае, когда отсутствуют другие пользователи с оставшимися привилегиями, явно указанными оператором REVOKE. С помощью опции CASCADE отменяются и все оставшиеся привилегии других пользователей. Другими словами, если владелец объекта наделил пользователя USERI привилегиями с опцией GRANT OPTION, а пользователь USER1 наделил привилегиями пользователя USER2, то при отмене владельцем привилегий пользователя USER1 с опцией CASCADE будут автоматически отменены и соответствующие привилегии пользователя USER2.
Оставшиеся привилегии (abandoned privileges) — это привилегии, переданные пользователю от другого пользователя с помощью опции GRANT OPTION и оставшиеся "бесхозными" у первого после удаления последнего из базы данных или после отмены привилегий последнего.
Синтаксис оператора для отмены привилегий следующий.
REVOKE Привилегия! [, Привилегия2 ] [ GRANT OPTION FOR ] ON Объект
FROM Имя_Пользователя { RESTRICT | CASCADE }
Вот пример использования подобного оператора.
REVOKE INSERT ON EMPLOYEE_TBL FROM USERI;
Право отменено.
Управление доступом к отдельным столбцам
Кроме предоставления привилегий доступа (INSERT, UPDATE или DELETE) к объектам в целом, имеется возможность ограничить доступ к заданным столбцам таблицы, как это сделано в следующем примере.
GRANT UPDATE (NAME) ON EMPLOYEES TO PUBLIC;
Право предоставлено.
Пользовательское имя PUBLIC в базе данных представляет всех ее пользователей. Любой пользователь считается частью этого имени. Если привилегии предоставляются пользователю PUBLIC, эти привилегии получают все пользователи базы данных. Точно также, отмена привилегий пользователя PUBLIC означает отмену соответствующих привилегий для всех пользователей базы данных, за исключением тех пользователей, которым эти привилегии были явно предоставлены индивидуально. Вот пример использования имени PUBLIC.
GRANT SELECT ON EMPLOYEE_TBL TO PUBLIC;
Право предоставлено.
Поскольку при предоставлении привилегий пользователю PUBLIC их на самом деле получают все пользователи базы данных, такое предоставление привилегий следует использовать крайне осторожно
В некоторых реализациях SQL предусмотрено использование групп привилегий базы данных. Ссылки на такие группы привилегий осуществляются по назначенным им именам. Наличие групп упрощает назначение и отмену наиболее часто используемых привилегий. Например, если в группе десяток привилегий, их можно назначить или отменить по имени группы, чтобы не писать каждый раз весь список.
В SQLBase имеются группы привилегий, называемые уровнями доступа (authority levels), а в Oracle такие группы называются ролями (roles). И SQLBase, и Oracle предлагают следующие группы привилегий.
CONNECT
RESOURCE
DBA
Группа CONNECT позволяет пользователю подключиться к базе данных и осуществлять операции с теми объектами, право доступа к которым имеет этот пользователь.
Группа RESOURCE позволяет пользователю создавать объекты, удалять созданные этим пользователем объекты, предоставлять другим право доступа к своим объектам и т. п.
Группа DBA позволяет пользователю осуществлять в рамках базы данных лю|ь/е действия. Такой пользователь имеет право доступа к любым объектам базы данйых и может осуществлять с ними любые действия.
Вот пример предоставления пользователю такой группы привилегий.
GRANT DBA TO USER1;
Право предоставлено.
Использование групп привилегий в разных реализациях языка может иметь свою специфику При наличии групп их использование облегчает процесс организа-. ции управления безопасностью базы данных
Контроль за привилегиями с помощью распределения ролей
Роль — это создаваемый объект базы данных, содержащий нечто подобное группе привилегий Использование ролей направлено на сокращение усилий по обеспечению надежности хранения данных путем отказа от явного предоставления привилегий пользователям Управлять группами привилегий с помощью ролей оказывается проще Привилегии в рамках роли можно изменить, и такие изменения будут прозрачны для пользователя
Если пользователю в рамках определенного приложения требуются, например, привилегии SELECT и UPDATE по отношению к некоторой таблице, ему можно временно, до завершения выполнения транзакции, приписать роль с соответствующими привилегиями.
При создании роли она не имеет никакого иного значения, кроме того, что она является ролью базы данных Она может быть назначена какому-нибудь пользователю или другой роли. Например, пусть схема с именем АРР01 предоставляет привилегию SELECT роли RECORDS_CLERK в отношении таблицы EMPLOYEE_PAY. После этого любой пользователь, получающий роль RECORDS_CLERK, будет обладать привилегией SELECT в отношении таблицы EMPLOYEE_PAY.
Аналогично, если АРР01 отменит привилегию SELECT для роли RECORDS_CLERK в отношении таблицы EMPLOYEE_PAY, то с этого момента и все пользователи и роли, которым была назначена роль RECORDS_CLERK, потеряют привилегию SELECT в отношении ТабЛИЦЫ EMPLOYEE_PAY.
Создать роль можно с помощью оператора CREATE ROLE.
CREATE ROLE Имя_роли;
Предоставление привилегий ролям аналогично предоставлению привилегий пользователям Рассмотрите следующий пример
CREATE ROLE RECORDS_CLERK;
Роль создана.
GRANT SELECT, INSERT, UPDATE, DELETE ON EMPLOYEE_PAY TO
RECORDS_CLERK;
Право предоставлено.
GRANT RECORDS_CLERK TO USER1;
Право предоставлено.
Роль удаляется с помощью оператора DROP ROLE.
DROP ROLE Имя_роли;
Вот пример:
DROP ROLE RECORDS_CLERK;
Роль удалена.
Роль может быть назначена пользователю в рамках его сеанса доступа к базе данных с помощью оператора SET ROLE.
SET ROLE Имя_роли;
Вот пример:
SET ROLE RECORDS_CLERK;
Роль назначена.
С помощью одного оператора можно назначить и несколько ролей.
SET ROLE RECORDS_CLERK, ROLE2, ROLE3;
Роль назначена.
В некоторых реализациях языка (например, Oracle) все назначаемые пользователю роли автоматически становятся ролями по умолчанию, т. е. ролями, по умолчанию назначаемыми пользователю при входе в систему.
Вы ознакомились с основами обеспечения надежного хранения данных в реляционных базах данных средствами SQL, а также с основами управления пользователями баз данных. Первым шагом процесса обеспечения безопасности является создание учетной записи пользователя базы данных. После этого пользователю необходимо сразу же предоставить определенные привилегии доступа к соответствующим частям базы данных, после чего стандарт ANSI позволяет использовать роли так. как это обсуждалось выше. Привилегии можно назначать пользователям или ролям. Различают два типа привилегий — привилегии доступа к системе и привилегии доступа к объектам.
Привилегии доступа к системе дают пользователю возможность выполнять такие действия в базе данных, как подключение к ней, создание таблиц, создание учетных записей пользователей, изменение состояния базы данных и т. п. Привилегии доступа к объектам позволяют пользователям предоставлять доступ к объектам базы данных, отбирать данные этих объектов и манипулировать полученными данными.
Для предоставления и отмены привилегий в SQL имеются две команды — GRANT и REVOKE. Эти две команды используются для того, чтобы осуществлять общее управление процессом назначения и отмены привилегий базы данных. В ходе этого часа мы с вами обсудили относящиеся к SQL принципы обеспечения безопасности базы данных, хотя в рамках реляционных баз данных имеется и целый ряд других связанных с безопасностью вопросов.
Что делать пользователю, если он забудет свой пароль для доступа к базе данных?
Пользователь должен обратиться к своему непосредственному руководителю или в отдел технической поддержки. В отделе технической поддержки обычно имеются возможности для восстановления паролей. Если же нет, то восстановить пароль может администратор базы данных или отдел безопасности. После восстановления пароля пользователь обязан сменить его сразу же после очередного подключения к базе данных.
Как действовать, если необходимо разрешить пользователю подключение к базе данных (CONNECT), но пользователю не требуются все привилегии, разрешенные этой ролью?
Просто не предоставлять пользователю привилегии CONNECT, а назначить список только тех привилегий, которые ему нужны. Если же пользователю были предоставлены привилегии CONNECT, но с некоторого момента весь соответствующий список привилегий уже оказывается не нужным, просто отмените CONNECT и предоставьте пользователю список тех привилегий, которые ему нужны.
Почему так важно новому пользователю сразу сменить пароль, полученный им от администратора или другого официального лица, создававшего учетную запись пользователя?
Изначально пароль создается при создании учетной записи пользователя. Но личный пароль пользователя не должен знать никто — ни администратор базы данных, ни руководство. Пароль должен оставаться в секрете от других пользователей, чтобы они не могли использовать чужие данные.
Задания практических занятий разделены на тесты и упражнения. Тесты предназначены для проверки общего уровня понимания рассмотренного материала. Упражнения дают возможность применить на практике идеи, обсуждавшиеся в ходе текущего урока, в комбинации с идеями из предыдущих уроков. Мы рекомендуем ответить на тестовые вопросы и выполнить упражнения прежде, чем продолжать дальнейшее чтение книги. Ответы можно проверить по Приложению Б, "Ответы"
1. Какая опция позволяет предоставлять доступ к объектам, не являясь их владельцем?
2. При предоставлении привилегий пользователю PUBLIC эти привилегии получат все пользователи базы данных или только определенные пользователи?
3. Какие привилегии необходимы для разрешения просматривать данные конкретной таблицы?
4. К какому типу привилегий относится привилегия SELECT?
1. Запишите оператор, разрешающий доступ на выборку из вашей таблицы EMPLOYEE_TBL, для пользователя с именем RPLEW. При этом необходимо предоставить пользователю RPLEW право наделять других пользователей привилегиями доступа к данной таблице.
2. Запишите оператор, отменяющий роль CONNECT для пользователя из п 1.
3. Запишите оператор, дающий пользователю RPLEW возможность выбирать, пополнять и обновлять данные таблицы EMPLOYEE_TBL.