В 1
лекции мы
разобрали вопрос о том, какие данные
стоит, а какие не стоит хранить в
базе данных. В данной лекции будут
рассмотрены основные концепции
обеспечения безопасности баз данных,
которые должен знать каждый
разработчик, чтобы создавать
защищенные базы данных.
Обеспечение
безопасности - важный компонент
большинства приложений баз данных;
поэтому не надо думать, что в процессе
разработки этим можно заняться в
самую последнюю очередь. Каждый
элемент приложения базы данных
следует разрабатывать с учетом
требований обеспечения безопасности.
Вы научитесь предоставлять доступ
к экземплярам и базам данных SQL Server
и управлять ролями на уровне базы
данных и на уровне сервера. Кроме
того, вы узнаете, как использовать
для обеспечения надежности и
безопасности пространства имен
объекта схемы. В завершение
рассказывается о том, как обеспечить
безопасный доступ к таблицам, столбцам
и таким программируемым объектам,
как хранимые процедуры и функции.
Проектирование
механизма сетевой безопасности для
обеспечения безопасности системы
базы данных
SQL
Server 2005 – первая версия SQL Server, которая
была разработана в рамках инициативы
Microsoft Trustworthy Computing (Защищенные
информационные системы). Один из
принципов этой инициативы – Security
by Default (Безопасность по умолчанию).
Реализуя этот принцип, SQL Server 2005 по
умолчанию отключает некоторые
сетевые настройки, чтобы сохранить
максимально возможный уровень
безопасности среды SQL Server.
Разрешение
удаленного доступа
SQL
Server – это система управления базами
данных, которая должна работать на
сервере сети, принимая подключения
от удаленных пользователей и
приложений. Можно подключиться к
SQL Server локально, с того же компьютера,
на котором выполняется SQL Server, но в
производственных системах баз
данных, как правило, эта возможность
не используется. Следовательно,
очень важно правильно сконфигурировать
SQL Server для приема защищенных подключений
от удаленных компьютеров.
Чтобы
выполнить удаленный доступ к
экземпляру SQL Server, необходим сетевой
протокол для установления соединения.
Во избежание расточительного
использования системных ресурсов,
активизируйте только те протоколы,
которые необходимо использовать.
При
установке SQL Server с параметрами по
умолчанию многие функции отключены,
чтобы уменьшить уязвимость системы
базы данных против атак. Например,
в SQL Server 2005 по умолчанию не разрешаются
удаленные подключения (за исключением
версии Enterprise), поэтому для того, чтобы
задействовать удаленные подключения,
мы воспользуемся инструментом SQL
Server Surface Area Configuration (Настройка
контактной зоны SQL Server), как показано
на рис.
2.1.
Для
этого выполните перечисленные ниже
действия:
Разрешаем
удаленные соединения
-
В
меню
Start (Пуск)
выберите
All Programs,. Microsoft SQL Server 2005, Configuration Tools,
SQL Server Surface Area Configuration. (Все
программы, Microsoft SQL Server 2005, Средства
настройки, Настройка контактной
зоны SQL Server).
увеличить
изображение
Рис.
2.1.
Инструмент Настройка контактной
зоны SQL Server для служб и подключений
-
Под
заголовком Configure Surface Area For Localhost
(Настроить контактную зону для
localhost) в нижней части окна щелкните
ссылку Surface Area Configuration For Services And
Connections (Настройка контактной зоны
для служб и соединений).
-
С
левой стороны открывшегося окна
отображается список компонентов,
которые можно настроить. В этом
списке разверните дерево элемента
Database Engine и щелкните мышью элемент
Remote Connections (Удаленные соединения).
-
Выберите
вариант Local And Remote Connections (Локальные
и удаленные соединения), а затем
выберите нужные протоколы.
Допускается
использование удаленных соединений
с использованием сетевых протоколов
TCP/IP или Named Pipes (именованные каналы).
В интересах безопасности и
производительности рекомендуется
использовать протокол TCP/IP.
Обеспечение
безопасности внешнего доступа
Серверы
баз данных должны быть хорошо защищены
от несанкционированного внешнего
доступа ввиду критической важности
информации, которая на них хранится.
Ни в коем случае нельзя допускать,
чтобы к SQL Server можно было обратиться
непосредственно через интернет.
Если необходимо предоставить доступ
к SQL Server через интернет пользователям
или приложениям, следует гарантировать,
что сетевое окружение имеет адекватные
механизмы защиты, такие, как межсетевой
экран или система обнаружения
вторжений.
Дополнительная
информация.SQL
Server допускает использование соединений
с различными типами конечных точек.
О конечных точках рассказывается в
лекции 5 курса "Оптимизация работы
серверов баз данных Microsoft SQL Server
2005".
Управление
доступом к экземплярам SQL Server
Устанавливая
соединение с экземпляром SQL Server, вы
должны предоставить корректную
информацию для проверки подлинности.
Ядро базы данных выполняет двухфазный
процесс проверки подлинности. Сначала
проверяется, предоставили ли вы
действующее имя пользователя учетной
записи, имеющей разрешение на
подключение к экземпляру SQL Server.
Далее, ядро базы данных проверяет,
имеет ли данная учетная запись
разрешение на доступ к той базе
данных, к которой выполняется попытка
подключения.
В
SQL Server 2005 участники – это лица, группы
или процессы, которые запрашивают
доступ к ресурсам базы данных.
Участники иерархически упорядочены
по уровням операционной системы,
сервера и базы данных и могут быть
индивидуальными (неделимыми) или
коллективными.
Например,
имя входа SQL – это индивидуальный
участник на уровне экземпляра SQL
Server, а группа Windows – коллективный
участник на уровне операционной
системы.
Выбор
режима проверки подлинности
SQL
Server 2005 для предоставления доступа
поддерживает два режима аутентификации:
режим проверки подлинности Windows и
комбинированный режим проверки
подлинности. Режим проверки подлинности
можно настроить через SQL Server Management
Studio, выполнив следующие действия:
Настраиваем
режим проверки подлинности
-
В
меню
Start (Пуск)
выберите
All Programs,. Microsoft SQL Server 2005, SQL Server
Management Studio (Все
программы,
Microsoft SQL Server 2005, Среда
SQL Server Management Studio).
-
В
диалоговом окне Connect To Server (Соединение
с сервером) нажмите кнопку Connect
(Соединить).
-
В
панели Object Explorer (Обозреватель
объектов) щелкните правой кнопкой
мыши на значке экземпляра SQL Server и
выберите из контекстного меню пункт
Properties (Свойства).
-
В
панели Select A Page (Выбор страницы)
выделите значок Security (Безопасность).
-
В
секции Server Authentication (Серверная
проверка подлинности) выберите
нужный режим проверки подлинности,
как показано на рис.
2.2 (см.
рис. вверху следующей страницы).
Важно.
Для того, чтобы изменение режима
проверки подлинности вступило в
силу, перезапустите экземпляр SQL
Server.
При
выборе режима проверки подлинности
рекомендуется следовать приведенным
ниже рекомендациям:
-
Режим
проверки подлинности Windows.В
этом режиме SQL Server при проверке
подлинности пользователя,
запрашивающего доступ к экземпляру
SQL Server, полагается на операционную
систему. Пользователю не нужно
предоставлять какие-либо учетные
данные в строке подключения, поскольку
он уже аутентифицирован операционной
системой.
-
Комбинированный
режим проверки подлинности (SQL Server
и Windows).В
этом режиме пользователь может
подключиться к SQL Server с использованием
режима проверки подлинности либо
Windows, либо SQL Server. В последнем случае
SQL Server проверяет учетные данные
пользователя на соответствие
действующим именам входа SQL Server. При
использовании режима проверки
подлинности SQL Server пользователь
должен указать в строке соединения
имя пользователя и пароль для доступа
к SQL Server.
увеличить
изображение
Рис.
2.2.
Установка режима проверки подлинности
через интерфейс SQL Server Management Studio
Примечание.
В SQL Server 2005 невозможно задать отдельно
режим проверки подлинности SQL Server.
Однако необходимо, по возможности,
настроить параметры безопасности
для экземпляра SQL Server, чтобы ограничить
доступ большей части пользователей
Windows.
Как
правило, в качестве режима проверки
подлинности рекомендуется выбирать
режим проверки подлинности Windows . В
режиме проверки подлинности Windows по
сети не передается пароль пользователя.
Кроме того, можно управлять учетными
записями пользователей через
централизованное корпоративное
хранилище, например, через службу
каталогов Active Directory, и воспользоваться
преимуществами всех функций
безопасности, доступных в операционной
системе.
Однако
существуют ситуации, когда проверка
подлинности Windows будет не лучшим
вариантом. Например, если необходимо
предоставить доступ пользователям,
которые не принадлежат к среде вашей
операционной системы, например,
внешним поставщикам или тем, кто
использует операционную систему с
несовместимой системой обеспечения
безопасности, лучше выбрать
комбинированный режим проверки
подлинности и использовать имена
входа SQL Server, чтобы установить для
таких пользователей соединение с
SQL Server.
Соединение
с экземпляром SQL Server
В
случаях, когда пользователю необходим
доступ к экземпляру SQL Server, администратор
должен предоставить этому пользователю
корректную информацию для проверки
подлинности. Эта информация зависит
от выбранного режима проверки
подлинности. В данном разделе
объясняется, как создавать имена
входа для пользователей операционной
системы, которые будут поддерживать
режим проверки подлинности Windows, и
имена входа SQL для поддержки режима
проверки подлинности SQL.
Предоставляем
доступ пользователям и группам
Windows
Можно
разрешить пользователям операционной
системы устанавливать соединение
с сервером SQL Server посредством создания
имени входа для пользователя или
группы Windows. По умолчанию, доступ к
SQL Server предоставлен только членам
локальной группы администраторов
Windows и учетной записи службы, которая
запускает службы SQL.
Примечание.
Существует возможность удалить
права на удаленный доступ к SQL Server
из списка прав членов группы
администраторов.
Доступ
к экземпляру SQL Server можно предоставить,
создав имя входа либо путем
непосредственного ввода команд SQL,
либо через интерфейс SQL Server Management
Studio. Следующий код предоставляет
доступ к экземпляру SQL Server пользователю
домена Windows ADWORKS\jlucas:
CREATE
LOGIN [ADVWORKS\jlucas] FROM WINDOWS;
Примечание.
Если для создания имени входа
используется SQL Server Management Studio,
инструмент выполняет аналогичную
инструкцию T-SQL.
Имена
входа Windows по умолчанию
В
процессе установки SQL Server 2005 создаются
имена входа Windows, перечисленные
в табл.
2.1.
Таблица
2.1. Имена входа Windows по умолчанию
|
Имя
входа Windows
|
Описание
|
BUILTIN\Administrators
|
Имя
входа для локальной группы
администраторов на компьютерах с
установленным экземпляром SQL
Server. Для запуска SQL Server это имя входа
не обязательно.
|
<Servername>\SQLServer2005
MSFTEUser$<Servername> $MSSQLSERVER
|
Имя
входа
для
группы
пользователей
Windows SQLServer2005 MSFTEUser$
<Servername>$MSSQLSERVER.
Члены
этой группы имеют необходимые
привилегии, которые назначаются
им как учетной записи входа в
систему ассоциированного экземпляра
компонента SQL Server FullText Search. Эта
учетная запись необходима для
запуска компонента SQL Server 2005 Full
Text Search.
|
<Servername>\SQLServer
2005MSSQLUser$<Servername> $MSSQLSERVER
|
Имя
входа
для
группы
пользователей
Windows SQLServer2005 MSSQLUser$
<Servername>$MSSQLSERVER.
Члены
этой группы имеют необходимые
привилегии, которые назначаются
им как учетной записи входа в
систему ассоциированного экземпляра
компонента SQL Server. Эта учетная
запись необходима для запуска SQL
Server 2005, поскольку является служебной
учетной записью для SQL Server в тех
случаях, когда экземпляр
сконфигурирован на использование
локальной служебной учетной записи
как своей служебной учетной записи.
|
<Servername>\SQLServer2005
SQLAgentUser$<Servername> $MSSQLSERVER
|
Имя
входа
для
группы
пользователей SQLServer2005SQLAgentUser$<
Servername>$MSSQLSERVER.
Члены
этой группы имеют необходимые
привилегии, которые назначаются
им как учетной записи входа в
систему ассоциированного экземпляра
компонента SQL Server Agent. Эта учетная
запись необходима для запуска
компонента SQL Server 2005 Agent.
|
При
подключении к SQL Server 2005 с использованием
имени входа Windows, SQL Server полагается
на проверку подлинности операционной
системы и проверяет только, имеет
ли пользователь Windows соответствующее
имя входа, определенное в этом
экземпляре сервера SQL Server, или
принадлежит ли это имя входа группе
Windows с соответствующим именем входа
в этот экземпляр SQL Server. Соединение,
использующее имя входа Windows, называется
доверительным соединением.
Предупреждение.
Не исключена ситуация, при которой
пользователь или группа, сопоставленные
имени входа Windows, будут удалены из
операционной системы без уведомления
SQL Server. SQL Server 2005 не выполняет проверку
для такой ситуации, поэтому следует
периодически проверять экземпляр
SQL Server, чтобы выявить имена входа,
утратившие связь с пользователями.
Это легко можно выполнить при помощи
системной хранимой
процедуры sp_validatelogins.
Следующая
программа на Microsoft Visual Basic (она имеется
в файлах примеров под именем ConnectUsing
WindowsAuth.vb.txt )
показывает, как установить соединение
с SQL Server с использованием проверки
подлинности Windows:
"Создаем
экземпляр
объекта
SQLConnection
Dim
oConn as New SQLClient.SQLConnection
"Определяем
строку
соединения
oConn.ConnectionString="server=localhost;
database=AdventureWorks;" + _
"Integrated
Security=SSPI"
"Открываем
соединение
oConn.Open()
"Выполняем
необходимые действия
...
"Закрываем
соединение
oConn.Close()
Предоставляем
доступ именам входа SQL Server
В
режиме проверки подлинности Windows и
SQL Server также можно создавать имена
входа SQL Server и управлять ими. При
создании имени входа SQL Server необходимо
задать для этого имени входа пароль.
Пользователи должны указывать пароль
при соединении с экземпляром SQL
Server. При создании имени входа SQL
Server можно задать для него имя базы
данных и язык по умолчанию. В том
случае, если приложение устанавливает
соединение с SQL Server, не указывая
контекст и язык базы данных, SQL Server
использует свойства этого имени
входа для этого соединения по
умолчанию.
Примечание.
SQL Server 2005 использует самозаверяющий
сертификат для шифрования пакетов
входа, чтобы предотвратить
несанкционированный доступ к
информации о входе в систему. Однако
после того как процесс входа завершен
и имя входа проверено, SQL Server пересылает
все последующие пакеты информации
в незашифрованном виде. Если необходимо
обеспечить безопасность и
конфиденциальность коммуникаций,
можно использовать два метода:
протокол Secure Sockets Layer (SSL) и протокол
Internet Protocol Security (IPSec).
Доступ
к экземпляру SQL Server можно предоставить,
создав имя входа SQL Server либо путем
непосредственного ввода команд SQL,
либо через интерфейс SQL Server Management
Studio. В следующем примере мы создаем
имя входа SQL Server "Mary" и
назначаем для пользователя Mary базу
данных Adventure
Works в
качестве базы данных по умолчанию.
CREATE
LOGIN Mary
WITH
PASSWORD = '34TY$$543',
DEFAULT_DATABASE
=AdventureWorks;
В
процессе
установки
SQL Server 2005 создается
одно
имя
входа
SQL Server - sa.
Имя
входа sa создается в любом случае,
даже если вы выбрали в процессе
установки режим проверки подлинности
Windows.
Передовой
опыт.Хотя
имя входа sa нельзя удалить, необходимо
переименовать и отключить его во
избежание несанкционированного
доступа к SQL Server с его использованием.
О том, как отключить имя входа, вы
узнаете в разделе "Запрещаем
доступ пользователям".
При
помощи следующего кода можно получить
информацию об именах входа SQL Server из
представления каталога sql_logins:
SELECT
* FROM sys.sql_logins;
Принудительно
применяем политику паролей
При
использовании имен входа SQL Server
необходимо реализовать сильные
политики паролей для этих имен входа
во избежание ослабления системы
безопасности SQL Server с течением
времени. SQL Server 2005 предоставляет
возможность принудительного
применения парольной политики
операционной системы к именам входа
SQL Server. Если SQL Server выполняется в среде
Windows 2003 Server, то SQL Server использует API
(интерфейс для прикладного
программирования) NetValidatePasswordPolicy для
управления следующими параметрами:
Если
сервер SQL Server выполняется в среде
Windows 2000 Server, то он использует правило
SQL Server Native Password Complexity rule, которое было
введено программой Microsoft Baseline Security
Analyzer для принудительного применения
следующих правил:
-
Пароль
не может быть пустым или NULL
-
Пароль
не может совпадать с именем входа
-
Пароль
не может совпадать с именем компьютера
-
В
качестве пароля нельзя выбирать
слова "Password", "Admin" или "Administrator".
Парольную
политику можно включить при помощи
следующего кода Transact SQL:
CREATE
LOGIN Mary
WITH
PASSWORD = '34TY$$543'
MUSTCHANGE,
CHECK
EXPIRATION = ON,
CHECK
POLICY = ON;
Управляем
разрешениями для экземпляра
Теперь
вы знаете, как предоставить доступ
пользователю к экземпляру SQL Server, но
до сих пор ничего не было сказано о
том, какие разрешения могут иметь
эти имена входа в SQL Server. Как правило,
пользователю необходим доступ к
каким-либо данным. Однако возможно
вам придется создать некоторые имена
входа с разрешениями на выполнение
задач администрирования.
Для
выполнения этой задачи SQL Server
предоставляет серверные роли на
уровне экземпляра. (Серверные роли
являются фиксированными, нельзя
создать новые роли на уровне
экземпляра). В табл.
2.2 перечислены
фиксированные серверные роли,
созданные SQL Server 2005.
Таблица
2.2. Фиксированные серверные роли
|
Фиксированная
серверная роль
|
Описание
|
bulkadmin
|
Может
выполнять предложение BULK
INSERT
|
dbcreator
|
Может
создавать, изменять, удалять и
восстанавливать базы данных
|
diskadmin
|
Может
управлять файлами на диске
|
processadmin
|
Может
завершать процессы
|
securityadmin
|
Может
управлять именами входа и назначать
разрешения
|
serveradmin
|
Может
изменять параметры сервера и
завершать работу сервера
|
setupadmin
|
Может
управлять связанными серверами и
выполнять системные хранимые
процедуры
|
sysadmin
|
Может
выполнять на сервере любые действия
|
Получаем
информацию о принадлежности к
серверной роли
Выполнив
запрос системной функции IS_SRVROLEMEMBER можно
узнать, принадлежит текущий
пользователь к одной из серверных
ролей. Следующий пример кода Transact
SQL возвращает значение 1,
если текущее имя входа принадлежит
к серверной роли sysadmin, и значение 0
в противном случае.
SELECT
IS_SRVROLEMEMBER ('sysadmin');
Добавляем
имя входа к серверной роли.Добавить
имя входа к существующей серверной
роли можно при помощи системной
хранимой процедуры sp_addsrvrolemember.
Следующий пример добавляет Mary к
серверной роли sysadmin:
EXECUTE
sp_addsrvrolemember "Mary", "sysadmin";
Удаляем
имя входа из серверной роли.Чтобы
удалить имя входа из серверной роли,
можно использовать хранимую
процедуру sp_dropsrvrolemember.
Следующий пример удаляет пользователя
Mary из серверной роли sysadmin:
EXECUTE
sp_dropsrvrolemember "Mary", "sysadmin";
Предоставляем
индивидуальные разрешения.SQL
Server 2005 предоставляет более гранулярную
структуру разрешений, что позволяет
с большей точностью контролировать
операции входа. Разрешениями можно
манипулировать при помощи
операторов GRANT, DENY и REVOKE.
Информация о серверных разрешениях
доступна из представления
каталогаsys.server_permissions.
В
следующем примере пользователю Mary
предоставляются права на создание
и выполнение трассировок в SQL Server
Profiler:
GRANT
ALTER TRACE TO Mary;
Пользователи
могут получить информацию о своих
разрешениях с помощью
функции fn_my_permissions.
Следующий пример отображает разрешения
пользователя:
SELECT
* FROM fn_my_permissions (NULL, 'SERVER');
Дополнительная
информация.Со
списком серверных разрешений можно
ознакомиться в разделе "Предоставление
разрешений SQL Server. Инструкция GRANT
(T-SQL)" в SQL Server Books Online (Электронная
документация по SQL Server).
Запрещаем
доступ пользователям
В
некоторых ситуациях, например, когда
пользователь увольняется из
организации, необходимо запретить
доступ определенному имени входа.
Если этот запрет временный, можно
не удалять имя входа из экземпляра,
а просто отключить его. При отключении
доступа свойства имени входа и его
сопоставление пользователям базы
данных сохраняются. Повторно включив
это имя входа, вы можете работать с
прежними свойствами. Чтобы отключить
и включить имя входа, выполните
следующую инструкцию ALTER:
ALTER
LOGIN Mary DISABLE;
ALTER
LOGIN Mary ENABLE;
Можно
проверить, отключены ли имена входа,
выполнив запрос к представлению
каталога sql_logins, как показано в
следующем примере:
ALTER
LOGIN Mary DISABLE; GO
WHERE
is_disabled=1; GO
ALTER
LOGIN Mary ENABLE;
Совет.
В SQL Server Management Studio отключенные имена
входа помечаются красной стрелкой.
Эта стрелка отображается в правом
нижнем углу значка имени входа,
который находится в папке Security/Logins
(Безопасность/Имена входа) в панели
Object Explorer (Обозревателя объектов). С
другой стороны, если необходимо
удалить имя входа из данного
экземпляра, следует использовать
инструкцию DROP
LOGIN.
Следующий пример удаляет имя входа.
DROP
LOGIN Mary;
Предупреждение.
При удалении имени входа SQL Server 2005
не удаляет пользователей базы данных,
сопоставленных этому имени входа.
Предупреждение.
Удаление имени входа, которому
сопоставлены пользователи или группы
Windows не гарантирует, что эти пользователи
или члены групп не смогут получить
доступ к SQL Server. Учтите, что такие
пользователи могут принадлежать и
к какой-либо другой группе Windows с
действующим именем входа.
Устанавливаем
соединение с SQL Server с использованием
проверки подлинности SQL Server
Следующая
программа на Microsoft Visual Basic (она имеется
в файлах примеров под именем ConnectUsingSQL
Auth.vb.txt )
показывает, как установить соединение
с SQL Server с использованием проверки
подлинности SQL Server:
"Создаем
экземпляр
объекта
SQLConnection
Dim
oConn as New SQLClient.SQLConnection
"Определяем
строку соединения
"с
заданными именем входа и паролем
oConn.ConnectionString="server=localhost;
database=AdventureWorks; " + _
"user
id= Mary; password=34TY$$543"
"Открываем
соединение
oConn.Open()
"Выполняем
необходимые действия
...
"Закрываем
соединение
oConn.Close()
|