Сообщения о потерях и несанкционированном доступе к конфиденциальным данным появляются все чаще, а значит безопасность баз данных — весьма актуальная проблема для многих компаний. Организации, в чьих базах данных хранится конфиденциальная информация, должны соблюдать требования многочисленных законодательных актов, в том числе Грэмма-Лича-Блайли (GLBA), директивы защиты данных ЕС (EUDPD), акта о преемственности и подотчетности медицинского страхования (HIPAA), стандарта безопасности данных индустрии платежных карт (PCI DSS) и закона Сарбейнса-Оксли (SOX). Эти законы требуют шифрования конфиденциальной информации на уровне базы данных и операционной системы. SQL Server, как и другие распространенные коммерческие системы управления базами данных, располагает множеством вариантов шифрования, в том числе на уровне ячеек, базы данных и файлов через Windows, а также на транспортном уровне. Эти варианты шифрования обеспечивают безопасность информации на уровне базы данных и операционной системы. Кроме того, они снижают вероятность несанкционированного раскрытия конфиденциальных сведений, даже если поражены инфраструктура или база данных SQL Server. После описания модели шифрования SQL Server я рассмотрю возможности шифрования, реализованные в SQL Server, а также способы шифрования конфиденциальной информации, сохраненной в базах данных SQL Server.
Модель шифрования SQL Server
Модель шифрования SQL Server в основном предоставляет функции управления ключами шифрования, соответствующие стандарту ANSI X9.17. В этом стандарте определены несколько уровней ключей шифрования, использующихся для шифрования других ключей, которые в свою очередь применяются для шифрования собственно данных. В таблице перечислены уровни ключей шифрования SQL Server и ANSI X9.17.
Главный ключ службы Service master key(SMK) — ключ верхнего уровня и предок всех ключей в SQL Server. SMK — асимметричный ключ, шифруемый с использованием Windows Data Protection API (DPAPI). SMK автоматически создается, когда шифруется какой-нибудь объект, и привязан к учетной записи службы SQL Server. SMK используется для шифрования главного ключа базы данных Database master key (DMK).
Второй уровень иерархии ключей шифрования — DMK. С его помощью шифруются симметричные ключи, асимметричные ключи и сертификаты. Каждая база данных располагает лишь одним DMK.
Следующий уровень содержит симметричные ключи, асимметричные ключи и сертификаты. Симметричные ключи — основное средство шифрования в базе данных. Microsoft рекомендует шифровать данные только с помощью симметричных ключей. Кроме того, в SQL Server 2008 и более новых версиях есть сертификаты уровня сервера и ключи шифрования базы данных для прозрачного шифрования данных. На рисунке 1 показана иерархия ключей шифрования для SQL Server 2008 и более новых версий.
Рисунок 1. Иерархия ключей шифрования в SQL Server 2008 и более новых версиях |
После знакомства с иерархией ключей шифрования SQL Server мы рассмотрим способы реализации шифрования, доступные в SQL Server. Также я покажу, как применить некоторые из них.
Шифрование на уровне ячеек
Начиная с SQL Server 2005, можно шифровать или расшифровывать данные на сервере. Делать это можно различными способами. Например, можно шифровать данные в базах данных одним из следующих методов.
- Пароль. Это наименее надежный способ, так как для шифрования и расшифровки данных используется одна и та же парольная фраза. Если хранимые процедуры и функции не зашифрованы, то доступ к парольной фразе возможен через метаданные.
- Сертификат. Этот способ обеспечивает надежную защиту и высокое быстродействие. Сертификат можно связать с пользователем; подписать его необходимо с помощью DMK.
- Симметричный ключ. Достаточно надежен, удовлетворяет большинству требований к безопасности данных и обеспечивает достаточное быстродействие. Для шифрования и расшифровки данных используется один ключ.
- Асимметричный ключ. Обеспечивает надежную защиту, так как применяются различные ключи для шифрования и расшифровки данных. Однако это негативно влияет на быстродействие. Специалисты Microsoft не рекомендуют использовать его для шифрования крупных значений. Асимметричный ключ может быть подписан с использованием DMK или создан с помощью пароля.
SQL Server располагает встроенными функциями для шифрования и расшифровки на уровне ячеек. Функции шифрования:
* ENCRYPTBYKEY, использует симметричный ключ для шифрования данных; * ENCRYPTBYCERT, использует открытый ключ сертификата для шифрования данных; * ENCRYPTBYPASSPHRASE, использует парольную фразу для шифрования данных; * ENCRYPTBYASYMKEY, использует асимметричный ключ для шифрования данных.
Функции расшифровки:
- DECRYPTBYKEY, использует симметричный ключ для расшифровки данных;
- DECRYPTBYCERT, использует открытый ключ сертификата для расшифровки данных;
- DECRYPTBYPASSPHRASE, использует парольную фразу для расшифровки данных;
- DECRYPTBYASYMKEY, использует асимметричный ключ для расшифровки данных;
- DECRYPTBYKEYAUTOASYMKEY, использует асимметричный ключ, который автоматически расшифровывает сертификат.
SQL Server располагает двумя системными представлениями, с помощью которых можно получить метаданные для всех симметричных и асимметричных ключей, существующих в экземпляре SQL Server. Как видно из названий, sys.symmetric_keys возвращает метаданные для симметричных, а sys.asymmetric_keys — для асимметричных ключей. Еще одно полезное представление — sys.openkeys. В этом представлении каталога содержится информация о ключах шифрования, открытых в текущем сеансе.
Демонстрация шифрования на уровне ячеек
Далее в статье будет показано, как использовать некоторые функции шифрования, расшифровки и представления. Но сначала пройдем по этапам создания тестовой базы данных, в которой есть таблица с номерами кредитных карт.
Подготовка. В первую очередь создайте базу данных EncryptedDB с помощью среды SQL Server Management Studio (SSMS) или выполнив программный код T-SQL:
USE [master] GO CREATE DATABASE [EncryptedDB] GO
Затем запустите код T-SQL для создания таблицы с именем CreditCardInformation в базе данных EncryptedDB:
USE [EncryptedDB] GO CREATE TABLE [dbo].[CreditCardInformation] ([PersonID] [int] PRIMARY KEY, [CreditCardNumber] [varbinary](max)) GO
Эта таблица будет содержать ложную информацию о кредитных картах. Номера кредитных карт будут сохранены в столбце двоичных переменных, потому что они будут шифроваться.
Затем используйте следующий программный код для создания главного ключа DMK базы данных EncryptedDB, шифруемого с помощью парольной фразы $tr0nGPa$$w0rd:
USE [EncryptedDB] GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = '$tr0nGPa$$w0rd' GO
Демонстрация 1. В первой демонстрации данные шифруются с использованием симметричного ключа, который будет зашифрован с помощью асимметричного ключа. Для этого необходимо создать асимметричный ключ, зашифровать его парольной фразой $tr0nGPa$$w0rd, создать симметричный ключ и зашифровать симметричный ключ с помощью только что созданного асимметричного ключа. Выполнить эти задачи можно, запустив программный код в листинге 1.
Теперь мы можем приступить к шифрованию данных. Для этого необходимо сначала открыть симметричный ключ, только что созданный с помощью команды OPEN SYMMETRIC KEY, за которой следует имя симметричного ключа. Затем вы указываете, что нужно расшифровать его с использованием заданного асимметричного ключа. Программный код выглядит следующим образом:
USE [EncryptedDB] GO OPEN SYMMETRIC KEY MySymmetricKey DECRYPTION BY ASYMMETRIC KEY MyAsymmetricKey WITH PASSWORD = 'StrongPa$$w0rd!' GO
После выполнения этого кода направьте запрос в представление sys.openkeys, чтобы убедиться, что ключ открыт:
USE [EncryptedDB] GO SELECT * FROM [sys].[openkeys]
Будут получены результаты, аналогичные показанным на рисунке 2. Наконец, необходимо ввести несколько номеров кредитных карт в таблицу CreditCardInformation, запустив код из листинга 2. Затем направьте запрос к таблице CreditCardInformation:
USE [EncryptedDB] GO SELECT * FROM [dbo].[ CreditCardInformation]
Как показано на рисунке 3, все данные в столбце CreditCardNumber представлены в двоичном формате. С помощью функции DECRYPTBYKEY можно просмотреть зашифрованные данные:
USE [EncryptedDB] GO SELECT [PersonID] CONVERT([nvarchar](32), DECRYPTBYKEY(CreditCardNumber)) AS [CreditCardNumber] FROM [dbo].[CreditCardInformation] GO
Результаты показаны на рисунке 4.
Рисунок 2. Использование представления sys.openkeys для?проверки открытия ключа |
Рисунок 3. Исследование зашифрованных данных |
Рисунок 4. Использование функции DECRYPTBYKEY для?просмотра зашифрованных данных |
Демонстрация 2. Во второй демонстрации данные шифруются с использованием асимметричного ключа, но на этот раз симметричный ключ шифруется сертификатом. Для этого выполните код из листинга 3. Сначала создается сертификат с помощью инструкции CREATE CERTIFICATE. Затем создается симметричный ключ, шифруемый сертификатом. Наконец, открыв симметричный ключ, код вставляет три строки в таблицу CreditCardInformation.
Преимущества и недостатки шифрования на уровне ячеек
У шифрования на уровне ячеек есть свои достоинства и недостатки. Среди достоинств — более детальный уровень шифрования, что позволяет зашифровать единственную ячейку внутри таблицы. Кроме того, данные не расшифровываются, пока не придет время их использовать, то есть данные из загруженной в память страницы зашифрованы. Можно назначить ключ пользователям и защитить его паролем, чтобы предотвратить автоматическую расшифровку.
Среди недостатков шифрования на уровне ячеек — необходимость изменения схемы, так как все зашифрованные данные должны быть сохранены с использованием типа данных varbinary. Кроме того, снижается общая производительность базы данных из-за дополнительной обработки при шифровании и расшифровке данных. Требует времени и просмотр таблицы, поскольку индексы для таблицы зашифрованы и не могут быть использованы.
Прозрачное шифрование данных
В SQL Server 2008 появилась возможность зашифровать всю базу данных с использованием прозрачного шифрования. При таком шифровании можно защитить базы данных без изменения существующих приложений, структур баз данных или процессов. Это лучший вариант для выполнения требований нормативных актов и правил корпоративной безопасности, поскольку шифруется вся база данных на жестком диске.
Прозрачное шифрование данных шифрует базы данных в реальном времени, по мере внесения записей в файлы (*.mdf) базы данных SQL Server и файлы (*.ldf) журнала транзакций. Записи также шифруются в реальном времени во время резервного копирования базы данных, а затем формируются моментальные снимки. Данные шифруются перед записью на диск и расшифровываются перед извлечением. Процесс полностью прозрачен для пользователя или приложения, поскольку выполняется на уровне SQL Server Service.
При прозрачном методе SQL Server шифрует базу данных с помощью ключа шифрования базы данных. Этот асимметричный ключ хранится в загрузочной записи базы данных и потому всегда доступен при восстановлении.
Как показано на рисунке 1, ключ шифрования базы данных шифруется с использованием сертификата сервера, который шифруется с помощью DMK базы данных master. DMK базы данных master шифруется с применением SMK. SMK — асимметричный ключ, зашифрованный с помощью Windows DPAPI. Ключ SMK автоматически формируется при первом шифровании любого объекта и привязан к учетной записи SQL Server Service.
Подготовка к применению прозрачного шифрования данных
Чтобы разрешить прозрачное шифрование данных, необходимо создать DMK и сертификат сервера в базе данных master. Для этого выполните следующий программный код:
USE [master] GO
— Создание DMK.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '$tr0ngPa$$w0rd1' GO
— Создание сертификата сервера.
CREATE CERTIFICATE EncryptedDBCert WITH SUBJECT = 'Certificate to encrypt EncryptedDB'; GO
Важно немедленно сделать резервную копию сертификата и ключа DMK, связанного с сертификатом. Если сертификат становится недоступным или нужно восстановить или присоединить базу данных к другому серверу, то потребуются резервные копии как сертификата, так и DMK. В противном случае открыть базу данных не удастся.
Последний шаг — создать ключ шифрования базы данных и включить шифрование для базы данных, которую нужно защитить. В следующем примере включается прозрачное шифрование в базе данных EncryptedDB:
USE [master] GO CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 ENCRYPTION BY SERVER CERTIFICATE [EncryptedDBCert] GO ALTER DATABASE [EncryptedDB] SET ENCRYPTION ON GO
Включить прозрачное шифрование в базе данных можно также с использованием SQL Server Management Studio (SSMS). Для этого выполните следующие шаги.
- В Object Explorer щелкните на имени базы данных правой кнопкой мыши.
- Выберите Properties, а затем Options.
- Измените значение параметра Encryption Enabled на True.
Чтобы узнать состояние шифрование всех баз данных на сервере, выполните запрос:
USE [master] GO SELECT db.[name] , db.[is_encrypted] , dm.[encryption_state] , dm.[percent_complete] , dm.[key_algorithm] , dm.[key_length] FROM [sys].[databases] db LEFT OUTER JOIN [sys].[dm_database_encryption_keys] dm ON db.[database_id] = dm.[database_id]; GO
В этом запросе используется представление динамического управления с именем sys.dm_database_encryption_keys, чтобы выяснить состояние шифрования каждой базы данных. Как показано на рисунке 5, результат содержит информацию о ключе шифрования базы данных для каждой базы данных.
Рисунок 5. Получение сведений о состоянии шифрования баз данных на сервере |
Шифрование на уровне файлов через Windows
Можно зашифровать весь каталог данных SQL Server с использованием Encrypting File System (EFS), компонента шифрования операционной системы Windows и более новых версий. Как и в механизме SQL Server, в EFS используется Windows DPAPI. В отличие от прозрачного шифрования данных, автоматического шифрования резервных копий не происходит.
Шифрование базы данных с использованием EFS — рекомендуемый способ шифровать файлы базы данных, сохраненные на дисках NTFS. Дело в том, что для EFS операции ввода-вывода SQL Server — синхронные. Рабочему процессу необходимо ждать, пока завершится текущая операция ввода-вывода в файле базы данных, зашифрованном с использованием EFS.
Дополнительные сведения об EFS приведены в материале «How it Works» на сайте Microsoft TechNet. Технические подробности EFS изложены в документе «How Encrypting File System Works» на сайте TechNet (http://technet.microsoft.com/en-us/library/cc781588(v=WS.10).aspx).
Шифрование на транспортном уровне
В SQL Server предусмотрено два варианта шифрования данных, которые будут передаваться по сети между экземпляром SQL Server и клиентским приложением.
- Ipsec. Реализован на уровне операционной системы и обеспечивает проверку подлинности с использованием Kerberos, сертификатов и общих ключей. IPsec обеспечивает прозрачные для приложений службы шифрования с надежной фильтрацией для блокирования трафика по протоколам и портам. IPsec можно настроить с помощью локальной политики безопасности или групповой политики. IPsec может применяться с Windows 2000 и более новыми версиями. Выбирая этот метод, необходимо убедиться, что операционные системы как клиентов, так и сервера совместимы с протоколом IPsec.
- SSL. SSL настраивается на SQL Server. Он наиболее широко применяется для поддержки веб-клиентов, но может использоваться и для собственных клиентов SQL Server. SSL проверяет сервер, когда клиент запрашивает шифрованное соединение. Если экземпляр SQL Server функционирует на компьютере с сертификатом от публичного удостоверяющего центра, то удостоверение компьютера и экземпляр SQL Server гарантируют, что цепочка сертификатов ведет к корневому центру сертификации. Для такой проверки на стороне сервера требуется, чтобы компьютер, на котором функционирует клиентское приложение, доверял корневому удостоверяющему центру, используемому сервером. Возможно шифрование с использованием самозаверяющего сертификата, но защита самозаверяющего сертификата ненадежна.
Настройка SSL
Настроить SSL на сервере проще, чем IPsec. Кроме того, для SSL требуются минимальные усилия по настройке клиента. Рассмотрим, как настроить SSL. Процесс настройки IPsec описан в статьях Windows IT Pro «Use IPsec to Encrypt Data» и «Step-by-Step Guide to Internet Protocol Security (IPsec)» на сайте TechNet (http://technet.microsoft.com/en-us/library/bb742429.aspx).
Можно получить и установить сертификат из независимого удостоверяющего центра, например VeriSign, или установить службу сертификатов Windows и подготовить собственный. SQL Server может издать самозаверяющий сертификат, но он не предназначен для производственного применения. Получив сертификат SSL, выполните следующие действия для настройки SSL на SQL Server.
- В меню Start выберите пункт Run. В диалоговом окне Run введите MMC в текстовом окне и нажмите кнопку OK для запуска консоли управления Microsoft Management Console (MMC).
- В меню File щелкните Add/Remove Snap-in, чтобы открыть окно Add/Remove Snap-in. Нажмите кнопку Add, чтобы перейти к диалоговому окну Add Standalone Snap-in и добавить изолированную оснастку.
- Выберите Certificates и нажмите кнопку Add. Выберите Computer account и нажмите кнопку Finish.
- В оснастке MMC Certificates разверните узел Certificates, затем Personal. Щелкните правой кнопкой мыши папку Certificates, выберите All Tasks и режим Import. В результате будет запущен мастер импорта сертификатов. Нажмите кнопку Next.
- Найдите файл сертификата SSL и нажмите кнопку Next.
- Нажмите Next, и еще раз, чтобы принять хранилище по умолчанию. Нажмите кнопку Finish.
- Нажмите OK, чтобы закрыть диалоговое окно Success.
После установки сертификата на сервере необходимо настроить экземпляр SQL Server для приема зашифрованных соединений. Для этого выполните следующие шаги.
- Запустите диспетчер конфигурации SQL Server Configuration Manager и разверните узел SQL Server Network Configuration.
- Щелкните правой кнопкой мыши Protocols for SQL Server instance и выберите Properties.
- На вкладке Certificate выберите сертификат SSL из раскрывающегося списка. Нажмите OK.
- На вкладке Flags измените значение параметра ForceEncryption на Yes. В результате SQL Server разрешит только шифрованные соединения. Если оставить значение параметра ForceEncryption равным No, SQL Server разрешит как шифрованные, так и незашифрованные соединения.
- Нажмите кнопку OK, чтобы перезапустить SQL Server.
Защитим данные в SQL Server
Шифрование — процесс кодирования конфиденциальных данных с использованием ключа или пароля. Шифрование надежно защищает данные и сокращает вероятность несанкционированного раскрытия конфиденциальной информации, так как без соответствующего ключа или пароля данные бесполезны. SQL Server располагает многими режимами шифрования, в том числе на уровне ячеек, базы данных, файлов через Windows и шифрования на транспортном уровне. Шифрование SQL Server не решает проблему доступности инфраструктуры и баз данных SQL Server, но повышает защищенность данных на уровнях базы данных и операционной системы, даже если нарушена конфиденциальность инфраструктуры или баз данных SQL Server.
Листинг 1. Программный код для создания ключей для демонстрации 1
USE [EncryptedDB] GO — Создание асимметричного ключа, зашифрованного — парольной фразой StrongPa$$w0rd! CREATE ASYMMETRIC KEY MyAsymmetricKey WITH ALGORITHM = RSA_2048 ENCRYPTION BY PASSWORD = 'StrongPa$$w0rd!' GO — Создание симметричного ключа, зашифрованного — асимметричным ключом. CREATE SYMMETRIC KEY MySymmetricKey WITH ALGORITHM = AES_256 ENCRYPTION BY ASYMMETRIC KEY MyAsymmetricKey GO
Листинг 2. Программный код для заполнения таблицы CreditCardInformation
USE [EncryptedDB] GO DECLARE @SymmetricKeyGUID AS [uniqueidentifier] SET @SymmetricKeyGUID = KEY_GUID('MySymmetricKey') IF (@SymmetricKeyGUID IS NOT NULL) BEGIN INSERT INTO [dbo].[CreditCardInformation] VALUES (01, ENCRYPTBYKEY(@SymmetricKeyGUID, N'9876-1234-8765-4321')) INSERT INTO [dbo].[CreditCardInformation] VALUES (02, ENCRYPTBYKEY(@SymmetricKeyGUID, N'9876-8765-8765-1234')) INSERT INTO [dbo].[CreditCardInformation] VALUES (03, ENCRYPTBYKEY(@SymmetricKeyGUID, N'9876-1234-1111-2222')) END TRUNCATE TABLE [dbo].[CreditCardInformation]
Листинг 3. Программный код для шифрования данных с использованием симметричного ключа,
зашифрованного сертификатом
USE [EncryptedDB] GO — Создание сертификата. CREATE CERTIFICATE [CertToEncryptSymmetricKey] WITH SUBJECT = 'Самозаверяющий сертификат для шифрования симметричного ключа.' — Создание симметричного ключа, зашифрованного — сертификатом. CREATE SYMMETRIC KEY [SymmetricKeyEncryptedWithCert] WITH ALGORITHM = AES_256 ENCRYPTION BY CERTIFICATE [CertToEncryptSymmetricKey] — Открытие симметричного ключа. OPEN SYMMETRIC KEY [SymmetricKeyEncryptedWithCert] DECRYPTION BY CERTIFICATE [CertToEncryptSymmetricKey] — Усечение таблицы CreditCardInformation. TRUNCATE TABLE [dbo].[CreditCardInformation] — Вставка данных в таблицу. DECLARE @SymmetricKeyGUID AS [uniqueidentifier] SET @SymmetricKeyGUID = KEY_GUID('SymmetricKeyEncryptedWithCert') IF (@SymmetricKeyGUID IS NOT NULL) BEGIN INSERT INTO [dbo].[CreditCardInformation] VALUES (01, ENCRYPTBYKEY(@SymmetricKeyGUID, N'9876-1234-8765-4321')) INSERT INTO [dbo].[CreditCardInformation] VALUES (02, ENCRYPTBYKEY(@SymmetricKeyGUID, N'9876-8765-8765-1234')) INSERT INTO [dbo].[CreditCardInformation] VALUES (03, ENCRYPTBYKEY(@SymmetricKeyGUID, N'9876-1234-1111-2222')) END