Безопасность Oracle: шифрование данных пользователей

Стас Белков

Стас Белков

Автор статьи. Известный специалист в мире IT. Консультант по продуктам и решениям Oracle. Практикующий программист и администратор баз данных. Подробнее.

Шифрование данных пользователей в базе данных Oracle повышает безопасностьСовременным крупным организациям приходится управлять как внутренними, так и веб-приложениями. Управление пользователями и их полномочиями во всех этих разнообразных приложениях быстро становится административным кошмаром. Централизованные каталоги все чаще признаются наилучшим способом управления множеством систем внутри организации.

LDAP — популярный промышленный стандарт, и Oracle предлагает собственную его реализацию. Используя службу каталогов вроде LDAP, информацию, управление которой осуществляется во множестве систем и форматов, можно собрать под одним “зонтом”. С помощью службы каталогов LDAP можно заменять все файлы tnsnames.ora на клиентах и управлять подключениями, авторизацией и безопасностью. Каталог LDAP может обеспечить строгое управление политикой использования паролей, конфиденциальность и целостность данных, а также надежные протоколы аутентификации и авторизации.

 

Разделяемые схемы

Когда пользователи зарегистрированы и поддерживаются в хранилище LDAP, их называют пользователями разделяемых схем или пользователями, не зависящими от схемы. При подключении пользователя, зарегистрированного в LDAP, к конкретной базе данных, последняя запросит у сервера LDAP подтверждения личности пользователя и ролей, которые должны быть ему назначены при подключении. Таким образом, в базе данных с несколькими сотнями пользователей определенного приложения для управления приложением понадобится создать только одну схему. Отдельный пользователь будет зарегистрирован в централизованном каталоге, и при подключении к базе данных ему будет присвоена эта общая схема.

 

Однократная регистрация

При применении сервера приложений Oracle, можно использовать преимущества функции однократной регистрации, чтобы пользователю нужно было входить в систему только один раз. Как только личность пользователя удостоверена, он может получать доступ ко всем другим действующим в системе приложениям, не вводя имя пользователя и пароль заново. Эта функция автоматической аутентификации очень полезна системным администраторам и другим основным пользователям систем, установленных в организации.

 

Шифрование данных

Иногда может требоваться шифровать данные (кодировать их так, чтобы их могли понять только пользователи, обладающие соответствующими полномочиями). Oracle поддерживает шифрование сетевых данных посредством своей опции Advanced Security. Для обеспечения шифрования данных Oracle предлагает два пакета PL/SQL, один из которых, DBMS_OBFUSCATION_TOOLKIT, является более старым. Этот пакет позволяет шифровать данные по алгоритму DES. Для обеспечения наивысшего уровня безопасности этот пакет инструментов поддерживает тройное DES-шифрование. Кроме того, он поддерживает использование безопасного криптографического хеша MD5.

Для шифрования и дешифрации данных можно также применять более новый пакет шифрования PL/SQL по имени DBMS_CRYPTO. По сравнению с DBMS_OBFUSCATION_TOOLKIT пакет DBMS_CRYPTO предлагает более широкое множество шифровальных и криптографических алгоритмов для обеспечения повышенной безопасности и проще в использовании. Этот пакет предназначен для замены более старого пакета DBMS_OBFUSCATION_TOOLKIT. Но какой бы пакет не использовался, придется управлять ключами шифрования данных, что является нетривиальной задачей. Часто нужно создавать представления, которые облегчают дешифрацию и шифрование данных, что увеличивает количество задач управления. Кроме того, согласно рекомендациям Oracle, шифрованные данные нельзя индексировать, что в некоторых случаях снижает ценность обоих этих пакетов шифрования.

Существует также и третий, более простой подход: шифрование с помощью функции прозрачного шифрования данных. Далее будет показано, как зашифровать табличные данные Oracle с использованием Oracle Wallet (Бумажник Oracle) для хранения ключей шифрования. При этом можно также индексировать столбцы шифрованной таблицы, тем самым избавляясь от одного из наибольших недостатков применения пакетов шифрования Oracle.

Прозрачное шифрование данных

Даже при использовании всех механизмов контроля доступа рано или поздно вы можете прийти к пониманию того, что данные физически хранятся где-либо на диске или ленте, что делает их уязвимыми для несанкционированного доступа. Часто возникают ситуации, когда значения определенных наиболее важных столбцов должны подвергаться шифрованию для обеспечения требуемого уровня безопасности. Для шифрования столбцов можно использовать средство прозрачного шифрования данных (transparent data encryption). Прозрачное шифрование данных означает, что база данных будет выполнять шифрование и дешифрацию автоматически, не вынуждая пользователя или приложение управлять ключом шифрования. То есть приложению больше не нужно выполнять обременительный процесс управления ключом шифрования.

Например, при создании таблицы вместе с именем столбца можно просто указать ключевое слово ENCRYPT, как показано в следующем примере. Этот оператор создает таблицу, которая при сохранении на диске преобразует значения столбца ssn в формат шифрованных данных: 

SQL> CREATE TABLE employees (
empno           NUMBER(5) PRIMARY KEY
ename           VARCHAR2(15) NOT NULL,
ssn             NUMBER(9) ENCRYPT,
. . .

В приведенном примере ключевое слово ENCRYPT указывает, что значение ssn (Social Security number — номер карточки социального страхования) должно шифроваться. Как только это будет сделано, даже если неправомочные пользователи получат доступ к данным на устройствах хранения, они не смогут их прочесть, поскольку данные зашифрованы. Однако когда правомочные пользователи обращаются к этим данным, шифрованные данные автоматически дешифруются, а процесс дешифрации остается прозрачным для пользователя.

Oracle Wallet служит для хранения аутентификационной и регистрационной информации, в том числе — приватных ключей и сертификатов. Прежде чем можно будет начать шифрование или дешифрование таблицы, ключ шифрования извлекается из Oracle Wallet и сохраняется в области SGA.


На заметку! Функция прозрачного шифрования данных позволяет шифровать не только обычные таблицы базы данных, но и внешние таблицы.


Последующие разделы нашей статьи блога содержат краткое описание этого нового средства Oracle, которое позволяет шифровать один или более столбцов таблицы при ее создании или даже позже. Чтобы воспользоваться функциональной возможностью прозрачного шифрования данных, понадобится выполнить следующие действия.

  1. Создайте Oracle Wallet.
  2. Откройте Oracle Wallet.
  3. Сгенерируйте главный ключ шифрования, который будет использоваться для шифрования ключа шифрования столбца.
  4. Укажите, как должно выполняться шифрование столбца.

На заметку! Дешифрация данных выполняется автоматически, когда правомочный пользователь обращается к зашифрованному столбцу. Для расшифровки данных не нужно создавать никаких специальных представлений. Как и при шифровании, переде дешифрацией данных база загрузит главный ключ и ключ шифрования данных из Oracle Wallet в область SGA.


Создание Oracle Wallet с помощью OWM

Создание Oracle Wallet осуществляется с применением диспетчера OWM (Oracle Wallet Manager — Диспетчер бумажника Oracle). Выполните перечисленные ниже действия.

  1. Запустите Oracle Wallet Manager. Для этого в системе UNIX/Linux введите команду owm в приглашении операционной системы. На сервере Windows выберите в меню: Start => Program s=> Oracle => Configuration and Management Tools => Integration Management Tools => Oracle Wallet Manager (Пуск => Программы => Oracle => Средства конфигурирования и управления => Средства управления интеграцией => Диспетчер Oracle Wallet). Окно диспетчера Oracle Wallet Manager показано на рис. 1.
  2. В верхнем левом углу окна Oracle Wallet Manager щелкните на меню Wallet (Бумажник) и выберите опцию New (Создать). Если заданный по умолчанию каталог для создания бумажника еще не существует, Oracle Wallet Manager запросит, нужно ли его создать. Oracle Wallet можно создать в каталоге, заданном по умолчанию, или же в любом другом каталоге по своему выбору.
  3. Откроется поле, в котором можно ввести пароль для управления бумажником. Впоследствии этот пароль будет использоваться в среде SQL*Plus для открытия Oracle Wallet и для создания и изменения главного ключа шифрования. Можно также выбрать тип бумажника. Для простоты просто выберите тип бумажника STANDARD (стандартный), используемый по умолчанию. Щелкните на кнопке OK.
  4. База данных создаст новый пустой Oracle Wallet и спросит, нужно ли создать сертификат. Щелкните на кнопке No (Нет).

На рис. 2 видно, что Oracle Wallet создан без каких-либо сертификатов. Впоследствии при желании можно добавить надежные сертификаты (Trusted Certificates). Для примеров, рассматриваемых в этой статье, они не требуются.

Ключи шифрования хранятся в Oracle Wallet, расположение которого указано в файле конфигурации sqlnet.ora. После того как новый Oracle Wallet будет успешно создан, перейдите в каталог $ORACLE_HOME/network/admin и добавьте следующую строку в файл sqlnet.ora (обеспечивающую указание на ранее выбранный каталог): 

ENCRYPTION_WALLET_LOCATION = '/etc/oracle/wallet/oracle'

Теперь Oracle Wallet можно применять для шифрования столбцов таблицы.

Открытие и закрытие Oracle Wallet

Прежде чем средство прозрачного шифрования данных можно будет использовать для шифрования столбца, необходимо открыть Oracle Wallet, поскольку после своего создания он был закрыт. Oracle Wallet открывается следующим образом:

SQL> ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "password";
System altered.
SQL>

Обратите внимание, что паролем (password) может быть любая строка, указанная при создании Oracle Wallet. Обязательно заключите ее в двойные кавычки. Открытый Oracle Wallet может быть закрыт двумя способами:

  • с помощью оператора ALTER SYSTEM SET ENCRYPTION WALLET CLOSE;
  • посредством остановки базы данных — бумажник закроется автоматически.

После того как бумажник закрыт, перед использованием его нужно снова открыть с помощью оператора ALTER SYSTEM SET ENCRYPTION WALLET OPEN. Если применять бумажник автоматической регистрации (устанавливаемый в Oracle Wallet Manager), то Oracle Wallet не придется каждый раз открывать вручную. Бумажник автоматической регистрации открывается при регистрации создавшего его пользователя. Он остается в действии до тех пор, пока этот пользователь не завершит сеанс.

Генерация главного ключа шифрования

Даже если неправомочный пользователь получит доступ к данным сохраненной таблицы, шифрованные данные в основных зашифрованных столбцах не позволят этому пользователю понять содержимое таблицы. Независимо от количества зашифрованных столбцов в базе данных, для каждой таблицы используется единственный ключ шифрования. При желании его можно изменить, и ключи для каждой зашифрованной таблицы сохраняются в словаре данных после их шифрования главным ключом базы данных.

Предназначение главного ключа состоит в защите ключей шифрования данных. Ключи шифрования данных автоматически генерируются при использовании средства прозрачного шифрования данных (за счет применения ключевого слова ENCRYPT), но, чтобы действительно выполнить шифрование столбов таблицы, нужно вручную сгенерировать главный ключ. Главный ключ шифрования создается следующим образом: 

SQL> ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "password";
System altered.
SQL>

Как и в предыдущем примере, нужно указать пароль Oracle Wallet. При возникновении подозрения, что главный ключ взломан, можно сгенерировать новый ключ с помощью этого же оператора.

Шифрование столбцов таблицы

После того как главный ключ шифрования создан, можно приступить к шифрованию данных таблицы, помещая ключевое слово ENCRYPT после имени столбца, который нужно зашифровать.

Вначале рассмотрим шифрование столбца при создании таблицы. В следующем примере выполняется шифрование столбца ssn в таблице employees

SQL> CREATE TABLE EMPLOYEES
first_name          VARCHAR2(30),
last_name           VARCHAR2(30),
emp_id              NUMBER (9),
salary              NUMBER(6),
ssn                 NUMBER(9) ENCRYPT;
Table created.
SQL>

Столбцы таблицы можно шифровать не только во время ее создания. С помощью оператора ALTER TABLE можно также шифровать столбец в существующей таблице. Добавим столбец ENCRYPT_ID в таблицу employees

SQL> ALTER TABLE EMPLOYEES ADD (ENCRYPT_ID NUMBER(9) ENCRYPT);
Table altered.
SQL>

Можно также шифровать существующий столбец таблицы, как показано в следующем примере: 

SQL> ALTER TABLE EMPLOYEES MODIFY (EMP_ID ENCRYPT);
Table altered.
SQL>

Если теперь проверить таблицу employees, окажется, что столбцы ssn, encrypt_id и emp_id зашифрованы:

SQL> DESCRIBE employees
NAME          NULL?     TYPE
------------  --------  ------------------
FIRST_NAME              VARCHAR2(30)
LAST_NAME               VARCHAR2(30)
EMP_ID                  NUMBER(9) ENCRYPT
SALARY                  NUMBER(6)
SSN                     NUMBER(9) ENCRYPT
ENCRYPT_ID              NUMBER(9) ENCRYPT
SQL> 

Имейте в виду, что шифрование данных приведет к снижению производительности, особенно при выборе или вставке данных пользователями. Если по какой-то причине требуется отключить шифрование, это можно сделать с помощью ключевого слова DECRYPT

SQL> ALTER TABLE employees MODIFY (ssn DECRYPT);

Алгоритмы шифрования

Шифрованные столбцы в таблице employees используют определенный по умолчанию алгоритм шифрования. Этот алгоритм шифрования добавляет к данным случайную строку (SALT) перед их шифрованием, тем самым затрудняя посторонним подбор фрагментов текста.

Как уже было отмечено ранее, прозрачно зашифрованные столбцы можно индексировать, но Oracle рекомендует не использовать добавление случайной строки, если упомянутое индексирование планируется. В таком случае при шифровании столбца следует указать опцию ENCRYPT NO SALT. Аналогично, если требуется использовать алгоритм шифрования, отличный от определенного по умолчанию, его можно задать при шифровании столбца, как показано в следующем примере, где применяется алгоритм 3DES168:

ssn NUMBER(9) ENCRYPT USING '3DES168'

Шифрование табличного пространства

Для реализации шифрования данных можно использовать пакеты DBMS_OBFUSCATION_TOOLKIT и DBMS_CRYPTO, предоставленные Oracle. Однако оба эти пакета увеличивают трудоемкость в том смысле, что приложению приходится управлять ключами шифрования, а также обращаться к API-интерфейсам для выполнения шифрования и дешифровки данных. Для преодоления этих недостатков в Oracle Database 10g было предложено новое средство TDE (Transparent Data Encryption — Прозрачное шифрование данных), которое позволяет шифровать столбцы в таблице. Это средство названо прозрачным, так как база данных берет на себя заботу обо всех нюансах шифрования и дешифровки.

В Oracle Database 11g можно также шифровать табличное пространство целиком. Фактически, шифрование табличного пространства помогает обойти некоторые ограничения, налагаемые на шифрование столбцов в таблице за счет применения TDE. Например, посредством шифрования табличного пространства можно обойти ограничения, которые делают невозможным шифрование столбца, являющегося частью внешнего ключа или используемого в другом ограничении.

Ограничения, налагаемые на шифрование табличного пространства

На шифрование табличных пространств налагаются следующие ограничения.

  • Нельзя шифровать временное табличное пространство или табличное пространство отката.
  • Нельзя изменять секретный ключ шифрованного табличного пространства.
  • Нельзя шифровать внешнюю таблицу.

Как при использовании TDE, для реализации шифрования табличного пространства необходимо создать Oracle Wallet. Поэтому, прежде чем приступить к ознакомлению с шифрованием табличного пространства, давайте создадим Oracle Wallet.

Создание Oracle Wallet

При шифровании табличного пространства бумажники Oracle Wallet используются для хранения главных ключей шифрования. Бумажники Oracle Wallet могут быть либо бумажниками шифрования, либо автоматически открываемыми бумажниками. При запуске базы данных автоматически открываемые бумажники открываются автоматически, но бумажники шифрования должны открываться вручную. Oracle рекомендует использовать для шифрования табличных пространств бумажник шифрования, если только речь не идет о конфигурации Data Guard (Охрана данных), для которой лучше использовать автоматически открываемый бумажник.

Выше в данной статье было описано создание Oracle Wallet с помощью OWM. Однако Oracle Wallet можно создать также и командой mkstore на уровне операционной системы или посредством выполнения специальной команды SQL*Plus.

Следующий пример демонстрирует использование команды mkstore из командной строки операционной системы для создания Oracle Wallet:

$ mkstore -wrl $ORACLE_BASE/admin/$ORACLE_SID/wallet -create
Enter password:******
Enter password again:******

Бумажник можно также легко создать, выполнив следующую команду в среде SQL*Plus:

SQL> alter system set encryption key identified by "password"

Приведенная команда создает бумажник Oracle Wallet, если он еще не существует, и добавляет в него главный ключ.

По умолчанию Oracle хранит Oracle Wallet, который представляет собой всего лишь файл операционной системы ewallet.pl2, хранящийся в определенном операционной системой каталоге. Однако местоположение этого файла можно задать, устанавливая параметр encryption_wallet_location в файле sqlnet.ora, как показано в следующем примере: 

ENCRYPTION_WALLET_LOCATION =
(SOURCE=
(METHOD=file)
(METHOD_DATA=
(DIRECTORY=/apps/oracle/general/wallet) ) )

Вначале потребуется создать каталог wallet в каталоге $ORACLE_BASE/admin/$ORACLE_SID. В противном случае при создании бумажника возникнет ошибка:

ORA-28368: cannot auto-create wallet
не удается автоматически создать бумажник

После создания каталога wallet выполните следующую команду, чтобы создать бумажник Oracle Wallet:

SQL> ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "sammyy11";
System altered.
SQL>

Приведенная команда ALTER SYSTEM создаст новый бумажник Oracle Wallet, если таковой не существует. Она также открывает бумажник и создает в нем главный ключ шифрования. Если бумажник Oracle Wallet существует, команда открывает его и заново создает главный ключ шифрования.

После того как Oracle Wallet создан, табличные пространства можно шифровать, как описано ниже.

Создание шифрованного табличного пространства

Следующий пример демонстрирует шифрование табличного пространства:

SQL> CREATE TABLESPACE tbsp1
DATAFILE '/u01/app/oracle/test/tbsp1_01.dbf' SIZE 500m
ENCRYPTION
DEFAULT STORAGE (ENCRYPT);
Tablespace created.
SQL> 

Конструкция ENCRYPT в определении хранилища указывает базе данных, что новое табличное пространство должно быть зашифровано. Конструкция ENCRYPTION указывает базе данных о необходимости применения алгоритма шифрования, заданного по умолчанию — DES128. С помощью конструкции USING, указываемой непосредственно за конструкцией ENCRYPTION, можно задать другой алгоритм, такой как 3DES168, AES128 или AES256. Поскольку был выбран алгоритм шифрования по умолчанию, в приведенном примере конструкция USING не используется.

В следующем примере применяется необязательная конструкция USING, которая определяет алгоритм шифрования, отличный от применяемого по умолчанию: 

SQL> CREATE TABLESPACE mytbsp2
DATAFILE '/u01/app/oracle/test/mytbsp2_01.dbf' size 500m
ENCRYPTION USING '3DES168'
DEFAULT STORAGE (ENCRYPT);
Tablespace created.
SQL>

Приведенный пример создает шифрованное табличное пространство MYTBSP2, которое вместо применяемого по умолчанию использует алгоритм шифрования 3DES168.

То, зашифровано ли табличное пространство, можно проверить, запросив представление DBA_TABLESPACES

SQL> SELECT tablespace_name, encrypted
2 FROM dba_tablespaces;
TABLESPACE_NAME  ENC
---------------  ----
SYSTEM           NO
SYSAUX           NO
UNDOTBS1         NO
TEMP             NO
USERS            NO
MYTBSP1          YES
MYTBSP2          YES
7 rows selected.
SQL>

База данных автоматически шифрует данные во время их записи и дешифрует во время чтения. Поскольку и шифрование, и дешифрация выполняются не в памяти, это не ведет дополнительным требованиям в отношении памяти. Однако выполнение этих операций сопряжено с небольшими накладными расходами ввода-вывода. Сегменты отката и журнал повторного выполнения будут продолжать хранить шифрованные данные в зашифрованной форме. При выполнении таких операций, как сортировка или объединение, использующих временное табличное пространство, зашифрованные данные остаются зашифрованными и во временном табличном пространстве.

Oracle Internet Directory

Ранее в блогах уже кратко рассматривалась служба Oracle Internet Directory (OID). С помощью OID можно осуществлять эффективное управление безопасностью, в том числе воплощать строгие политики использования паролей для управления безопасностью. Служба OID помогает также поддерживать для каждого пользователя единые глобальные идентификационные данные во всей среде приложения и централизованно хранить мандаты пользователей.

Вас заинтересует / Intresting for you:

Аудит Oracle: безопасность баз...
Аудит Oracle: безопасность баз... 13518 просмотров Александров Попков Tue, 21 Nov 2017, 13:18:05
Требования к безопасности и ау...
Требования к безопасности и ау... 2908 просмотров Дэйзи ак-Макарова Tue, 21 Nov 2017, 13:28:01
Рекомендации по безопасности б...
Рекомендации по безопасности б... 10334 просмотров Александров Попков Sun, 11 Aug 2019, 12:31:16
Взлом и защита СУБД Oracle на ...
Взлом и защита СУБД Oracle на ... 30780 просмотров Горр Sun, 30 May 2021, 08:39:48
Войдите чтобы комментировать

apv аватар
apv ответил в теме #8850 6 года 5 мес. назад
кто-нибудь применял шифрование табличных пространств в реадьных приложегниях? интересует не ухудшают ли они производительность системы?