Oracle DB: Transparent Data Encryption

Материал из sysadm
Перейти к навигации Перейти к поиску

Обзор

Ссылки по теме


Transparent Data Encryption (TDE) - предназначено для защиты данных на уровне доступа к файлам табличных пространств или их резервным копиям. Средствами TDE шифруются файлы табличных пространств, база данных автоматически расшифровывает все запрашиваемые данные, поэтому для авторизованного в базе пользователя этот процесс прозрачен.

Ключи шифрования TDE хранятся во внешних (относительно базы) хранилищах keystore.

В качестве keystore используется контейнер wallet (кошелек), который может хранится в локальной файловой системе в виде файла. Также есть возможность хранить wallet в централизованном хранилище ключей Oracle Key Vault (подробнее см. "Oracle Key Vault Administrator's Guide").

TDE может шифровать данные на двух уровнях:

  • табличное пространство
  • столбец таблицы

Системные привилегии:

  • ADMINISTER KEY MANAGEMENT - необходимо для конфигурации TDE
  • SYSKM - необходимо для открытия хранилища ключа на стадии монтирования базы, включает в себя ADMINISTER KEY MANAGEMENT и другие необходимые привилегии.

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

Для включения шифрования на уровне столбца таблицы или табличного пространства указанные выше привилегии не нужны, достаточно прав (CREATE TABLE, ALTER TABLE, CREATE TABLESPACE).

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

TDE использует двух-уровневую архитектуру ключей.

                           +-------------------------+
 +-----------------+       |       Database          |
 | Внешний модуль  |       |                         |
 |    [Master-key] ---------->[TDE Encrypteion keys] |
 |                 |       |   |            |        |
 +-----------------+       |  Table     Tablespace   |
                           |  column                 |
                           |                         |
                           +-------------------------+

Мастер ключ хранится во внешнем модуле безопасности, контейнере wallet или аппаратном модуле Hardware Security Module (HSM). Поддержка HSM реализована начиная с Oracle 12.1. Мастер-ключ используется для защиты ключей шифрования, которые в свою очередь используются для шифрования данных.

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

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

TDE и контейнерные базы

Режимы работы:

  • Объединенный режим (United mode)
    • для корня CDB и контейнеров работающих в объединенном режиме открывается один wallet
    • для каждого контейнера PDB создается свой мастер-ключ
    • операторы ADMINISTER KEY MANAGEMENT с директивой CONTAINER=ALL применяются только к PDB, которые работают в объединенном режиме и не влияют на PDB работающих в изолированном режиме
  • Изолированный режим (Isolated mode)
    • для каждого контейнера открывается свой wallet

Администрирование TDE

Хранилище ключей (19с)

Создание пустого хранилища ключей

ADMINISTER KEY MANAGEMENT CREATE KEYSTORE '/path/to/wallet_dir' IDENTIFIED BY "***wallet_pass***";

Открытие хранилища ключей

ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "***wallet_pass***";

Включение AUTO_LOGIN

ADMINISTER KEY MANAGEMENT CREATE [LOCAL] AUTO_LOGIN KEYSTORE FROM KEYSTORE '/path/to/wallet_dir' IDENTIFIED BY "***wallet_pass***";
-- опция LOCAL привязывает файл автологина cwallet.sso к текущему серверу
-- если опция LOCAL не указана, то файл автологина откроется на любом сервере без пароля

Смена пароля на wallet

ADMINISTER KEY MANAGEMENT ALTER KEYSTORE PASSWORD 
[FORCE KEYSTORE] 
IDENTIFIED BY
old_password SET new_password 
[WITH BACKUP [USING 'backup_identifier']];

Порядок поиска хранилища ключей

  1. Путь заданный параметром инстанции WALLET_ROOT, при условии что в параметре TDE_CONFIGURATION задан аттрибут KEYSTORE_CONFIGURATION имеющий значение FILE.
  2. Параметр WALLET_LOCATION в файле sqlnet.ora (обратите внимание, что в sqlnet.ora нельзя задать несколько определений для WALLET_LOCATION)
  3. Параметр ENCRYPTION_WALLET_LOCATION в файле sqlnet.ora (считается устаревшим, не рекомендуется использовать)
  4. Если определена переменная $ORACLE_BASE, то проверяется каталог $ORACLE_BASE/admin/<db_unique_name>/wallet, иначе проверяется каталог $ORACLE_HOME/admin/db_unique_name/wallet

Пример задания параметра WALLET_LOCATION в файле sqlnet.ora

-- в sqlnet.ora можно указать не стандартное размещение ewallet.p12
WALLET_LOCATION =
  ( SOURCE =
    ( METHOD = FILE )
    ( METHOD_DATA =
      ( DIRECTORY = /path/to/wallet_dir )
    )
  )

Для OS Windows, wallet можно перенести в реестр

Мастер-ключ (19c)

Особенности CDB баз

  • На уровне корневого контейнера CDB$ROOT создается общее хранилище ключей
  • В общем хранилище ключей генерируется общий мастер-ключ для всех контейнеров
  • Общее хранилище ключей с общим мастер-ключом открывается отдельно в каждом контейнере

Просмотр обнаруженных мастер-ключей

-- список обнаруженных хранилищ ключей
set line 300;
col wrl_parameter format a30;
col wrl_type format a10;
col wallet_type format a15;
col status format a15;
SELECT * FROM V$ENCRYPTION_WALLET;

-- список идентификаторов мастер-ключей (mkid) в кодировке base64
-- при активации мастер-ключа в его записи обновляется время activateion_time, поэтому рабочим является мастер-ключ с наибольшей датой активации
col key_id format a55;
col activation_time format a40;
SELECT key_id, activation_time, creator_dbid, activating_dbid FROM V$ENCRYPTION_KEYS;

-- список шифрованных ТП с указанием mkid мастер-ключа в шестнадцатеричной форме, которым зашифрован ключ шифрования ТП
SELECT b.name,a.ENCRYPTEDTS,a.ENCRYPTEDKEY,a.MASTERKEYID,a.KEY_VERSION,a.STATUS,a.CON_ID FROM v$encrypted_tablespaces a, v$tablespace b where a.ts# = b.ts#;
-- все поля
SELECT b.name,a.* FROM v$encrypted_tablespaces a, v$tablespace b where a.ts# = b.ts#;

-- преобразование mkid из шестнадцатеричной формы в кодировку base64
select utl_raw.cast_to_varchar2( utl_encode.base64_encode('01'||substr('<mkid>',1,4))) ||
       utl_raw.cast_to_varchar2(
         utl_encode.base64_encode(substr('<mkid>',5,length('<mkid>')))
       ) masterkeyid_base64 FROM dual;

-- просмотр валлета утилитами из командной строки
orapki wallet display -wallet /path/to/wallet_dir
mkstore -wrl /path/to/wallet_dir -list

ВАЖНО Мастер-ключ созданный в Oracle Database 11g не отображается в представлении V$ENCRYPTION_KEYS из-за того что прописан в устаревшем типе записи ORACLE.SECURITY.TS. Это также может приводить к различным проблемам связанным с невозможностью найти мастер-ключ

Генерация мастер-ключа

-- генерация мастер-ключа на хранилище с выключенным auto_login
ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY "***wallet_pass***" WITH BACKUP;

-- генерация мастер-ключа на хранилище с включенным auto_login
ADMINISTER KEY MANAGEMENT SET KEY FORCE KEYSTORE IDENTIFIED BY "***wallet_pass***" WITH BACKUP;

-- полная форма команды
ADMINISTER KEY MANAGEMENT SET [ENCRYPTION] KEY [FORCE KEYSTORE] [USING TAG 'tag_name'] IDENTIFIED BY [EXTERNAL STORE | keystore_password]
[WITH BACKUP [USING 'backup_identifier']]
[CONTAINER = ALL | CURRENT]

Экспорт мастер-ключа

-- Если выполняется на standby, то остановите накат архив-логов на время действий с хранилищем ключей

-- если включен autologin, то необходимо открыть wallet с авторизацией по паролю
ADMINISTER KEY MANAGEMENT SET KEYSTORE CLOSE;
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "keystore_password";

-- экспорт мастер-ключа
ADMINISTER KEY MANAGEMENT EXPORT ENCRYPTION KEYS WITH SECRET "any_password_to_protect_export_file" TO '/path/to/export_file' IDENTIFIED BY "keystore_password";

-- экспорт мастер-ключа с заданным идентификатором
ADMINISTER KEY MANAGEMENT EXPORT KEYS WITH SECRET "xxxxxxx" TO '/tmp/export.exp' IDENTIFIED BY xxxxxxx WITH IDENTIFIER IN 'Axxxxxxxxxxxxxxxxxx8UAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';

-- если необходимо, переоткрываем валлет через autologin
ADMINISTER KEY MANAGEMENT SET KEYSTORE CLOSE IDENTIFIED BY password;
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN;

Импорт мастер-ключа

ADMINISTER KEY MANAGEMENT IMPORT KEYS WITH SECRET "password_to_export_file" FROM '/path/to/export_file' IDENTIFIED BY "keystore_password" WITH BACKUP;

Активация существующего TDE мастер-ключа

ADMINISTER KEY MANAGEMENT 
USE [ENCRYPTION] KEY 'key_id' 
IDENTIFIED BY [EXTERNAL STORE | keystore_password]
WITH BACKUP 
[USING 'backup_identifier'];

Мастер-ключ (11g)

TDE может использовать wallet по умолчанию для всей БД, но Oracle настоятельно рекомендует использовать для TDE отдельный wallet.

TDE будет использовать отдельный wallet, если путь к нему определен через sqlnet.ora

Генерация / перегенерация мастер-ключа

ALTER SYSTEM SET ENCRYPTION KEY ["certificate_ID"] IDENTIFIED BY "***wallet_pass***"

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

Открытие хранилища ключей

ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "password"

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

Необходимо соблюдать следующие правила

  • временное табличное пространство шифруется методом пересоздания
    1. создается промежуточное временное ТП
    2. база переключается на промежуточное временное ТП
    3. основное временное ТП удаляется и создается с опцией шифрования
    4. база переключается на основное временное ТП
    5. промежуточное временное ТП удаляется
  • рабочие табличные пространства шифруются по очереди
  • в последнюю очередь шифруются UNDO и SYSTEM
-- список зашифрованных табличных пространств
select tablespace_name, encrypted from dba_tablespaces where encrypted='YES';

-- список зашифрованных табличных пространств с ключами шифрования и идентификатором мастер-ключа
SELECT b.name,a.* FROM v$encrypted_tablespaces a, v$tablespace b where a.ts# = b.ts#;

-- запуск операции шифрования/дешифрования/пересоздания ключа шифрования табличного пространства
-- директива FINISH используется, если процесс был прерван и необходимо его продолжить
-- директива REKEY генерирует новый ключ шифрования для уже зашифрованного табличного пространства и перешифровывает все файлы данных новым ключом
-- директива ENCRYPT генерирует ключ шифрования для не зашифрованного табличного пространства и шифрует файлы данных этим ключом
ALTER TABLESPACE <имя_тп> ENCRYPTION [ONLINE | OFFLINE | FINISH] [USING 'AES256'] [ENCRYPT | DECRYPT | REKEY];

-- если сессия запустившая процесс крипто-преобразования прервалась, то процесс не прерывается, но в поле BLOCKS_ENCRYPTED (v$encrypted_tablespaces) счетчик перестает расти.
-- состояние процесса крипто образования можно увидеть в поле STATUS (v$encrypted_tablespaces)

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

-- список шифрованных столбцов
SELECT * FROM all_encrypted_columns;

-- список ключей шифрования для столбцов таблиц (доступно только под SYS)
SELECT * FROM SYS.ENC$;

-- смена ключа шифрования и перешифровка столбцов таблицы
ALTER TABLE <имя_таблицы> REKEY;

-- смена ключа шифрования и алгоритма, перешифровка столбцов таблицы
ALTER TABLE <имя_таблицы> REKEY USING 'aes256';

RMAN и шифрование

-- список доступных алгоритмов шифрования для rman
SELECT * FROM V$RMAN_ENCRYPTION_ALGORITHMS;

-- установка алгоритма для текущей сессии rman
SET ENCRYPTION ALGORITHM 'AES192';

-- установка алгоритма шифрования для по умолчанию для rman
CONFIGURE ENCRYPTION ALGORITHM 'AES256';
CONFIGURE ENCRYPTION FOR DATABASE ON;

Инструкции

Standby

ЕЩЕ НЕ ПРОВЕРЕНО

Включение шифрования на PHYSICAL STANDBY сервере.

  1. Проверьте, что Standby работает, архив-логи накатываются
  2. Создайте wallet и master-key (где?)
  3. Скопируйте файлы wallet на Standby сервер
  4. Остановите накат архив-логов на Standby (media recovery)
  5. Зашифруйте файлы данных (последовательно или параллельно)
  6. Запустите накат архив-логов