Перейти к основному содержимому

Задание 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-заменителя​

  1. Настройка KMS должна производиться при остановленном сервере Pangolin:

    [UserName@ServerName ~]$ sudo systemctl status postgresql
    ● postgresql.service - Runners PostgreSQL service
    Loaded: loaded (/etc/systemd/system/postgresql.service; enabled; preset: disabled)
    Active: active (running) since Fri 2025-03-28 07:23:22 MSK; 18min ago
    Process: 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.4M
    CPU: 1.177s
    CGroup: /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 "
    ....

    В данном случае мы видим, что сервер запущен.

  2. Остановите сервер Pangolin и убедитесь в том, что он выключен:

    [UserName@ServerName ~]$ sudo systemctl stop postgresql
    [UserName@ServerName ~]$ sudo systemctl status postgresql
    ○ postgresql.service - Runners PostgreSQL service
    Loaded: loaded (/etc/systemd/system/postgresql.service; enabled; preset: disabled)
    Active: inactive (dead) since Fri 2025-03-28 07:41:54 MSK; 23s ago
    Duration: 18min 31.535s
    Process: 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
    ...
  3. Установите пакет utilities/pangolin-security-utilities-6.7.0-redos8.0.x86_64.rpm:

    [UserName@ServerName ~]$ cd Distr/utilities/
    [UserName@ServerName utilities]$ ls -la
    total 2108
    drwxr-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.rpm
    drwxr-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.rpm
    RedOS - Base 31 kB/s | 2.3 kB 00:00
    RedOS - Updates 38 kB/s | 1.5 kB 00:00
    Last 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 k

    Transaction Summary
    ===================================================================================================================================================================================================Install 1 Package

    Total size: 415 k
    Installed size: 2.2 M
    Downloading Packages:
    Running transaction check
    Transaction check succeeded.
    Running transaction test
    Transaction test succeeded.
    Running transaction
    Preparing : 1/1
    Running scriptlet: pangolin-security-utilities-6.7.0-redos8.0.x86_64 1/1
    Installing : pangolin-security-utilities-6.7.0-redos8.0.x86_64 1/1
    Running scriptlet: pangolin-security-utilities-6.7.0-redos8.0.x86_64 1/1
    Verifying : pangolin-security-utilities-6.7.0-redos8.0.x86_64 1/1

    Installed:
    pangolin-security-utilities-6.7.0-redos8.0.x86_64

    Complete!
  4. Настройте окружение для пользователя 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 functions
    if [ -f ~/.bashrc ]; then
    . ~/.bashrc
    fi

    # User specific environment and startup programs
    # Pangolin
    umask 022
    export LD_LIBRARY_PATH=/usr/pangolin/lib
    export PG_PLUGINS_PATH=/usr/pangolin/lib
    export PGHOME=/usr/pangolin
    export PGHOST=<IP-Address>
    export PGCLIENTENCODING=UTF8
    export PGDATA=/pgdata/06/data
    export PG_LICENSE_PATH=/opt/pangolin_license/
    export LANG=en_US.UTF-8
    export LC_ALL="en_US.UTF-8"
    export MANPATH=$MANPATH:$PGHOME/share/man
    export PATH=$PATH:/usr/pangolin/bin
    export PGSSLROOTCERT=/pg_ssl/root.crt
    export PGSSLKEY=/pg_ssl/client.key
    export PGSSLCERT=/pg_ssl/client.crt

    В данном случае в последних строках мы настраиваем обращение к сертификатам и ключам, которые далее настроим, чтобы подключаться через KMS.

    Примечание

    Обратите внимание на параметр PGHOST, в котором необходимо указать IP-адрес вашей виртуальной машины.

  5. Проверьте наличие сервисного файла postgresql. Если он отсутствует, создайте его со следующим содержимым:

    [UserName@ServerName ~]$ sudo cat /etc/systemd/system/postgresql.service
    [Unit]
    Description=Runners PostgreSQL service
    After=syslog.target network.target
    [Service]
    Type=notify
    Environment="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 device
    User=postgres
    Group=postgres
    PermissionsStartOnly=true
    ExecStartPre=/bin/mkdir -p /var/run/postgresql
    ExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresql
    ExecReload=/bin/kill -HUP $MAINPID
    WorkingDirectory=/usr/pangolin-6
    ExecStart=/usr/pangolin-6/bin/postgres -D /pgdata/06/data
    Restart=on-failure
    [Install]
    WantedBy=multi-user.target

    После обязательно перечитайте конфигурацию systemd:

    [UserName@ServerName Distr]$ sudo systemctl daemon-reload

    Для проверки наличия сервиса можно выполнить команду:

    [UserName@ServerName Distr]$ sudo systemctl list-unit-files | grep postgresql
    postgresql.service enabled disabled
  6. Перейдем к созданию самоподписных сертификатов. Создайте директорию 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 ok
    subject=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_req
    distinguished_name = req_distinguished_name
    [req_distinguished_name]
    [ v3_req ]
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    subjectAltName = @alt_names
    [ ssl_client ]
    extendedKeyUsage = clientAuth, serverAuth
    basicConstraints = CA:FALSE
    subjectKeyIdentifier=hash
    authorityKeyIdentifier=keyid,issuer
    subjectAltName = @alt_names
    [ v3_ca ]
    basicConstraints = CA:TRUE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    subjectAltName = @alt_names
    authorityKeyIdentifier=keyid:always,issuer
    [alt_names]
    DNS.1 = ServerName ## hostname with domain
    IP.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_name
    prompt = no

    [req_distinguished_name]
    CN = postgres

    Проверьте наличие файлов:

    [postgres@ServerName cnf]$ ls -la
    total 16
    drwxr-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_client
    Certificate request self-signature ok
    subject=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.cnf
    Certificate request self-signature ok
    subject=CN=postgres

    Проверьте наличие файлов:

    [postgres@ServerName pg_ssl]$ ls -la
    total 44
    drwxr-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.key
    drwxr-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]$ exit
    logout
    [UserName@ServerName ~]$ sudo cp /pg_ssl/root.crt /etc/pki/ca-trust/source/anchors/ && sudo update-ca-trust
  7. Отредактируйте параметры ssl_ca_file, ssl_cert_file, ssl_key_file, ssl_min_protocol_version в файле $PGDATA/postgresql.conf:

    # - SSL -

    ssl = on
    ssl_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 смотрите в документации.

  8. Там же настройте параметры отвечающие за логирование (если вы делали задания модуля Аудит, то соответствующие значения уже должны быть установлены):

    • logging_collector = on
    • log_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 PGDATA
    log_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.
  9. В файле $PGDATA/pg_hba.conf отредактируйте метод аутентификации для пользователя postgres:

    [postgres@ServerName ~]$ vi $PGDATA/pg_hba.conf
    # TYPE DATABASE USER ADDRESS METHOD

    # "local" is for Unix domain socket connections only
    local all all trust
    # IPv4 local connections:
    hostssl all postgres 127.0.0.1/32 cert
    hostssl 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-256
    host replication all 127.0.0.1/32 scram-sha-256
    host replication all ::1/128 scram-sha-256
    Примечание

    Поменяйте <IP-Address> на значение IP-адреса вашей виртуальной машины.

  10. В предыдущем задании вы уже создали пользователя kmadmin_pg, являющегося администратором безопасности.

    Из-под него сгенерируйте ключи с помощью утилиты generate_encryption_key:

    [UserName@ServerName ~]$ sudo su - kmadmin_pg
    [kmadmin_pg@ServerName ~]$ cd /opt/pangolin-security-utilities/bin/
    [kmadmin_pgServerName bin]$ ls -la
    total 792
    drwx------. 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_key
    Key was generated successfully. Key: {ключ 1}
    [kmadmin_pg@ServerName bin]$ ./generate_encryption_key
    Key was generated successfully. Key: {ключ 2}

Рекомендуем скопировать оба ключа, так как они понадобятся вам на следующем шаге при редактировании файлов.

  1. Плагин-заменитель 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 -la
    total 8
    drwxrwx---. 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.cfg
    actual_master_key = master_key_value_00000000_000000_000
    actual_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.cfg
    secure_config = on
    is_tde_on = off
    ssl = on
    ssl_cert_file = /pg_ssl/server.crt
    ssl_key_file = /pg_ssl/server.key
    ssl_ca_file = /pg_ssl/root.crt
    password_policies_enable = on
    psql_encrypt_password = on
    password_encryption = scram-sha-256
    enabled_sec_admin_extra_auth_methods = cert
    enabled_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, но учетные данные для подключения к нему не найдены. Именно поэтому первое, что стоит сделать при получении ошибок в рамках запуска сервера – это очистить папку с данными конфигурационными файлами и выполнить данный шаг заново.

    Примечание

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

  2. Закодируйте файл со статическими параметрами утилитой encrypt_params_file:

    [kmadmin_pg@ServerName pangolin-security-utilities]$ cd /opt/pangolin-security-utilities/bin
    [kmadmin_pg@ServerName bin]$ ./encrypt_params_file
    Start to encrypt file: /etc/pangolin-security-utilities/kms_static_params.cfg
    File /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
  3. Запустите утилиту 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_license
    Enter 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-utilities
    total 28
    drwxrwx--- 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]$ exit
    logout
  4. Включите 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 libconnector
    lrwxrwxrwx. 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
  5. Запустите сервер Pangolin:

    [UserName@ServerName lib]$ sudo systemctl start postgresql
    [UserName@ServerName lib]$ sudo systemctl status postgresql
    ● postgresql.service - Runners PostgreSQL service
    Loaded: loaded (/etc/systemd/system/postgresql.service; enabled; preset: disabled)
    Active: active (running) since Mon 2025-03-31 16:08:21 MSK; 8s ago
    Process: 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.9M
    CPU: 406ms
    CGroup: /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 5432
    Mar 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": Success
    Mar 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 MSK
    Mar 31 16:08:21 ServerName bash[2478]: 2025-03-31 16:08:21.353 MSK [2478] LOG: idle terminator started
    Mar 31 16:08:21 ServerName bash[2482]: 2025-03-31 16:08:21.398 MSK [2458] LOG: Start integrity check launcher
    Mar 31 16:08:21 ServerName bash[2482]: 2025-03-31 16:08:21.401 MSK [2482] LOG: Start of integrity check
    Mar 31 16:08:21 ServerName bash[2483]: 2025-03-31 16:08:21.402 MSK [2483] LOG: License checker started
    Mar 31 16:08:21 ServerName bash[2458]: 2025-03-31 16:08:21.405 MSK [2458] LOG: database system is ready to accept connections
    Mar 31 16:08:21 ServerName systemd[1]: Started postgresql.service - Runners PostgreSQL service.
    Как быть, если что-то падает с ошибкой?..

    Ключи генерируются и далее кодируются с учетом специфики конфигурации, в которой вы работаете. Поэтому, в иных условиях настроенный образ ОС может не запуститься. Тогда достаточно пересоздать конфигурационные *.cfg-файлы в папке cd /etc/pangolin-security-utilities/.

    1. Удалите файлы командой:

      [kmadmin_pg@ServerName pangolin-security-utilities]$ rm -rf *
    2. Последовательно выполните шаги, начиная с 11.

  6. Проверьте, что KMS включен:

    [postgres@ServerName lib]$ psql
    Pager 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/06
    total 12
    drwxr-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 device
    Mar 31 16:50:08 ServerName bash[3057]: bash: no job control in this shell
    Mar 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: unrestricted
    Mar 31 16:50:08 ServerName bash[3057]: 2025-03-31 16:50:08.682 MSK [3057] LOG: License allowed memory in bytes: unrestricted
    Mar 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.
А что дальше?..

Теперь, при необходимости поставить или изменить настроечные параметры, управляемые администраторами безопасности, необходимо:

  1. Остановить сервер.
  2. Добавить этот параметр в файл /etc/pangolin-security-utilities/kms_dynamic_params.cfg.
  3. Запустить сервер.

Список таких параметров представлен в документации. Изменение параметров в конфигурационном файле postgresql.conf будут игнорироваться.

Подведем итоги​

Вопрос 1

Выберите корректное утверждение: