Лекция 6. Система безопасности в базах данных В лекции рассматриваются основные механизмы безопасности в MS SQL Server 2008: учетные записи для входа и пользователи базы данных, серверные роли и роли базы данных. Демонстрируется назначение прав пользователю как при помощи графического интерфейса, так и с помощью SQL команд. Цель: показать способы защиты информации в MS SQL Server 2008. Любая система хранения информации должна быть максимально защищена как от случайного, так и от намеренного повреждения или искажения информации, т.е. при планировании базы данных необходимо четко определять полномочия каждого пользователя системы. В MS SQL Server предусмотрено три уровня безопасности: 1. аутентификация при регистрации; 2. разрешение на доступ к базе данных, поддерживаемой сервером; 3. полномочия (разрешения) пользователя. Аутентификация пользователя Безопасность во всех приложениях прежде всего основана на использовании имени пользователя (login) и пароля. При установке MS SQL Server создается учетная запись sa (system administrator – системный администратор), до MS SQL Server 2000 она создавалась с пустым паролем, в MS SQL Server 2008 использовать пустой пароль для sa по умолчанию запрещено и при установке сервера требуется задать сложный пароль в соответствии с текущими политиками безопасности Windows. Рассмотрим элементарные правила безопасности, которые на практике часто игнорируются. Одно имя (login) на одного пользователя. Несмотря на всю простоту требования, нередко несколько пользователей используют одно и то же имя для входа. Особенно это плохо в ситуации, когда данной учетной записи предоставлены привилегии администратора. Рекомендуется каждому пользователю создать отдельную учетную запись с минимально необходимым набором прав. Такой подход не только способствует повышению безопасности, но и позволяет производить аудит действий пользователей. Установка срока действия пароля (Password expiration). Ограничение по времени действия пароля может обезопасить в случае, если вы кому-то дали свой пароль для выполнения какой-то временной работы. По истечении срока действия пароля, доступ второго пользователя будет закрыт автоматически, если вы не сообщите ему новый пароль. Однако данная политика может иметь больше негативных последствий, чем положительных. 1 Представьте ситуацию, когда пользователи вынуждены менять пароли каждые 30 дней: очень быстро пользователям надоест придумывать новые пароли и запоминать их, вследствие этого пароли будут составляться максимально простыми. Ограничение на минимальную длину пароля и его сложность (Password Length). Кроме длины пароли рекомендуется задавать требование на использование в пароле и букв и цифр, что значительно усложняет возможность подбора паролей. Также рекомендуется не использовать простые слова (имена, названия, торговые марки) и наборы чисел такие, как телефонные номера, номер паспорта, день рождения и т.д. Ограничение на количество попыток входа (Number of Tries to Log In). Главная задача этого правила – предотвратить подбор паролей хакерами. Поэтому любое небольшое значение, например, 3-5 попыток входа, вполне допустимо. Для реализации этих правил на практике необходимо рассмотреть, что представляет собой процесс аутентификации в MS SQL Server 2008 и какие типы аутентификации он поддерживает. Аутентификация пользователя – это процесс, при котором пользователь в зависимости от указанного имени пользователя и пароля допускается или нет к установлению соединения с MS SQL Server. MS SQL Server может работать в двух режимах аутентификации пользователей, используя либо режим аутентификации Windows (Windows Authentication), либо режим аутентификации средствами MS SQL Server (SQL Server Authentication). Эти режимы аутентификации используют различные учетные записи пользователей. При аутентификации средствами MS SQL Server учетную запись и пароль создает администратор баз данных MS SQL Server, при аутентификации средствами Windows – системный администратор сети (в этом случае для подключения к MS SQL Server пользователю не нужна учетная запись MS SQL Server). Аутентификация MS SQL Server позволяет определить имя пользователя для входа (login) и пароль для установления соединения с сервером. При установке MS SQL Server создается лишь одна учетная запись пользователя для входа – sa. Замечание. Учетная запись sa предназначена для выполнения всех функций администрирования сервера и имеет все права на доступ ко всем объектам всех баз данных сервера. С помощью хранимых процедур существует возможность добавления других учетных записей для организации работы с MS SQL Server, а также возможность управления списком прав пользователя, т.е. набором разрешенных ему действий. 2 Роли сервера Другим фундаментом системы безопасности сервера являются роли. Под ролью понимаются определенные права на выполнение операторов и работу с объектами базы данных. Роли объединяют нескольких пользователей в группу, наделенную определенными правами, причем одному пользователю может быть назначено несколько ролей. Существует 8 постоянных ролей сервера, которые предоставляют административные привилегии на уровне сервера, вне зависимости от базы данных: sysadmin – может выполнять любые действия на MS SQL Server. По умолчанию сюда входит учетная запись sa и все члены группы администраторов Windows; setupadmin – управляет связанными серверами (linked servers) и процедурами, которые выполняются вместе с запуском сервера; securityadmin – может создавать и управлять логинами, читать журнал ошибок и создавать БД; processadmin – обладает правами управления процессами внутри MS SQL Server, например, член этой роли может завершать задачи, которые выполняются слишком долго; dbcreator – разрешено создание и изменение баз данных; diskadmin – управляет файлами баз данных: назначает файлы в группы, присоединяет/отсоединяет базы данных и т.д.; bulkadmin – позволяет выполнять команду BULK INSERT для вставки сразу большого количества записей в таблицу; Для просмотра информации о встроенных ролях используются хранимые процедуры: sp_helpsrvrole – возвращает список ролей сервера и описание каждой роли; sp_helpsrvrolemember [‘имя роли’] – возвращает список ролей и учетных записей, которым присвоены эти роли; sp_srvrolepermission [‘имя роли’] – возвращает список разрешений, присвоенных этим ролям. Замечание. Если указан необязательный параметр [‘имя роли’], то выводится информация, относящаяся только к указанной роли. На рис. 6.1. показан пример вызова хранимой процедуры. 3 Рис. 6.1. Пример вызова хранимой процедуры Управление учетными записями для входа 1. Для добавления учетных записей пользователей для входа в MS SQL Server используется хранимая процедура sp_addlogin: sp_addlogin [@loginame=] ‘учетная запись пользователя для входа’ [, [@passwd=] ‘пароль пользователя’] [, [@defdb=] ‘база данных’] sp_addlogin [ @loginame = ] 'login' [ , [ @passwd = ] 'password' ] [ , [ @defdb = ] 'database' ] [ , [ @deflanguage = ] 'language' ] [ , [ @sid = ] sid ] [ , [ @encryptopt= ] 'encryption_option' ] 4 @defdb – база данных, к которой будет подключать MS SQL Server этого пользователя по умолчанию. Если этот параметр не определен, то будет использоваться системная база данных master. @deflanguage – язык по умолчанию; если параметр не указан, то будет использоваться язык по умолчанию, заданный для сервера. @sid – идентификационный номер (security identification number); если параметр не задан, то sid будет сгенерирован. @encryptopt – указывает, нужно ли производить хэширование пароля, или вместо пароля уже используется хэш. Эта хранимая процедура широко используется на сегодняшний день. Однако в последующих версиях MS SQL Server она будет удалена. Вместо неё рекомендуется использовать следующую конструкцию: CREATE LOGIN loginName { WITH <option_list1> | FROM <sources> } <option_list1> ::= PASSWORD = { 'password' | hashed_password HASHED } [ MUST_CHANGE ] [ , <option_list2> [ ,... ] ] <option_list2> ::= SID = sid | DEFAULT_DATABASE = database | DEFAULT_LANGUAGE = language | CHECK_EXPIRATION = { ON | OFF} | CHECK_POLICY = { ON | OFF} | CREDENTIAL = credential_name <sources> ::= WINDOWS [ WITH <windows_options> [ ,... ] ] | CERTIFICATE certname | ASYMMETRIC KEY asym_key_name <windows_options> ::= DEFAULT_DATABASE = database | DEFAULT_LANGUAGE = language Параметры WITH позволяет задать пароль и настройки безопасности, а раздел FROM указывает, что логин не просто принадлежит MS SQL Server, а ассоциируется либо с учетной записью Windows, либо с сертификатом, либо с ключом. MS SQL Server накладывает ряд ограничений на имена пользователей, роли и пароли: имена пользователей, роли и пароли должны иметь размер от 1 до 128 символов и не содержать обратных слешей (\); имена пользователей не должны совпадать с ключевыми словами и встроенными именами пользователей; 5 пароль может не содержать никаких символов, но в случае если активированы политики паролей, то он должен удовлетворять их требованиям. 2. Для просмотра информации по именам пользователей, использующимся для входа, используется хранимая процедура sp_helplogins. Пример выполнения этой процедуры показан на рис. 6.2. Рис. 6.2. Получение списка пользователей MS SQL Server 3. Изменение пароля учетной записи пользователя для выполняется с помощью процедуры sp_password. входа Замечание. Для получения справки по командам Transact-SQL и хранимым процедурам можно воспользоваться утилитой Management Studio. Для этого необходимо выделить имя оператора и нажать клавишу F1. Эта хранимая процедура широко используется на сегодняшний день. Однако в последующих версиях MS SQL Server она будет удалена. Вместо неё рекомендуется использовать конструкцию ALTER LOGIN. 4. Удаление учетной записи осуществляет хранимая процедура: 6 sp_droplogin ‘учетная запись пользователя для входа’. Эта хранимая процедура широко используется на сегодняшний день. Однако в последующих версиях MS SQL Server она будет удалена. Вместо неё рекомендуется использовать следующую конструкцию: DROP LOGIN ‘учетная запись пользователя для входа’ 5. Для присвоения учетной записи для входа встроенной серверной роли используется процедура: sp_addsrvrolemember [@loginame=] ‘учетная запись пользователя для входа’ , [@rolename=] ‘роль’ Например: EXEC sp_addsrvrolemember 'Corporate\HelenS', 'sysadmin' 6. Отмена присвоения учетной записи определенной роли выполняется с помощью хранимой процедуры: sp_dropsrvrolemember [@loginame=] ‘учетная запись пользователя’, [@rolename=] ‘роль’ Например: EXEC sp_dropsrvrolemember 'JackO', 'sysadmin' Доступ к базе данных База данных – это важнейшая единица в системе безопасности MS SQL Server. Доступ к базе данных предоставляется пользователю базы данных (не путать с именем входа в MS SQL Server), наделенному определенными правами, которые определяются принадлежностью пользователя к роли базы данных. Роли базы данных Роли баз данных предоставляют наборы административных привилегий на уровне базы данных. При использовании ролей базы данных каждая учетная запись сервера будет иметь разные полномочия в зависимости от того, с какой базой данных осуществляется работа. Существует 10 встроенных ролей базы данных: db_owner – включает в себя права все других ролей базы данных. Пользователь получает права владельца базы. 7 db_accessadmin – похожа на серверную роль securityadmin, за исключением того, что ограничена одной базой данных. Она не позволяет создавать новые логины MS SQL Server, но разрешает добавлять новых пользователей в базу данных. db_datareader – разрешает выполнение оператора SELECT для всех таблиц базы данных. db_datawriter – разрешает выполнять INSERT, UPDATE и DELETE для всех таблиц базы данных. db_ddladmin – позволяет добавлять, удалять и изменять объекты в базе данных. db_securityadmin – еще одна роль похожая на серверную роль securityadmin. В отличие от db_accessadmin, она не разрешает создавать новых пользователей в базе, но позволяет управлять ролями и членством в ролях, а также правами на доступ к объектам базы данных. db_backupoperator – позволяет создавать резервные копии базы данных. db_denydatareader – запрещает выполнение SELECT для всех таблиц базы данных. db_denydatawriter – запрещает выполнение INSERT, UPDATE и DELETE для всех таблиц базы данных. Просмотр информации о ролях баз данных (как встроенных, так и определенных пользователем) осуществляется с помощью процедуры sp_helprole, просмотр членов ролей баз данных – sp_helprolemember. Замечание. В каждой базе данных есть специальная роль Public. Она не может быть удалена. Каждый пользователь базы данных обязательно член этой роли. Обычно эту роль используют для предоставления некоторых разрешений всем пользователям данного сервера. Управление пользователями баз данных По умолчанию MS SQL Server имеет специальную учетную запись пользователя в базе данных: владелец БД (dbo – data base owner). Владелец базы данных имеет полную власть над БД, им автоматически становится тот, кто создал эту базу данных. 1. Для создания пользователя БД используют процедуры: sp_adduser [@loginame=] ‘учетная запись для входа’ [, [@name_in_db=] ‘имя пользователя’] [, [@grpname=] ‘роль’] sp_grantdbaccess [@loginame=] ‘учетная запись для входа’ [, [@name_in_db=] ‘имя пользователя’] 8 Их отличие состоит в том, что sp_adduser позволяет сразу присвоить пользователю определенную роль базы данных. Эта процедура оставлена для обеспечения обратной совместимости и при работе вызывает процедуру sp_grantdbaccess. Обе эти хранимые процедуры будут удалены в последующих версиях MS SQL Server. Вместо них рекомендуется использовать следующую конструкцию: CREATE USER user_name [ { { FOR | FROM } { LOGIN login_name | CERTIFICATE cert_name | ASYMMETRIC KEY asym_key_name } | WITHOUT LOGIN ] [ WITH DEFAULT_SCHEMA = schema_name ] Описание параметров: user_name – имя пользователя в БД, должно быть не длиннее 128 символов. LOGIN login_name – указывает с каким логином необходимо ассоциировать данного пользователя. CERTIFICATE cert_name – указывает сертификат, с которым необходимо ассоциировать данного пользователя. ASYMMETRIC KEY asym_key_name – указывает ключ, с которым необходимо ассоциировать данного пользователя. WITH DEFAULT_SCHEMA = schema_name – задает схему по умолчанию для пользователя. При поиске объектов они сначала будут искаться в этой схеме. WITHOUT LOGIN – указывает, что пользователь не должен быть ассоциирован с существующим логином. 2. Отображение списка пользователей осуществляется в результате выполнения процедуры sp_helpuser. 3. Для удаления пользователя БД используются процедуры: sp_dropuser [@name_in_db=] ‘имя пользователя’ Эта хранимая процедура будет удалена в последующих версиях MS SQL Server. Вместо неё рекомендуется использовать следующую конструкцию: DROP USER ‘имя пользователя’ 9 Пользователь не может быть удален, если он является владельцем объектов в базе данных. 4. Присвоение пользователю определенной роли осуществляется процедурой: sp_addrolemember [@rolename=] ‘роль’, [@membername=] ‘пользователь’ 5. Отмена присвоенной пользователю роли может быть выполнена с помощью процедуры: sp_droprolemember [@rolename=] ‘роль’, [@membername=] ‘пользователь’ 6. С целью упрощения администрирования системы безопасности сервера администратор имеет возможность создавать пользовательские роли баз данных и наделять их определенным набором полномочий. Для этого используется хранимая процедура: sp_addrole [@rolename=] ‘роль’ Для удаления созданной ранее роли: sp_droprole [@rolename=] ‘роль’ Таким образом, доступ к MS SQL Server осуществляется с помощью системы имен пользователей для входа, в системе же безопасности MS SQL Server пользователю предоставляются определенные права доступа к объектам данных. Не следует путать имя пользователя для входа и имя пользователя базы данных для доступа к объектам. Все описанные выше действия по организации системы безопасности можно выполнить также и с помощью графического интерфейса утилиты администрирования Management Studio. Управление учетными записями для входа Просмотр списка имеющихся учетных записей и их параметров осуществляется выбором группы Logins в папке Security сервера. Учетные записи пользователей отображаются в поле Name, в поле Default Database – имя базы данных, к которой пользователь подключается по умолчанию. Для создания новой учетной записи для входа необходимо выполнить команду New Login… контекстного меню узла Logins, в появившемся диалоговом окне указать (см. рис. 6.3): 10 вкладка General: имя пользователя, тип аутентификации (при аутентификации средствами MS SQL Server – задать пароль), базу данных, к которой пользователь подключается автоматически, и язык по умолчанию; вкладка Server Roles: роли сервера, в которые будет входить создаваемая учетная запись; вкладка User Mapping: доступ к одной из созданных на сервере базе данных, в поле User ввести имя пользователя базы данных и включить создаваемого пользователя в одну существующих ролей. Рис. 6.3. Окно создания новой учетной записи Для изменения параметров существующей учетной записи пользователя для входа необходимо выбрать ее из списка и выполнить команду контекстного меню Properties, для удаления – Delete. Управление ролями сервера Для отображения списка ролей сервера необходимо выбрать группу Server Roles в папке Security сервера. Просмотр пользователей, входящих в 11 эту роль и разрешений, присвоенный ей, осуществляется выполнением команды Действие – Свойства. Встроенные роли сервера не могут быть удалены из системы, и нельзя изменить определенные для них разрешения. Также запрещено создавать и собственные серверные роли. Управление пользователями баз данных Для просмотра и управления параметрами пользователей некоторой базы данных предназначена группа Security/Users этой базы. Учетные записи отображаются в поле User Name, а в поле Login Name – сответствующие им учетные записи для входа. Для создания нового пользователя базы данных необходимо выполнить команду New User…, затем в поле User name ввести имя пользователя, а в списке Login Name выбрать соответствующую учетную запись для входа (см. рис. 6.4). Можно также включить пользователя в роли базы данных. Рис. 6.4. Окно создания нового пользователя БД 12 Для изменения параметров учетной записи служит команда Properties, а для удаления – Delete. Управление ролями базы данных Для отображения списка ролей базы данных используется группу Roles. Для просмотра пользователей, входящих в эту группу необходимо выполнить команду Properties. Разрешения пользователя Выполнение операторов языка Transact-SQL и действий в системе может быть выполнено только после успешной аутентификации пользователя. При получении оператора Transact-SQL от пользователя сервер проверяет, имеет ли право пользователь на выполнение соответствующих действий. Если права есть, то действие выполняется, в противном случае возвращается сообщение об ошибке. Действия, которые могут быть выполнены пользователем, определяются правами, выданными ему непосредственно, или ролью, в которой он состоит. Таким образом, пользователь должен иметь соответствующие разрешения на выполнение тех или иных действий. Права в MS SQL Server можно разделить на три категории: разрешения для объектов, разрешения для команд Transact-SQL и неявные разрешения. Для различных объектов применяются такие наборы разрешений как: SELECT. Пользователь с этой привилегией может выполнять запросы в таблице. INSERT. Пользователь с этой привилегией может добавлять данных в таблицу. UPDATE. Пользователь с этой привилегией может изменять данные в таблице. Нельзя назначить эту привилегию для определенных полей таблицы. DELETE. Пользователю с этой разрешено удалять данные из таблицы. ALL. Пользователю предоставлены любые разрешения. Разрешения для команд Transact-SQL контролируют возможность создания объектов в базе данных, создание самой базы данных и выполнение процедуры резервного копирования. Предоставление доступа Управление разрешениями пользователя на доступ к объектам базы данных осуществляется с помощью команды GRANT: 13 GRANT { разрешение [,...n] }{ ON таблица | представление [(поле[,...n])] | ON [хранимая процедура[,...n] } TO учетная запись [,...n][WITH GRANT OPTION] Назначение аргументов этой команды: разрешение – список разрешений, предоставляемых пользователю. Если предоставляется несколько разрешений одновременно, то они разделяются запятыми; таблица, представление, хранимая процедура – указываются имена конкретных объектов текущей базы данных, для которых необходимо предоставить доступ. MS SQL Server обладает возможностью определять права доступа не только на уровне таблицы, но и на уровне поля; учетная запись – указывается имя объекта системы безопасности, которому предоставляются права. В качестве объекта может выступать как учетные записи пользователей, так и их группы; WITH GRANT OPTION – позволяет пользователю, которому предоставляются права, назначать их и для других пользователей. Например, с помощью следующей команды пользователю TestUser базы данных AdventureWorks предоставляются права выборки и изменения данных таблицы Orders этой базы данных: GRANT SELECT, UPDATE ON AdventureWorks2008.Production.WorkOrder TO TestUser Следующая команда предоставляет пользователю Andy права только выборки данных полей Name и ListPrice таблицы Product базы данных AdventureWorks: GRANT SELECT ON AdventureWorks2008.Production.Product (Name, ListPrice) TO Andy Запрещение доступа Для запрещения пользователю доступа к объектам базы данных используется команда DENY: DENY { разрешение [,...n] }{ ON таблица | представление [(поле[,...n])] | ON [хранимая процедура[,...n] } TO учетная запись [,...n][CASCADE] 14 Параметры данной команды аналогичны параметрам командам GRANT. Параметр CASCADE позволяет отозвать права не только у конкретного пользователя, но также и у всех пользователей, кому он предоставил данные права. Неявное отклонение доступа Неявное отклонение подобно запрещению доступа с тем отличием, что оно действует только на том уровне, на котором определено. Т.е. если пользователю на определенном уровне доступ отклонен, то он может его получить на другом уровне, например, через членство в роли, имеющей на это право. Замечание. По умолчанию доступ пользователя к данным неявно отклонен. Для неявного отклонения доступа к данным используется следующая команда: REVOKE [GRANT OPTION FOR] { разрешение [,...n] }{ ON таблица | представление [(поле[,...n])] | ON [хранимая процедура[,...n] } TO учетная запись [,...n][CASCADE] Смысл параметров аналогичен параметрам команд GRANT и DENY. Параметр GRANT OPTION FOR используется, когда необходимо отозвать право, предоставленное параметром WITH GRANT OPTION команды GRANT. При этом пользователь сохраняет разрешение на доступ к объекту, но теряет возможность предоставлять разрешение другим пользователям. Замечание. Необходимо помнить следующий принцип: разрешение имеет самый низкий приоритет, а запрещение – самый высокий. Т.е. доступ к данным может быть получен только явным его предоставлением при отсутствии запрещения доступа на любом другом уровне. Если доступ явно не предоставлен, пользователь не может работать с данными. Работа с разрешениями пользователя может выполняться и с помощью графического интерфейса утилиты администрирования Management Studio. Чтобы назначить полномочия объекту безопасности необходимо выбрать его в группе Users (для изменения разрешения конкретного пользователя базы данных) или в группе Roles (для разрешений определенной роли). Для этих целей используется вкладка Securables (см. рис. 6.5). В появившейся вкладке перечислены все объекты базы данных, с возможными правами доступа. Можно установить одно из трех состояний 15 доступа: предоставление (галочка), запрещение (крестик) и неявное отклонение (пустое поле) – в соответствующем поле. Рис. 6.5. Назначение прав пользователю БД Краткие итоги. Были рассмотрены ключевые компоненты системы безопасности MS SQL Server 2008, определено назначение серверных ролей и ролей БД. На примерах показаны способы разрешения или запрещения определенных действий пользователя на сервере. 16