Задание 2: HashiCorp Vault и KMS-заменитель
Если вы проходите модули DBP1, посвященные разным функциональностям, не последовательно, рекомендуем все равно перед прохождением данной лабораторной обратиться к вступительному модулю второго уровня в теме DBP1 Парольные политики. Часто конкретные действия могут быть выполнены только одной конкретной ролью, поэтому будьте внимательны и перепроверяйте, под каким пользователем вы выполняете те или иные команды.
Для реализации механизма защиты данных требуется наличие установленного и интегрированного решения Key/Secret Management System. В СУБД Pangolin реализована интеграция с KMS HashiCorp Vault, который используется в качестве защищенного хранилища ключей защитного преобразования данных и настроек, а также, как система управления ключами.
HashiCorp Vault — это инструмент с открытым исходным кодом, который обеспечивает безопасный и надежный способ хранения и распространения секретов, таких как ключи API, токены доступа и пароли.
В рамках курса мы не будем рассматривать настройку HashiCorp Vault, но попрактикуемся на плагине-заменителе KMS, который реализован в виде библиотеки libkms_substitute_plugin.so.
Более подробно с хранилищем секретов можно ознакомиться в документации.
Подключение KMS-заменителя
-
Настройка KMS должна производиться при остановленном сервере Pangolin:
[UserName@ServerName ~]$ sudo systemctl status postgresql● postgresql.service - Runners PostgreSQL serviceLoaded: loaded (/etc/systemd/system/postgresql.service; enabled; preset: disabled)Active: active (running) since Fri 2025-03-28 07:23:22 MSK; 18min agoProcess: 572 ExecStartPre=/bin/mkdir -p /var/run/postgresql (code=exited, status=0/SUCCESS)Process: 584 ExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresql (code=exited, status=0/SUCCESS)Main PID: 596 (postgres)Tasks: 10 (limit: 9499)Memory: 57.4MCPU: 1.177sCGroup: /system.slice/postgresql.service├─596 /usr/pangolin-6/bin/postgres -D /pgdata/06/data├─651 "postgres: checkpointer "├─652 "postgres: background writer "├─654 "postgres: idle sessions terminator "├─655 "postgres: walwriter "├─656 "postgres: autovacuum launcher "├─657 "postgres: autounite launcher "├─658 "postgres: integrity check launcher "├─659 "postgres: license checker "└─660 "postgres: logical replication launcher "....В данном случае мы видим, что сервер запущен.
-
Остановите сервер Pangolin и убедитесь в том, что он выключен:
[UserName@ServerName ~]$ sudo systemctl stop postgresql[UserName@ServerName ~]$ sudo systemctl status postgresql○ postgresql.service - Runners PostgreSQL serviceLoaded: loaded (/etc/systemd/system/postgresql.service; enabled; preset: disabled)Active: inactive (dead) since Fri 2025-03-28 07:41:54 MSK; 23s agoDuration: 18min 31.535sProcess: 572 ExecStartPre=/bin/mkdir -p /var/run/postgresql (code=exited, status=0/SUCCESS)Process: 584 ExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresql (code=exited, status=0/SUCCESS)Process: 596 ExecStart=/bin/bash -i -c /usr/pangolin-6/bin/postgres -D /pgdata/06/data (code=exited, status=0/SUCCESS)Main PID: 596 (code=exited, status=0/SUCCESS)CPU: 1.209s... -
Установите пакет
utilities/pangolin-security-utilities-6.7.0-redos8.0.x86_64.rpm:[UserName@ServerName ~]$ cd Distr/utilities/[UserName@ServerName utilities]$ ls -latotal 2108drwxr-xr-x. 3 UserName UserName 4096 Jan 26 15:22 .drwxr-xr-x. 9 UserName UserName 4096 Mar 27 13:26 ..-rw-r--r--. 1 UserName UserName 311882 Jan 26 14:46 pangolin-auth-reencrypt-6.7.0-redos8.0.x86_64.rpm-rw-r--r--. 1 UserName UserName 1039037 Jan 26 14:47 pangolin-certs-rotate-6.7.0-redos8.0.x86_64.rpm-rw-r--r--. 1 UserName UserName 360810 Jan 26 15:18 pangolin-diagnostic-tool-6.7.0-redos8.0.x86_64.rpm-rw-r--r--. 1 UserName UserName 424966 Jan 26 14:46 pangolin-security-utilities-6.7.0-redos8.0.x86_64.rpmdrwxr-xr-x. 4 UserName UserName 4096 Jan 26 14:46 secret_storage_client_bundle[UserName@ServerName utilities]$ sudo dnf -y install pangolin-security-utilities-6.7.0-redos8.0.x86_64.rpmRedOS - Base 31 kB/s | 2.3 kB 00:00RedOS - Updates 38 kB/s | 1.5 kB 00:00Last metadata expiration check: 0:00:01 ago on Thu 27 Mar 2025 05:02:19 PM MSK.Dependencies resolved.=================================================================================================================================================================================================== Package Architecture Version Repository Size===================================================================================================================================================================================================Installing:pangolin-security-utilities x86_64 6.7.0-redos8.0 @commandline 415 kTransaction Summary===================================================================================================================================================================================================Install 1 PackageTotal size: 415 kInstalled size: 2.2 MDownloading Packages:Running transaction checkTransaction check succeeded.Running transaction testTransaction test succeeded.Running transactionPreparing : 1/1Running scriptlet: pangolin-security-utilities-6.7.0-redos8.0.x86_64 1/1Installing : pangolin-security-utilities-6.7.0-redos8.0.x86_64 1/1Running scriptlet: pangolin-security-utilities-6.7.0-redos8.0.x86_64 1/1Verifying : pangolin-security-utilities-6.7.0-redos8.0.x86_64 1/1Installed:pangolin-security-utilities-6.7.0-redos8.0.x86_64Complete! -
Настройте окружение для пользователя
postgres. Для этого добавьте переменныеPGHOST,PGSSLROOTCERT,PGSSLKEY,PGSSLCERTв файл~/.bash_profileаналогично примеру ниже:[UserName@ServerName utilities]$ cd ~[UserName@ServerName ~]$ sudo vi /home/postgres/.bash_profile# .bash_profile# Get the aliases and functionsif [ -f ~/.bashrc ]; then. ~/.bashrcfi# User specific environment and startup programs# Pangolinumask 022export LD_LIBRARY_PATH=/usr/pangolin/libexport PG_PLUGINS_PATH=/usr/pangolin/libexport PGHOME=/usr/pangolinexport PGHOST=<IP-Address>export PGCLIENTENCODING=UTF8export PGDATA=/pgdata/06/dataexport PG_LICENSE_PATH=/opt/pangolin_license/export LANG=en_US.UTF-8export LC_ALL="en_US.UTF-8"export MANPATH=$MANPATH:$PGHOME/share/manexport PATH=$PATH:/usr/pangolin/binexport PGSSLROOTCERT=/pg_ssl/root.crtexport PGSSLKEY=/pg_ssl/client.keyexport PGSSLCERT=/pg_ssl/client.crtВ данном случае в последних строках мы настраиваем обращение к сертификатам и ключам, которые далее настроим, чтобы подключаться через KMS.
ПримечаниеОбратите внимание на параметр
PGHOST, в котором необходимо указать IP-адрес вашей виртуальной машины. -
Проверьте наличие сервисного файла postgresql. Если он отсутствует, создайте его со следующим содержимым:
[UserName@ServerName ~]$ sudo cat /etc/systemd/system/postgresql.service[Unit]Description=Runners PostgreSQL serviceAfter=syslog.target network.target[Service]Type=notifyEnvironment="PG_LICENSE_PATH=/opt/pangolin_license"Environment="PG_PLUGINS_PATH=/usr/pangolin-6/lib"Environment="PGCTLTIMEOUT=120"Environment="LD_LIBRARY_PATH=/usr/pangolin-6/lib"LimitNOFILE=65536# Pre-commands to start watchdog deviceUser=postgresGroup=postgresPermissionsStartOnly=trueExecStartPre=/bin/mkdir -p /var/run/postgresqlExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresqlExecReload=/bin/kill -HUP $MAINPIDWorkingDirectory=/usr/pangolin-6ExecStart=/usr/pangolin-6/bin/postgres -D /pgdata/06/dataRestart=on-failure[Install]WantedBy=multi-user.targetПосле обязательно перечитайте конфигурацию
systemd:[UserName@ServerName Distr]$ sudo systemctl daemon-reloadДля проверки наличия сервиса можно выполнить команду:
[UserName@ServerName Distr]$ sudo systemctl list-unit-files | grep postgresqlpostgresql.service enabled disabled -
Перейдем к созданию самоподписных сертификатов. Создайте директорию
pg_sslс владельцемpostgres:[UserName@ServerName ~]$ sudo mkdir /pg_ssl[UserName@ServerName ~]$ sudo chown postgres:postgres /pg_sslВ ней создайте директорию
ca_ssl, в которой будет находиться Удостоверяющий центр с корневым сертификатомroot.key:[postgres@ServerName ~]$ sudo su - postgres[postgres@ServerName ~]$ cd /pg_ssl[postgres@ServerName ~]$ mkdir ca_ssl[postgres@ServerName ~]$ cd ca_sslПодготовьте файл запроса
root.csrи закрытый ключroot.keyдля будущего сертификата:[postgres@ServerName ca_ssl]$ openssl req -new -nodes -text -out root.csr -keyout root.key -subj "/CN=ServerName"Разбор команды:
openssl reqзапускает модуль OpenSSL для работы с запросами на подпись сертификатов (X.509 Certificate Signing Request);-newуказывает, что нужно создать новый запрос;-nodes (no DES)– параметр означает, что закрытый ключ не будет зашифрован паролем. Это стандартная практика для ключей, используемых на серверах, так как сервер должен иметь возможность автоматически прочитать этот файл при запуске без ручного ввода пароля;-textвыводит содержимое создаваемого запроса в текстовом виде прямо в консоль;-out root.csrуказывает имя файла, в который будет сохранен запрос на подпись сертификата (CSR). Этот файл вы позже отправите в удостоверяющий центр (CA — Certificate Authority), чтобы получить готовый сертификат;-keyout root.keyуказывает имя файла, в который будет сохранен закрытый ключ. Этот файл должен храниться в строжайшем секрете и быть защищен от доступа посторонних. Никогда не передавайте его никому;-subj "/CN=ServerName"позволяет указать информацию о владельце сертификата прямо в командной строке, чтобы OpenSSL не запрашивал ее в интерактивном режиме./CN=...(Common Name) — это общее имя. Для SSL-сертификатов оно должно совпадать с IP-адресом сервера. В нашем случае этоServerName.
Эта команда автоматизирует процесс подготовки к получению SSL-сертификата. Она создает все необходимые начальные файлы (
root.keyиroot.csr) для сервера с именемServerName, не шифруя закрытый ключ паролем для удобства использования в автоматическом режиме.......+..+...+......+++++++++++++++++++++++++++++++++++++++*.+...+..................+.....+..........+......+...+..+......+....+.....+.+............+...+..............+....+.....+.+......+..............+.+...+.....+.........+.+...........+...+......+.+...+..................+...+..+....+...+++++++++++++++++++++++++++++++++++++++*..+.......+.....+............+...+......+.........+............+.+..+.+...........+.+...+.....+............+....++++++.......+....+.....+....+...............+..+...+.+.....+............................+...+++++++++++++++++++++++++++++++++++++++*.....+.....+.+.........+...........+++++++++++++++++++++++++++++++++++++++*..............+.....+...+.+...+........+.......+...........++++++-----Подпишите запрос
root.csrзакрытым ключомroot.key, чтобы получить готовый сертификатroot.crt:[postgres@ServerName ca_ssl]$ openssl x509 -req -in root.csr -text -days 3650 -extfile /etc/pki/tls/openssl.cnf -extensions v3_ca -signkey root.key -out root.crtРазбор команды:
openssl x509запускает модуль OpenSSL для работы с сертификатами стандарта X.509;-reqуказывает, что на вход подается запрос на подпись сертификата (Certificate Signing Request), а не уже готовый сертификат;-in root.csrпуть к файлу запроса, который был создан на предыдущем шаге. Этот файл содержит открытый ключ и информацию о сервере;-textвыводит подробную информацию о создаваемом сертификате в текстовом виде в консоль;-days 3650устанавливает срок действия сертификата. В данном случае он будет действителен в течение 3650 дней (примерно 10 лет);-extfile /etc/pki/tls/openssl.cnfуказывает путь к файлу конфигурации OpenSSL. Из этого файла будут взяты дополнительные параметры (расширения) для сертификата;-extensions v3_caуказывает конкретный раздел в файле конфигурации (openssl.cnf), который нужно использовать. Разделv3_caобычно содержит параметры, характерные для корневых (CA) или самоподписанных сертификатов;-signkey root.keyуказывает, что для подписи запроса (root.csr) нужно использовать собственный закрытый ключ (root.key), а не отправлять запрос в Удостоверяющий центр (CA);-out root.crtуказывает имя выходного файла, в который будет сохранен готовый, подписанный сертификат.
Certificate request self-signature oksubject=CN = ServerName[postgres@ServerName ca_ssl]$ cd ..Создайте директорию
cnfдля файлов конфигурации OpenSSL:[postgres@ServerName pg_ssl]$ mkdir cnf[postgres@ServerName pg_ssl]$ cd cnfСоздайте файл конфигурации OpenSSL
server.cnfдля серверного сертификата и заполните его как в примере:[postgres@ServerName cnf]$ vi server.cnf[req]req_extensions = v3_reqdistinguished_name = req_distinguished_name[req_distinguished_name][ v3_req ]basicConstraints = CA:FALSEkeyUsage = nonRepudiation, digitalSignature, keyEnciphermentsubjectAltName = @alt_names[ ssl_client ]extendedKeyUsage = clientAuth, serverAuthbasicConstraints = CA:FALSEsubjectKeyIdentifier=hashauthorityKeyIdentifier=keyid,issuersubjectAltName = @alt_names[ v3_ca ]basicConstraints = CA:TRUEkeyUsage = nonRepudiation, digitalSignature, keyEnciphermentsubjectAltName = @alt_namesauthorityKeyIdentifier=keyid:always,issuer[alt_names]DNS.1 = ServerName ## hostname with domainIP.1 = <IP-Address> ## host ip addressПримечаниеЗамените
IP.1иDNS.1(если отличается) на значения вашей виртуальной машины.Если у сервера несколько доменных имен или IP-адресов, которым должен доверять сертификат, вы можете добавить их, используя порядковые номера (
DNS.2,IP.2и так далее).Создайте файл конфигурации
postgres.cnfдля выпуска сертификата пользователяpostgresи заполните его как в примере:[postgres@ServerName cnf]$ vi postgres.cnf[req]distinguished_name = req_distinguished_nameprompt = no[req_distinguished_name]CN = postgresПроверьте наличие файлов:
[postgres@ServerName cnf]$ ls -latotal 16drwxr-xr-x. 2 UserName UserName 4096 Mar 31 13:07 .drwxr-xr-x. 5 UserName UserName 4096 Mar 31 13:05 ..-rw-r--r--. 1 UserName UserName 105 Mar 31 13:07 postgres.cnf-rw-r--r--. 1 UserName UserName 669 Mar 31 13:06 server.cnf[postgres@ServerName cnf]$ cd ..Подготовьте файлы запросов
client.csr,server.csrдля серверного сертификата СУБД Pangolin для установления клиентских подключений и клиентского сертификата пользователяpostgresсоответственно, а также ключи для них:[postgres@ServerName pg_ssl]$ openssl req -new -nodes -text -keyout client.key -out client.csr -config /pg_ssl/cnf/postgres.cnf.+.+.........+.....+.......+.....+.+...+............+.....+++++++++++++++++++++++++++++++++++++++*..+...+++++++++++++++++++++++++++++++++++++++*......+........+...+.......+.....+................+.....+.+..............+....+..+.+............+..+......+............+............+...+...+.......+.....+.+..+.........+.+...+.....+......+.+..+.......+........+......+...............+..........+..+.........+...+.+..+.......+...+...+.....+......+.+.........+......+...+..+....+.....+......+....+...........+...+.........+...............+.......+......+..+......+....+..+..........+.........+..+...+.......+..+...+...+.......+..............+.+...+..+.........+...+...+.......+........+.......+............+.........+.....+.........................+...........+.+...+......+...+..+.....................+.......+.....+.......+......+.........+.....+...+................+...........+...+.+......+...+.....+.+.....+............+...+..........++++++...+.............+..+....+..+....+......+..+.......+..............+......+.+...+.........+..+.+.........+......+.....+.......+...+..+.+......+...+.....+...............+.+..+.........+.+..+.......+........+.+.....+....+........+...+.+...+++++++++++++++++++++++++++++++++++++++*.+..+.........+.+........+.+..+............+......+.+.........+...........+....+..+..................+.+...+.....+.+.....+....+..+++++++++++++++++++++++++++++++++++++++*....+.....+....+....................+.+...+...+.....+...+....+...+...+......+...........++++++-----[postgres@ServerName pg_ssl]$ openssl req -new -nodes -text -keyout server.key -out server.csr -config /pg_ssl/cnf/server.cnf -subj "/CN=ServerName"....+.........+...+.....+++++++++++++++++++++++++++++++++++++++*.......+.+........+.......+++++++++++++++++++++++++++++++++++++++*...+...+.....+.+..+.......+...........+....+......+............+...+.....+....+...+.....+.........+......+.......+..+....+......+.....+...+..................+....+...+...+...............+........+....++++++..+......+++++++++++++++++++++++++++++++++++++++*.....+.........+.+...............+......+......+...+......+...+........+.............+.........+..+...+...+....+...+......+++++++++++++++++++++++++++++++++++++++*...............+...+....+...+........+....+.........+...........+....+.....+......+.+........+.+.....+......+...+................+........+...............+...+.........+.+........+.+..................+...+..+......+.......+...+..+.............+.........+..+.............+......+.....+.+...+...........+......+.+...+..+.......+..+.........+.+.........+...........+......+.......+..+......+....+........+.+.....+................+.....................+..+......+......+.+...+.........+........+............+.+..+.......+...+..+.+.....+.++++++-----Подпишите запросы ключом Удостоверяющего центра, чтобы получить готовые сертификаты:
[postgres@ServerName pg_ssl]$ openssl x509 -req -in server.csr -text -days 365 -CA /pg_ssl/ca_ssl/root.crt -CAkey /pg_ssl/ca_ssl/root.key -CAcreateserial -out server.crt -extfile /pg_ssl/cnf/server.cnf -extensions ssl_clientCertificate request self-signature oksubject=CN=ServerName[postgres@ServerName pg_ssl]$ openssl x509 -req -in client.csr -text -days 365 -CA /pg_ssl/ca_ssl/root.crt -CAkey /pg_ssl/ca_ssl/root.key -CAcreateserial -out client.crt -extfile /pg_ssl/cnf/postgres.cnfCertificate request self-signature oksubject=CN=postgresПроверьте наличие файлов:
[postgres@ServerName pg_ssl]$ ls -latotal 44drwxr-xr-x 4 postgres postgres 4096 Mar 31 10:28 .dr-xr-xr-x. 22 root root 4096 Mar 31 10:24 ..drwxr-xr-x 2 postgres postgres 4096 Mar 31 10:28 ca_ssl-rw-r--r-- 1 postgres postgres 4036 Mar 31 10:28 client.crt-rw-r--r-- 1 postgres postgres 3356 Mar 31 10:27 client.csr-rw------- 1 postgres postgres 1704 Mar 31 10:27 client.keydrwxr-xr-x 2 postgres postgres 4096 Mar 31 10:26 cnf-rw-r--r-- 1 postgres postgres 4422 Mar 31 10:28 server.crt-rw-r--r-- 1 postgres postgres 3726 Mar 31 10:27 server.csr-rw------- 1 postgres postgres 1704 Mar 31 10:27 server.keyСкопируйте корневой сертификат
root.crtв директориюpg_sslдля дальнейшего удобства настройки:[postgres@ServerName pg_ssl]$ cp /pg_ssl/ca_ssl/root.crt /pg_sslСУБД Pangolin в целях безопасности требует, чтобы права на закрытые ключи были ограничены:
[postgres@ServerName pg_ssl]$ chmod og-rwx /pg_ssl/*.keyПо итогу произведенных изменений для их применения нужно обязательно вызвать команду
update-ca-trust:[postgres@ServerName pg_ssl]$ exitlogout[UserName@ServerName ~]$ sudo cp /pg_ssl/root.crt /etc/pki/ca-trust/source/anchors/ && sudo update-ca-trust -
Отредактируйте параметры
ssl_ca_file,ssl_cert_file,ssl_key_file,ssl_min_protocol_versionв файле$PGDATA/postgresql.conf:# - SSL -ssl = onssl_ca_file = '/pg_ssl/root.crt'ssl_cert_file = '/pg_ssl/server.crt'#ssl_crl_file = ''#ssl_crl_dir = ''ssl_key_file = '/pg_ssl/server.key'#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers#ssl_prefer_server_ciphers = on#ssl_ecdh_curve = 'prime256v1'ssl_min_protocol_version = 'TLSv1.2'#ssl_max_protocol_version = ''#ssl_dh_params_file = ''#ssl_passphrase_command = ''#ssl_passphrase_command_supports_reload = offБолее подробно о параметрах SSL смотрите в документации.
-
Там же настройте параметры отвечающие за логирование (если вы делали задания модуля Аудит, то соответствующие значения уже должны быть установлены):
logging_collector = onlog_directory = '/pgerrorlogs/06/'log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
#------------------------------------------------------------------------------# REPORTING AND LOGGING#------------------------------------------------------------------------------# - Where to Log -#log_destination = 'stderr' # Valid values are combinations of# stderr, csvlog, jsonlog, syslog, and# eventlog, depending on platform.# csvlog and jsonlog require# logging_collector to be on.# This is used when logging to stderr:logging_collector = on # Enable capturing of stderr, jsonlog,# and csvlog into log files. Required# to be on for csvlogs and jsonlogs.# (change requires restart)# These are only used if logging_collector is on:log_directory = '/pgerrorlogs/06/' # directory where log files are written,# can be absolute or relative to PGDATAlog_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,# can include strftime() escapes#log_file_mode = 0600 # creation mode for log files,# begin with 0 to use octal notation#log_rotation_age = 1d # Automatic rotation of logfiles will# happen after that time. 0 disables.#log_rotation_size = 10MB # Automatic rotation of logfiles will# happen after that much log output.# 0 disables.#log_truncate_on_rotation = off # If on, an existing log file with the# same name as the new log file will be# truncated rather than appended to.# But such truncation only occurs on# time-driven rotation, not on restarts# or size-driven rotation. Default is# off, meaning append to existing files# in all cases. -
В файле
$PGDATA/pg_hba.confотредактируйте метод аутентификации для пользователяpostgres:[postgres@ServerName ~]$ vi $PGDATA/pg_hba.conf# TYPE DATABASE USER ADDRESS METHOD# "local" is for Unix domain socket connections onlylocal all all trust# IPv4 local connections:hostssl all postgres 127.0.0.1/32 certhostssl all postgres <IP-Address>/32 cert# IPv6 local connections:#host all all ::1/128 scram-sha-256# Allow replication connections from localhost, by a user with the# replication privilege.#local replication all scram-sha-256host replication all 127.0.0.1/32 scram-sha-256host replication all ::1/128 scram-sha-256ПримечаниеПоменяйте
<IP-Address>на значение IP-адреса вашей виртуальной машины. -
В предыдущем задании вы уже создали пользователя
kmadmin_pg, являющегося администратором безопасности.Из-под него сгенерируйте ключи с помощью утилиты
generate_encryption_key:[UserName@ServerName ~]$ sudo su - kmadmin_pg[kmadmin_pg@ServerName ~]$ cd /opt/pangolin-security-utilities/bin/[kmadmin_pgServerName bin]$ ls -latotal 792drwx------. 2 kmadmin_pg kmadmin_pg 4096 Mar 31 12:28 .drwx------. 4 kmadmin_pg kmadmin_pg 4096 Mar 31 12:28 ..-r-x------. 1 kmadmin_pg kmadmin_pg 266184 Jan 26 14:46 encrypt_params_file-r-x------. 1 kmadmin_pg kmadmin_pg 68536 Jan 26 14:46 generate_encryption_key-r--r--r--. 1 kmadmin_pg kmadmin_pg 1499 Jan 26 14:46 regid.2011-07.ru.sbertech_scrt-6.7.0.swidtag-r-x------. 1 kmadmin_pg kmadmin_pg 462832 Jan 26 14:46 setup_kms_credentials[kmadmin_pg@ServerName bin]$ ./generate_encryption_keyKey was generated successfully. Key: {ключ 1}[kmadmin_pg@ServerName bin]$ ./generate_encryption_keyKey was generated successfully. Key: {ключ 2}
Рекомендуем скопировать оба ключа, так как они понадобятся вам на следующем шаге при редактировании файлов.
-
Плагин-заменитель KMS считывает данные для пары ключ-значение из двух файлов. Первый файл
/etc/pangolin-security-utilities/kms_static_params.cfgсодержит статические параметры, второй файл/etc/pangolin-security-utilities/kms_dynamic_params.cfg– динамические. Файл со статическими параметрами защищен ключом, генерируемым из параметров сервера. Файл с динамическими параметрами может меняться.Создайте файлы со статическими и динамическими параметрами:
[kmadmin_pg@ServerName bin]$ cd /etc/pangolin-security-utilities/[kmadmin_pg@ServerName pangolin-security-utilities]$ ls -latotal 8drwxrwx---. 2 kmadmin_pg pangolin_users 4096 Jan 26 14:46 .drwxr-xr-x. 93 root root 4096 Mar 31 12:28 ..[kmadmin_pg@ServerName pangolin-security-utilities]$ vi /etc/pangolin-security-utilities/kms_static_params.cfgactual_master_key = master_key_value_00000000_000000_000actual_master_key_created = {актуальные дата и время создания мастер-ключа, например, 20250331_00000_000}master_key_value_00000000_000000_000 = {ключ 1}wal_key = {ключ 2}secret_dump_key = {ключ 2}[kmadmin_pg@ServerName pangolin-security-utilities]$ vi /etc/pangolin-security-utilities/kms_dynamic_params.cfgsecure_config = onis_tde_on = offssl = onssl_cert_file = /pg_ssl/server.crtssl_key_file = /pg_ssl/server.keyssl_ca_file = /pg_ssl/root.crtpassword_policies_enable = onpsql_encrypt_password = onpassword_encryption = scram-sha-256enabled_sec_admin_extra_auth_methods = certenabled_extra_auth_methods = cert,trust[kmadmin_pg@ServerName pangolin-security-utilities]$ chown kmadmin_pg:kmadmin_pg /etc/pangolin-security-utilities/kms_*.cfg[kmadmin_pg@ServerName pangolin-security-utilities]$ chmod a+r /etc/pangolin-security-utilities/kms*ПримечаниеЕсли файлы
/etc/pangolin-security-utilities/kms_static_params.cfgи/etc/pangolin-security-utilities/kms_dynamic_params.cfgне обнаружены или имеют некорректный формат, система будет считать, что используется реальный KMS, но учетные данные для подключения к нему не найдены. Именно поэтому первое, что стоит сделать при получении ошибок в рамках запуска сервера – это очистить папку с данными конфигурационными файлами и выполнить данный шаг заново.ПримечаниеВ данном случае такие права выданы для упрощения дальнейшей работы. В промышленной среде права на доступ к чувствительной информации должны ограничиваться.
-
Закодируйте файл со статическими параметрами утилитой
encrypt_params_file:[kmadmin_pg@ServerName pangolin-security-utilities]$ cd /opt/pangolin-security-utilities/bin[kmadmin_pg@ServerName bin]$ ./encrypt_params_fileStart to encrypt file: /etc/pangolin-security-utilities/kms_static_params.cfgFile /etc/pangolin-security-utilities/kms_static_params.cfg was encrypted successfully[kmadmin_pg@ServerName bin]$ cat /etc/pangolin-security-utilities/kms_static_params.cfg����V��p��Ʉ��͗������Q�O���^����<��R�t_5_���Rs�W��kmS��H��~�OGֻb+5��{<v�,�8�:(�Vn�C�s�kߍ�Ɋ���{��^�><���%i�!ό9������z?�`���.5�鏰H�c\7��c�C>�#�C�d���۳~��9��(Перед следующим шагом убедитесь, что права на конфигурационные файлы настроены следующим образом:
[kmadmin_pg@ServerName bin]$ ls -la /etc/pangolin-security-utilities/-rw-r--r-- 1 kmadmin_pg kmadmin_pg 326 Sep 16 10:14 kms_dynamic_params.cfg-rw-r--r-- 1 kmadmin_pg kmadmin_pg 264 Sep 16 10:15 kms_static_params.cfg -
Запустите утилиту
setup_kms_credentials(на приглашение ввести пароль можно ввести любой пароль, напримерqwerty):[kmadmin_pg@ServerName bin]$ ./setup_kms_credentials -c clustername -h 0.0.0.0 -p 8200 -u postgresql -t 1 -i adminencryption --no-checkПримечаниеВ случае ошибки доступа к лицензии, поменяйте права:
[UserName@ServerName ~]$ sudo chown -R postgres:pangolin_users /opt/pangolin_licenseEnter password:******Confirm password:******Credentials for Secret storage has been set successfullyТеперь у вас сгенерировался файл с настройками KMS
enc_connection_settings.cfg:[kmadmin_pg@ServerName bin]$ ls -la /etc/pangolin-security-utilitiestotal 28drwxrwx--- 2 kmadmin_pg pangolin_users 4096 Sep 9 11:44 .drwxr-xr-x. 114 root root 12288 Sep 8 11:57 ..-rw-r----- 1 kmadmin_pg pangolin_users 312 Sep 9 11:36 enc_connection_settings.cfg-rw-r----- 1 kmadmin_pg kmadmin_pg 326 Sep 9 11:44 kms_dynamic_params.cfg-rw-r----- 1 kmadmin_pg kmadmin_pg 264 Sep 9 11:33 kms_static_params.cfg[kmadmin_pg@ServerName bin]$ exitlogout -
Включите KMS-заменитель. Для этого необходимо создать символьную ссылку из-под пользователя
postgresна библиотеку/usr/pangolin/lib/plugins/libkms_substitute_plugin.so:[UserName@ServerName ~]$ sudo su - postgres[postgres@ServerName ~]$ cd /usr/pangolin/lib[postgres@ServerName lib]$ ls -la | grep libconnectorlrwxrwxrwx. 1 root root 44 Apr 1 14:48 libconnector_plugin.so -> /usr/pangolin/lib/plugins/libvault_plugin.so[postgres@ServerName lib]$ rm /usr/pangolin/lib/libconnector_plugin.so[postgres@ServerName lib]$ ln -s /usr/pangolin/lib/plugins/libkms_substitute_plugin.so /usr/pangolin/lib/libconnector_plugin.so -
Запустите сервер Pangolin:
[UserName@ServerName lib]$ sudo systemctl start postgresql[UserName@ServerName lib]$ sudo systemctl status postgresql● postgresql.service - Runners PostgreSQL serviceLoaded: loaded (/etc/systemd/system/postgresql.service; enabled; preset: disabled)Active: active (running) since Mon 2025-03-31 16:08:21 MSK; 8s agoProcess: 2456 ExecStartPre=/bin/mkdir -p /var/run/postgresql (code=exited, status=0/SUCCESS)Process: 2457 ExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresql (code=exited, status=0/SUCCESS)Main PID: 2458 (postgres)Tasks: 11 (limit: 9499)Memory: 30.9MCPU: 406msCGroup: /system.slice/postgresql.service├─2458 /usr/pangolin-6/bin/postgres -D /pgdata/06/data├─2475 "postgres: checkpointer "├─2476 "postgres: background writer "├─2478 "postgres: idle sessions terminator "├─2479 "postgres: walwriter "├─2480 "postgres: autovacuum launcher "├─2481 "postgres: autounite launcher "├─2482 "postgres: integrity check launcher "├─2483 "postgres: license checker "├─2484 "postgres: password policy cache "└─2485 "postgres: logical replication launcher "Mar 31 16:08:21 ServerName bash[2458]: 2025-03-31 16:08:21.319 MSK [2458] LOG: listening on IPv6 address "::", port 5432Mar 31 16:08:21 ServerName bash[2458]: 2025-03-31 16:08:21.328 MSK [2458] LOG: listening on Unix socket "/tmp/.s.PGSQL.5432"Mar 31 16:08:21 ServerName bash[2458]: 2025-03-31 16:08:21.336 MSK [2458] LOG: could not open usermap file "/pgdata/06/data/pg_ident. conf": SuccessMar 31 16:08:21 ServerName bash[2477]: 2025-03-31 16:08:21.351 MSK [2477] LOG: database system was shut down at 2025-03-31 15:46:31 MSKMar 31 16:08:21 ServerName bash[2478]: 2025-03-31 16:08:21.353 MSK [2478] LOG: idle terminator startedMar 31 16:08:21 ServerName bash[2482]: 2025-03-31 16:08:21.398 MSK [2458] LOG: Start integrity check launcherMar 31 16:08:21 ServerName bash[2482]: 2025-03-31 16:08:21.401 MSK [2482] LOG: Start of integrity checkMar 31 16:08:21 ServerName bash[2483]: 2025-03-31 16:08:21.402 MSK [2483] LOG: License checker startedMar 31 16:08:21 ServerName bash[2458]: 2025-03-31 16:08:21.405 MSK [2458] LOG: database system is ready to accept connectionsMar 31 16:08:21 ServerName systemd[1]: Started postgresql.service - Runners PostgreSQL service.Как быть, если что-то падает с ошибкой?..
Ключи генерируются и далее кодируются с учетом специфики конфигурации, в которой вы работаете. Поэтому, в иных условиях настроенный образ ОС может не запуститься. Тогда достаточно пересоздать конфигурационные
*.cfg-файлы в папкеcd /etc/pangolin-security-utilities/.-
Удалите файлы командой:
[kmadmin_pg@ServerName pangolin-security-utilities]$ rm -rf * -
Последовательно выполните шаги, начиная с 11.
-
-
Проверьте, что KMS включен:
[postgres@ServerName lib]$ psqlPager is used for long output.Border style is 2.Line style is unicode.psql (15.5)SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)Type "help" for help.postgres@postgres=# SELECT check_kms_is_on();┌─────────────────┐│ check_kms_is_on │├─────────────────┤│ t │└─────────────────┘(1 row)В системном журнале можно увидеть сообщения о запуске КМС сервера:
[postgres@ServerName lib]$ ls -la /pgerrorlogs/06total 12drwxr-xr-x. 2 postgres postgres 4096 Mar 31 16:50 .drwxr-xr-x. 3 root root 4096 Mar 27 13:32 ..-rw-------. 1 postgres postgres 1202 Mar 31 16:50 postgresql-2025-03-31_165008.log[UserName@ServerName ~]$ sudo journalctl --since "2025-03-31 16:50:00" --until "2025-03-31 16:55:00"Mar 31 16:50:08 ServerName systemd [1]: Starting postgresql.service - Runners PostgreSQL service...Mar 31 16:50:08 ServerName bash[3057]: bash: cannot set terminal process group (-1): Inappropriate ioctl for deviceMar 31 16:50:08 ServerName bash[3057]: bash: no job control in this shellMar 31 16:50:08 ServerName bash[3057]: 2025-03-31 16:50:08.682 MSK [3057] LOG: License type is "Trial"Mar 31 16:50:08 ServerName bash[3057]: 2025-03-31 16:50:08.682 MSK [3057] LOG: Licensee is "Trial license for 3 months"Mar 31 16:50:08 ServerName bash[3057]: 2025-03-31 16:50:08.682 MSK [3057] LOG: License expire date is "2025-05-31 23:59:59.682742+03"Mar 31 16:50:08 ServerName bash[3057]: 2025-03-31 16:50:08.682 MSK [3057] LOG: License CPUs number allowed: unrestrictedMar 31 16:50:08 ServerName bash[3057]: 2025-03-31 16:50:08.682 MSK [3057] LOG: License allowed memory in bytes: unrestrictedMar 31 16:50:08 ServerName bash[3057]: 2025-03-31 16:50:08.720 MSK [3057] LOG: Cluster ID is 'clustername'Mar 31 16:50:08 ServerName bash[3057]: 2025-03-31 16:50:08.744 MSK [3057] LOG: The initialization of KMS substitute completed successfully.
А что дальше?..
Теперь, при необходимости поставить или изменить настроечные параметры, управляемые администраторами безопасности, необходимо:
- Остановить сервер.
- Добавить этот параметр в файл
/etc/pangolin-security-utilities/kms_dynamic_params.cfg. - Запустить сервер.
Список таких параметров представлен в документации. Изменение параметров в конфигурационном файле postgresql.conf будут игнорироваться.