|
|
|||||||||||||||||||||||||||||
|
Шифрование в базах данных SQL ServerИсточник: osp Базит Фарук
Модель шифрования SQL ServerБазит Фарук Сообщения о потерях и несанкционированном доступе к конфиденциальным данным появляются все чаще, а значит безопасность баз данных - весьма актуальная проблема для многих компаний. Организации, в чьих базах данных хранится конфиденциальная информация, должны соблюдать требования многочисленных законодательных актов, в том числе Грэмма-Лича-Блайли (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 и более новых версий.
После знакомства с иерархией ключей шифрования SQL Server мы рассмотрим способы реализации шифрования, доступные в SQL Server. Также я покажу, как применить некоторые из них. Шифрование на уровне ячеекНачиная с SQL Server 2005, можно шифровать или расшифровывать данные на сервере. Делать это можно различными способами. Например, можно шифровать данные в базах данных одним из следующих методов.
SQL Server располагает встроенными функциями для шифрования и расшифровки на уровне ячеек. Функции шифрования: * ENCRYPTBYKEY, использует симметричный ключ для шифрования данных; * ENCRYPTBYCERT, использует открытый ключ сертификата для шифрования данных; * ENCRYPTBYPASSPHRASE, использует парольную фразу для шифрования данных; * ENCRYPTBYASYMKEY, использует асимметричный ключ для шифрования данных.Функции расшифровки:
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. Во второй демонстрации данные шифруются с использованием асимметричного ключа, но на этот раз симметричный ключ шифруется сертификатом. Для этого выполните код из листинга 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). Для этого выполните следующие шаги.
Чтобы узнать состояние шифрование всех баз данных на сервере, выполните запрос: 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, результат содержит информацию о ключе шифрования базы данных для каждой базы данных.
Шифрование на уровне файлов через 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 и клиентским приложением.
Настройка 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.
После установки сертификата на сервере необходимо настроить экземпляр 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Ссылки по теме
|
|