G.10. TDE — включает защитное преобразование на уровне страницы #
- G.10.1. Обзор прозрачного защитного преобразования данных (TDE)
- G.10.2. Цели TDE
- G.10.3. Механизмы работы TDE
- G.10.4. Установка
- G.10.5. Использование TDE
- G.10.6. Обновление ключей
- G.10.7. Приложения, на которые влияет pgpro_tde
- G.10.8. Ограничения
- G.10.9. TDE и HashiCorp Vault
- G.10.10. Интеграция HashiCorp Vault
- G.10.2. Цели TDE
В этом разделе рассматривается механизм TDE (Transparent Data Encryption , Прозрачное защитное преобразование данных), позволяющий реализовать защитное преобразование на уровне страниц в Postgres Pro Enterprise при помощи расширения pgpro_tde.
G.10.1. Обзор прозрачного защитного преобразования данных (TDE) #
Прозрачное защитное преобразование данных (Transparent Data Encryption, TDE) — это защитное преобразование файлов базы данных на уровне страниц.
pgpro_tde преобразовывает:
Файлы таблиц, индексы, последовательности и другие файлы отношений, включая все версии.
Журнал предзаписи (WAL).
Временные файлы, создаваемые сервером PostgreSQL во время операций сортировок при выходе за пределы объёма памяти.
Данные преобразуются при отправке на диск.
G.10.2. Цели TDE #
С помощью защитного преобразования данных на диске TDE предотвращает несанкционированное чтение этих данных. Неавторизованные пользователи не смогут получить доступ к данным в следующих случаях:
есть доступ к архивам резервных копий
есть доступ к резервным копиям в момент записи
есть права чтения с сервера
G.10.3. Механизмы работы TDE #
G.10.3.1. Алгоритмы защитного преобразования #
Защитное преобразование данных потребляет значительную часть ресурсов процессора и усложняет процесс работы с технической поддержкой. В целях минимизации этих последствий Postgres Pro Enterprise позволяет преобразовывать лишь конфиденциальные данные путём перемещения их в специальное табличное пространство. Процесс защитного и обратного защитного преобразования происходит на лету и не приводит к недоступности СУБД для пользователей. Кроме того, он не влияет на приложения, работающие в СУБД, поскольку запросы к защищённым данным БД обрабатываются прозрачно, как если бы они не были защищены.
Для защитного и обратного защитного преобразования с помощью алгоритма AES pgpro_tde вызывает библиотеку OpenSSL. При этом используется OpenSSL, поставляемая в рамках сертифицированных ОС. Преобразование файлов данных происходит с помощью алгоритма симметричного ключа AES-256-GCM, что обеспечивает подлинность, целостность и конфиденциальность данных. Сегменты WAL же преобразовываются с помощью AES-256-CTR по LSN.
OpenSSL использует расширения к командам векторизации, например AVX-512
для GCM
. Благодаря этому AES-256-GCM
работает на порядок быстрее. Чтобы добиться такой высокой производительности при работе TDE, убедитесь, что ваше аппаратное и программное обеспечение по виртуализации поддерживает такие расширенные команды.
G.10.3.2. Ключи защитного преобразования #
Postgres Pro Enterprise преобразовывает файлы отношений в специальном табличном пространстве с использованием соответствующих ключей защитного преобразования для этого табличного пространства, а файлы WAL — с использованием специальных ключей защитного преобразования WAL. Эти ключи — уникальная последовательность байтов, которая хранится в защищённом файле $PGDATA/pg_encryption/keys
. При запуске система обращается к внешней защитной системе, чтобы обратно преобразовать этот файл, после чего хранит эти ключи в своей памяти.
У внешней защитной системы есть свой главный ключ, который она использует для защитного преобразования и обратного защитного преобразования набора ключей для ключей табличного пространства системы и WAL. Такой главный ключ генерируется и хранится во внешней системе управления ключами. Более подробная информация описана в Подразделе G.10.10.
Для каждого кластера существует один файл с набором ключей, который называется keys
, он содержит все ключи защитного преобразования для табличного пространства и WAL. Файл хранится в каталоге $PGDATA/pg_encryption
. При создании новых ключей (например, после ротации) в системе вызывается внешняя защитная система, которая преобразовывает новые ключи и затем добавляет в конец того же файла. Postgres Pro Enterprise никогда не хранит ключи в текстовом, непреобразованном виде.
Для ещё большего повышения безопасности используйте ротацию ключей, что позволит ограничить данные, преобразованные одним и тем же ключом защитного преобразования табличного пространства. При ротации генерируется новый ключ табличного пространства, который используется для преобразования всех новых данных. Старые данные всё ещё могут быть обратно преобразованы с помощью старого ключа, с которым они были преобразованы. При обновлении страницы файла с данными они заново преобразовываются, уже с новым ключом. Ротация ключей происходит на лету и не требует перезапуска сервера. Чтобы ротировать отдельные ключи табличных пространств, выполните одну из этих команд:
SELECT pg_rotate_encryption_key(tablespace oid)
Или
select pg_rotate_encryption_key((select oid from pg_tablespace where spcname='my-encrypted-tablespace-name'))
G.10.4. Установка #
Расширение pgpro_tde поставляется в рамках Postgres Pro Enterprise как отдельный пакет pgpro-tde-ent
. Для включения pgpro_tde выполните следующие шаги:
Добавьте имя библиотеки в параметр
shared_preload_libraries
в файлеpostgresql.conf
:shared_preload_libraries = 'pgpro_tde'
Обратите внимание, что названия библиотек в переменной
shared_preload_libraries
должны идти в определённом порядке.Перезагрузите сервер БД, чтобы изменения вступили в силу.
Чтобы проверить, что библиотека
pgpro_tde
успешно установлена, запустите следующую команду:SHOW shared_preload_libraries;
Перед запуском pgpro_tde настройте любую внешнюю систему управления ключами. В целях демонстрации будет использоваться HashiCorp Vault. Более подробная информация представлена в Подразделе G.10.10.
Разрешите кластеру Postgres Pro Enterprise доступ к внешней системе управления ключами
Остановите ведущий и резервный сервера
Примените файлы WAL на резервные сервера
Обновите файл
postgresql.conf
с информацией изPGDATA/pg_encryption/keys
и следующими параметрами:encryption=on encryption_key_wrap_command = ... encryption_key_unwrap_command = ...
postgresql.conf
необходимо изменить на ведущем и всех резервных серверах. За подробной информацией и инструкцией по настройке на примере HashiCorp обратитесь к данному разделу.Запустите ведущий сервер. После запуска файлы WAL будут преобразованы в соответствующих каталогах
$PGDATA/pg_wal
.Скопируйте файл
$PGDATA/pg_encryption/keys
с ведущего сервера в каталогиpg_encryption
всех резервных серверов.Запустите резервные сервера. После запуска файлы WAL в каталогах
$PGDATA/pg_wal
будут преобразованы с тем же ключом WAL, что и на ведущем сервере. Это позволяет обмениваться преобразованными записями WAL между ведущим и резервными серверами.
Необходимо выполнять резервное копирование файла PGDATA/pg_encryption/keys
и файлов метаданных (файлы с суффиксом -tde, которые хранят информацию о защитном преобразовании), поскольку в случае их потери прочесть преобразованные файлы будет невозможно.
G.10.5. Использование TDE #
pgpro_tde можно включить только для отдельных табличных пространств. Чтобы преобразовать табличное пространство, включите параметр encryption
при создании нового табличного пространства. Например:
CREATE TABLESPACE secure_tablespace LOCATION '/My/Data/Dir' WITH (encryption=on);
Параметр защитного преобразования табличного пространства нельзя изменить после того, как он был задан. Поэтому нельзя преобразовать табличное пространство, если в нём уже находятся данные в чистом виде, или обратно преобразовать табличное пространство, в котором уже находятся защищённые данные.
Чтобы преобразовать таблицу, поместите её в преобразованное табличное пространство с помощью команды ALTER TABLE имя_таблицы SET TABLESPACE преобразованное_табличное_пространство;
. Для этого понадобятся права владельца таблицей и право использования данного табличного пространства. Однако достаточно обычных прав на такие таблицы, чтобы использовать операторы SELECT
, UPDATE
, INSERT
, UPDATE
, DELETE
и TRUNCATE
для их непреобразованных данных.
Если это первая операция по защитному преобразованию для данного табличного пространства, то сервером будет создан первый ключ защитного преобразования табличного пространства. Ведущий сервер отправляет этот ключ через специальную запись в файле WAL на все резервные сервера, чтобы применить на них к соответствующим табличным пространствам. Обратите внимание, что новые ключи защитного преобразования реплицируются с ведущего сервера на резервные автоматически.
Обратите внимание, что все новые ключи защитного преобразования автоматически реплицируются с ведущего сервера на резервные.
Чтобы произвести обратное защитное преобразование таких данных, переместите их из защищённого табличного пространства в любое другое.
Вы можете проверить, включено ли pgpro_tde на сервере, с помощью запроса \db+
, который выводит список табличных пространств. У защищённых табличных пространств будет задано значение encrypted=on
. Например:
postgres=# \db+ List of tablespaces Name | Owner | Location | Access privileges | Options | Size | Description ------------+----------+------------------------------------------+-------------------+-----------------+--------+------------- encrypted | postgres | /var/lib/pgpro/ent-17/meta/pg_encryption | | {encryption=on} | 68 kB | pg_default | postgres | | | | 22 MB | pg_global | postgres | | | | 667 kB | (3 rows)
G.10.6. Обновление ключей #
G.10.6.1. Обновление главного ключа #
Если у вашего главного ключа истёк срок жизни или он был скомпрометирован, необходимо сгенерировать и применить новый главный ключ. В зависимости от выбранного решения это можно сделать по-разному. В демонстрационных целях используется HashiCorp Vault.
В Postgres Pro Enterprise ключи хранятся в каталоге ${PGDATA}/pg_encryption/keys
. В целях безопасности все ключи этого файла преобразованы с помощью главного ключа, хранящегося в HashiCorp Vault. Для настройки хранилища необходим адрес приёмника и токен экземпляра. Установка производится через переменные окружения, в качестве примера приведены VAULT_ADDR
и VAULT_TOKEN
:
echo VAULT_ADDR='http://127.0.0.1:8200' > /etc/env.d/99vault echo VAULT_TOKEN="hvs.C77DySgOTjliYqmtp3yA4osP" >> /etc/env.d/99vault
Включить транзит с помощью HashiCorp Vault Transit Secrets Engine:
vault secrets enable transit
Создать новый ключ и задать ему новое уникальное имя:
vault write -f transit/keys/pg-tde-new-master-key
Когда новый ключ готов, необходимо заново преобразовать ваш файл ключей с помощью нового главного ключа:
cat keys | vault write -field=plaintext transit/decrypt/pg-tde-master-key ciphertext=- | vault write -field=ciphertext transit/encrypt/pg-tde-new-master-key plaintext=- > keys
По умолчанию HashiCorp Vault работает с 256-битными ключам. При необходимости работы с другими ключами обратитесь к администратору сервера HashiCorp Vault для изменения конфигурации.
G.10.6.2. Обновление ключей табличного пространства #
Для обновления ключей табличного пространства администратор СУБД должен вызывать функцию pg_rotate_encryption_key
с oid табличного пространства для генерации нового ключа:
postgres=# \db+ List of tablespaces Name | Owner | Location | Access privileges | Options | Size | Description ------------+----------+------------------------------------------+-------------------+-----------------+--------+------------- encrypted | postgres | /var/lib/pgpro/ent-17/meta/pg_encryption | | {encryption=on} | 68 kB | pg_default | postgres | | | | 22 MB | pg_global | postgres | | | | 667 kB | (3 rows) postgres=# select * from pg_tablespace where spcname='encrypted'; oid | spcname | spcowner | spcacl | spcoptions -------+-----------+----------+--------+----------------- 24587 | encrypted | 10 | | {encryption=on} (1 row) postgres=# select pg_rotate_encryption_key(24587); pg_rotate_encryption_key -------------------------- t (1 row)
G.10.7. Приложения, на которые влияет pgpro_tde #
У следующих приложений есть параметры, специфичные для TDE, что обеспечивает особую обработку данных в файлах БД: pg_rewind
и pg_waldump
с параметром -D
.
Каждое из них может работать как с защищёнными данными, так и с обычными. Они обнаруживают команды warp/unwarp
и параметры защитного преобразования в файле postgresql.conf
. Далее они находят файл postgresql.conf
в каталоге данных (задаётся через PGDATA/
). Если каталог PGDATA/
не задан или является некорректным, его можно задать с помощью -D --pgdata
. Такой подход обеспечивает максимальный уровень обратной совместимости с незащищённым режимом.
G.10.8. Ограничения #
Работа с pg_probackup ограничена следующими операциями при значении
encryption=on
:Резервное копирование в режимах FULL и DELTA с помощью режима ARCHIVE WAL
Восстановление кластера (с указанием резервной копии и без)
Проверка резервных копий (с параметром
--wal
или без)Слияние резервных копий FULL и DELTA с параметром
--merge-expired
, что объединяет самую старую инкрементальную копию, удовлетворяющую требованиям политики хранения, с её родительскими копиями, срок хранения которых истёк.
Другие операции не поддерживаются, среди них восстановление на момент времени (PITR) и восстановление по указанным LSN, XID или линии времени.
Сжатая файловая система (CFS) и pgpro_tde не могут использоваться одновременно в одном и том же табличном пространстве.
Нет поддержки pg_transfer.
G.10.9. TDE и HashiCorp Vault #
В данном разделе описана интеграция прозрачного защитного преобразования данных (TDE) с внешней системой управления ключами HashiCorp Vault.
G.10.10. Интеграция HashiCorp Vault #
G.10.10.1. Создание главного ключа и конфигурация Pro Enterprise #
В Postgres Pro Enterprise ключи хранятся в каталоге ${PGDATA}/pg_encryption/keys
. В целях безопасности все ключи этого файла преобразованы с помощью главного ключа, хранящегося в HashiCorp Vault.
Для настройки хранилища необходим адрес приёмника и токен экземпляра. Установка производится через переменные окружения, в качестве примера приведены VAULT_ADDR
и VAULT_TOKEN
:
echo VAULT_ADDR='http://127.0.0.1:8200' > /etc/env.d/99vault echo VAULT_TOKEN="hvs.C77DySgOTjliYqmtp3yA4osP" >> /etc/env.d/99vault
Включит транзит с помощью HashiCorp Vault Transit Secrets Engine:
vault secrets enable transit
Создайте ключ и назовите его:
vault write -f transit/keys/pg-tde-master-key
По умолчанию HashiCorp Vault работает с 256-битными ключам. При необходимости работы с другими ключами обратитесь к администратору сервера HashiCorp Vault для изменения конфигурации.
G.10.10.2. Тестирование TDE #
Чтобы убедиться в верности конфигурации, запустите экспресс-тесты:
Подключитесь к
psql
с правами суперпользователя и запустите одну из следующих команд:ALTER SYSTEM SET encryption_key_wrap_command='base64 | vault write -field=ciphertext transit/encrypt/pg-tde-master-key plaintext=- > %p'; ALTER SYSTEM SET encryption_key_unwrap_command='cat %p | vault write -field=plaintext transit/decrypt/pg-tde-master-key ciphertext=- | base64 --decrypt';
Перезапустите сервер командой
pg_ctl restart
, чтобы изменения вступили в силу.Когда сервер запустится, выполните следующие команды:
CREATE TABLESPACE encrypted LOCATION ':PGDATA/encrypted_ts'; ALTER TABLESPACE encrypted SET (encryption=on); CREATE TABLE test_table TABLESPACE encrypted AS (SELECT * FROM generate_series(1, 100) AS col1);
Если всё настроено правильно, в >${PGDATA}/pg_encryption/encryption_keys
будут такие данные:
vault:v1:rdaF+sSfkKn9HBzdalat7mnynRRR6b00FQS159PCUMGmMZJYMNm/hWxbFFIeV8C43nO3UV4dmgn7pxnJkwo4IYq2+sUHSWT/
G.10.10.3. Рекомендации по установке HashiCorp Vault #
Предполагается, что HashiCorp Vault уже интегрирован вашей компанией и управляется администраторами. Однако в целях тестирования может понадобится отдельный экземпляр сервера с хранилищем, которое настроено специально под работу с Postgres Pro Enterprise TDE.
G.10.10.3.1. Установка HashiCorp Vault #
Настоятельно рекомендуется использовать репозиторий вашей ОС для установки HashiCorp Vault. ДляUbuntu:
apt-get install -y wget net-tools apt-transport-https wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor > /tmp/hashicorp.gpg mv /tmp/hashicorp.gpg /etc/apt/trusted.gpg.d/ chown root:root /etc/apt/trusted.gpg.d/hashicorp.gpg chmod ugo+r /etc/apt/trusted.gpg.d/hashicorp.gpg chmod go-w /etc/apt/trusted.gpg.d/hashicorp.gpg echo "deb https://apt.releases.hashicorp.com $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/hashicorp.list apt-get update apt-get install vault
После установки команда vault --version
вернёт текущую версию хранилища, например:
Vault v1.15.6, built 2024-09-17T15:25:10Z
Вы также можете запустить временное тестовое хранилище с ограниченным сроком работы в среде разработки. Для этого запустите команду vault server -dev
в отдельной командной строке. Обратите внимание, что любые данные на таком экземпляре ограничены временем работы обслуживающего процесса. При каждом запуске такого тестового хранилища генерируется новый ключ распечатки, что создаёт новый корневой токен, заданный в переменной VAULT_TOKEN
.
Для постоянного хранилища необходимо настроить службу так, чтобы она запускалась автоматически. Для операционных систем на базе openrc
и systemd
команды конфигурации будут отличаться. Для Ubuntu:
systemctl enable vault --now
Для получения статуса службы:
systemctl status vault
G.10.10.3.2. Конфигурация HashiCorp Vault #
Служба хранилища требует минимального ручного вмешательства. Ей требуется только указать обслуживающий процесс. По умолчанию приёмник будет доступен по протоколу HTTPS. Его можно переключить на HTTP или отключить аутентификацию для CLI. При работе по протоколу HTTPS самоподписанный сертификат не проходит проверку, поэтому его нужно отключить:
typeset -x VAULT_SKIP_VERIFY=true
Ниже приведён пример правильной конфигурации:
api_addr = "https://127.0.0.1:8200" cluster_addr = "https://127.0.0.1:8210" cluster_name = "local-vault-cluster" disable_mlock = true ui = true backend "raft" { node_id = "local-vault-server" path = "/var/lib/vault" } listener "tcp" { address = "[::]:8200" cluster_address = "[::]:8210" tls_cert_file = "/var/lib/vault/cert.pem" tls_key_file = "/var/lib/vault/key.pem" } listener "tcp" { address = "127.0.0.1:8201" cluster_address = "127.0.0.1:8210" tls_disable = 1 }
Для создания самоподписанного сертификата:
openssl req -x509 -newkey rsa:4096 -sha256 -days 365 \ -nodes -keyout /var/lib/vault/key.pem -out /var/lib/vault/cert.pem \ -subj "/CN=localhost" \ -addext "subjectAltName=DNS:localhost,IP:127.0.0.1"
При такой конфигурации необходимо, чтобы каталог /var/lib/vault
был доступен для чтения и записи тем пользователям, под которыми запущена служба. При этом raftdb
задаётся в качестве обслуживающего процесса с двумя приёмниками: локальным и глобальным с TLS.
Чтобы распечатать службу перед запуском необходимо получить ключ и корневой токен:
vault operator init -key-shares=1 -key-threshold=1 vault operator unseal key
После этого необходимо авторизовать CLI:
vault login token
После этого шага VAULT_TOKEN
для CLI больше не требуется. По его завершении хранилище готово к работе с TDE.