‘TLS connections’

説明

TLSサーバーは、リモートホストへのプロトコル接続にSSHを使用する代替手段です。

2.37 リリースからサポートされています。

このセクションでは、 Use Case 2 で説明されているような専用リポジトリホストからpgBackRestを実行するために使用される構成を調べますが、SSH接続ではなくTLSを使用します。

リポジトリホストが backup-srv と呼ばれる デモ クラスター(Rocky Linux 8で EDBPostgresAdvancedServer バージョン14を使用)をセットアップし、_Streaming Replication_の3つのPostgresノード: pg1-srv 、 pg2-srv 、 pg3-srv 。

リポジトリホストで専用ユーザーを作成する

pgbackrest ユーザーは、バックアップとアーカイブのリポジトリを所有するために作成されます。すべてのユーザーがリポジトリを所有できますが、混乱を避けるために postgres または enterprisedb を使用しないことをお勧めします。

backup-srv にユーザーとリポジトリの場所を作成します。

$ sudo groupadd pgbackrest
$ sudo adduser -g pgbackrest -n pgbackrest
$ sudo chown pgbackrest: /var/log/pgbackrest
リポジトリは、バックアップサーバーから到達可能である必要があります。

first use case で説明されているさまざまなサポートされているタイプにあります。

たとえば、バックアップとアーカイブをローカルに保存する /backup_space を作成しましょう。

$ sudo mkdir /backup_space
$ sudo chown pgbackrest: /backup_space

証明書の生成

TLSサーバーの実装は証明書に依存しています。

この例では、 * 独自のルート認証局(CA)を作成します。 * Postgresノードとバックアップサーバーのキーと証明書を生成します。

$ mkdir certs && cd certs
$ openssl req -new -x509 -days 365 -nodes -out ca.crt -keyout ca.key -subj "/CN=root-ca"
$ openssl req -new -nodes -out backup-srv.csr -keyout backup-srv.key -subj "/CN=backup-srv"
$ openssl req -new -nodes -out pg1-srv.csr -keyout pg1-srv.key -subj "/CN=pg1-srv"
$ openssl req -new -nodes -out pg2-srv.csr -keyout pg2-srv.key -subj "/CN=pg2-srv"
$ openssl req -new -nodes -out pg3-srv.csr -keyout pg3-srv.key -subj "/CN=pg3-srv"
$ openssl x509 -req -in backup-srv.csr -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -out backup-srv.crt
$ openssl x509 -req -in pg1-srv.csr -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -out pg1-srv.crt
$ openssl x509 -req -in pg2-srv.csr -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -out pg2-srv.crt
$ openssl x509 -req -in pg3-srv.csr -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -out pg3-srv.crt
$ rm *.csr

次に、各サーバーに展開する必要があります(ca.crt + server_name.crt + server_name.key )。

これは、ホスト間の共有フォルダーを使用した例です。

#  on backup-srv

$ sudo -u pgbackrest mkdir ~pgbackrest/certs
$ sudo cp `hostname`.* ~pgbackrest/certs
$ sudo cp ca.crt ~pgbackrest/certs
$ sudo chown -R pgbackrest: ~pgbackrest/certs
$ sudo chmod -R og-rwx ~pgbackrest/certs

#  on pg1-srv, pg2-srv and pg3-srv

$ sudo -u enterprisedb mkdir ~enterprisedb/certs
$ sudo cp `hostname`.* ~enterprisedb/certs
$ sudo cp ca.crt ~enterprisedb/certs
$ sudo chown -R enterprisedb: ~enterprisedb/certs
$ sudo chmod -R og-rwx ~enterprisedb/certs

構成

demo というスタンザの構成を準備します。

backup-srv pgBackRest構成ファイルを更新します。

#  /etc/pgbackrest.conf

[global]
#  repo details

repo1-path=/backup_space
repo1-retention-full=2

#  general options

process-max=2
log-level-console=info
log-level-file=debug
start-fast=y
delta=y

#  tls server options

tls-server-address=*
tls-server-cert-file=/home/pgbackrest/certs/backup-srv.crt
tls-server-key-file=/home/pgbackrest/certs/backup-srv.key
tls-server-ca-file=/home/pgbackrest/certs/ca.crt
tls-server-auth=pg1-srv=demo
tls-server-auth=pg2-srv=demo
tls-server-auth=pg3-srv=demo

[demo]
pg1-host=pg1-srv
pg1-host-user=enterprisedb
pg1-path=/var/lib/edb/as14/data
pg1-host-type=tls
pg1-host-cert-file=certs/backup-srv.crt
pg1-host-key-file=certs/backup-srv.key
pg1-host-ca-file=certs/ca.crt

pg1-srv 、 pg2-srv 、および pg3-srv pgBackRest構成ファイルを更新します。

#  /etc/pgbackrest.conf

[global]
repo1-host=backup-srv
repo1-host-user=pgbackrest
repo1-host-type=tls
repo1-host-cert-file=/var/lib/edb/certs/pg1-srv.crt
repo1-host-key-file=/var/lib/edb/certs/pg1-srv.key
repo1-host-ca-file=/var/lib/edb/certs/ca.crt

#  general options

process-max=2
log-level-console=info
log-level-file=debug

#  tls server options

tls-server-address=*
tls-server-cert-file=/var/lib/edb/certs/pg1-srv.crt
tls-server-key-file=/var/lib/edb/certs/pg1-srv.key
tls-server-ca-file=/var/lib/edb/certs/ca.crt
tls-server-auth=backup-srv=demo

[demo]
pg1-path=/var/lib/edb/as14/data
pg1-user=enterprisedb
pg1-port=5444

(注:明らかに、 pg2-srv の_pg2-srv_と pg3-srv の_pg3-srv_を調整します。)

クライアントは、証明書を検証し、証明書のCN(Common Name)をtls-server-auth で構成されたサーバー上のリストと照合することにより、サーバーで承認されます。 tls-server-auth オプションを繰り返すことで、必要な数のスタンザに対して、または tls-server-auth=* を指定することにより、すべてのスタンザに対してCNを承認できます。

アイデアは、各ホストでTLSサーバーを実行して、他のホストからの要求を処理することです。例では、リポジトリーホストで実行されている backup コマンドは、Postgresノードで実行されているTLSサーバーのクライアントとして機能します。 Postgresノードで実行されているarchive-push コマンドは、リポジトリーホストで実行されているTLSサーバーのクライアントとして機能します。

EDB Postgres Advanced Server コマンドを使用してTLSサーバーを起動でき、SIGINTシグナル(Control+C)で終了するまで実行されます。

PGDGパッケージでまだ行われていない場合は、 backup-srv サーバーでサービスファイルを作成します。

#  /etc/systemd/system/pgbackrest.service

[Unit]
Description=pgBackRest Server
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
User=pgbackrest
Restart=always
RestartSec=1
ExecStart=/usr/bin/pgbackrest server
ExecStartPost=/bin/sleep 3
ExecStartPost=/bin/bash -c "[ ! -z $MAINPID ]"
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

サーバーを起動して、実行されていることを確認します。

$ sudo systemctl daemon-reload
$ sudo systemctl enable pgbackrest
$ sudo systemctl start pgbackrest
$ pgbackrest server-ping

server-ping コマンドは、認証が試行されないため、生存確認としてのみ機能します。

tls-* の構成を変更した場合は、プロセスを終了/再起動することを忘れないでください。

次に、この構成を使用して、 pg1-srv 、 pg2-srv 、および pg3-srv で同じ手順(サービスの構成とスタート)を適用します。

#  /etc/systemd/system/pgbackrest.service

[Unit]
Description=pgBackRest Server
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
User=enterprisedb
Restart=always
RestartSec=1
ExecStart=/usr/bin/pgbackrest server
ExecStartPost=/bin/sleep 3
ExecStartPost=/bin/bash -c "[ ! -z $MAINPID ]"
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

次に、 postgresql.conf ファイル( pg1-srv )でPostgresアーカイブを構成しましょう。

listen_addresses = *
archive_mode = on
archive_command = pgbackrest --stanza=demo archive-push %p

これらの変更を加えた後、バックアップを実行する前に、Postgresインスタンスを再起動する必要があります。

最後にスタンザを作成し、 backup-srv で構成を確認しましょう。

$ sudo -iu pgbackrest pgbackrest --stanza=demo stanza-create
...
P00   INFO: stanza-create command end: completed successfully

$ sudo -iu pgbackrest pgbackrest --stanza=demo check
...
P00   INFO: check command end: completed successfully

バックアップを実行する

すべてが正常に動作している場合、最初のバックアップを作成できます。

$ sudo -iu pgbackrest pgbackrest --stanza=demo --type=full backup
P00   INFO: backup command begin 2.38: ..
P00   INFO: execute non-exclusive pg_start_backup(): backup begins after the requested
                                                              immediate checkpoint completes
P00   INFO: backup start archive = 000000010000000000000004, lsn = 0/4000060
P00   INFO: check archive for prior segment 000000010000000000000003
P00   INFO: execute non-exclusive pg_stop_backup() and wait for all WAL segments to archive
P00   INFO: backup stop archive = 000000010000000000000004, lsn = 0/4000138
P00   INFO: check archive for segment(s) 000000010000000000000004:000000010000000000000004
P00   INFO: new backup label = 20220308-143110F
P00   INFO: full backup size = 56.5MB, file total = 1691
P00   INFO: backup command end: completed successfully

info コマンドは、 pgBackRestが正しく構成されている任意のサーバーから実行できます。

#  From the Postgres node

$ sudo -iu enterprisedb pgbackrest --stanza=demo info
stanza: demo
    status: ok
    cipher: none

    db (current)
        wal archive min/max (14): 000000010000000000000002/000000010000000000000004

        full backup: 20220308-143110F
            timestamp start/stop: 2022-03-08 14:31:10 / 2022-03-08 14:31:20
            wal start/stop: 000000010000000000000004 / 000000010000000000000004
            database size: 56.5MB, database backup size: 56.5MB
            repo1: backup set size: 9.1MB, backup size: 9.1MB

#  From the backup server

$ sudo -iu pgbackrest pgbackrest --stanza=demo info
stanza: demo
    status: ok
    cipher: none

    db (current)
        wal archive min/max (14): 000000010000000000000002/000000010000000000000004

        full backup: 20220308-143110F
            timestamp start/stop: 2022-03-08 14:31:10 / 2022-03-08 14:31:20
            wal start/stop: 000000010000000000000004 / 000000010000000000000004
            database size: 56.5MB, database backup size: 56.5MB
            repo1: backup set size: 9.1MB, backup size: 9.1MB

ストリーミングレプリケーション用にサーバーを準備する

pg1-srv で、レプリケーション用の特定のユーザーを作成します。

$ sudo -iu enterprisedb psql -d postgres
postgres=# CREATE ROLE replic_user WITH LOGIN REPLICATION PASSWORD mypwd;

pg_hba.conf を構成します。

host   replication   replic_user   pg2-srv   scram-sha-256
host   replication   replic_user   pg3-srv   scram-sha-256

構成をリロードします。

$ sudo systemctl reload edb-as-14.service

pg2-srv および pg3-srv で~enterprisedb/.pgpass を構成します。

$ sudo -iu enterprisedb
$ echo "*:*:replication:replic_user:mypwd" >> ~enterprisedb/.pgpass
$ chown enterprisedb: ~enterprisedb/.pgpass
$ chmod 0600 ~enterprisedb/.pgpass

スタンバイサーバーをセットアップする

pg2-srv と pg3-srv で /etc/pgbackrest.conf を調整して、

recovery-option を追加します。アイデアは、restoreコマンドで_Streaming

Replication_接続文字列を自動的に構成することです。

recovery-option=primary_conninfo=host=pg1-srv user=replic_user

次に、 info コマンドを実行して、構成が正しいことを確認します。上記と同じ出力が出力されます。

pg2-srv および pg3-srv で pg1-srv サーバーから取得したバックアップを復元します。

$ sudo -iu enterprisedb pgbackrest --stanza=demo --type=standby restore
P00   INFO: restore command begin 2.38: ...
P00   INFO: repo1: restore backup set 20220308-143110F, recovery will start at ...
P00   INFO: write updated /var/lib/edb/as14/data/postgresql.auto.conf
P00   INFO: restore global/pg_control
(performed last to ensure aborted restores cannot be started)
P00   INFO: restore size = 56.5MB, file total = 1691
P00   INFO: restore command end: completed successfully

復元すると、postgresql.auto.conf ファイルに情報が追加されます。

#  Recovery settings generated by pgBackRest restore on ...

primary_conninfo = host=pg1-srv user=replic_user
restore_command = pgbackrest --stanza=demo archive-get %f "%p"

--type=standby オプションは、Postgresがスタンバイモードで起動するために必要なstandby.signal を作成します。あとはPostgresインスタンスを起動するだけです。

$ sudo systemctl enable edb-as-14.service
$ sudo systemctl start edb-as-14.service

レプリケーション設定が正しい場合、 pg1-srv サーバーでこれらのプロセスが表示されます。

$ sudo -u enterprisedb ps -o pid,cmd fx
    PID CMD
  30594 /usr/edb/as14/bin/edb-postmaster -D /var/lib/edb/as14/data
  ...
  31436  \_ postgres: walsender replic_user ... streaming 0/5001FB0
  31439  \_ postgres: walsender replic_user ... streaming 0/5001FB0
  30222 /usr/bin/pgbackrest server

これで、セーフティネットとして_ストリーミングレプリケーション_とアーカイブリカバリを使用する3ノードクラスターができました。

スタンバイサーバーからバックアップを取る

backup-srv のpgBackRest構成ファイルの[demo] スタンザセクションに、次の設定を追加します。

pg2-host=pg2-srv
pg2-host-user=enterprisedb
pg2-path=/var/lib/edb/as14/data
pg2-host-type=tls
pg2-host-cert-file=certs/backup-srv.crt
pg2-host-key-file=certs/backup-srv.key
pg2-host-ca-file=certs/ca.crt
pg3-host=pg3-srv
pg3-host-user=enterprisedb
pg3-path=/var/lib/edb/as14/data
pg3-host-type=tls
pg3-host-cert-file=certs/backup-srv.crt
pg3-host-key-file=certs/backup-srv.key
pg3-host-ca-file=certs/ca.crt
backup-standby=y

次に、構成で見つかった最初のスタンバイサーバーからデータを取得してバックアップを実行します。

$  sudo -iu pgbackrest pgbackrest --stanza=demo --type=full backup
P00   INFO: backup command begin 2.38: ...
P00   INFO: execute non-exclusive pg_start_backup(): backup begins after the requested
                                                             immediate checkpoint completes
P00   INFO: backup start archive = 000000010000000000000006, lsn = 0/6000028
P00   INFO: wait for replay on the standby to reach 0/6000028
P00   INFO: replay on the standby reached 0/6000028
P00   INFO: check archive for prior segment 000000010000000000000005
P00   INFO: execute non-exclusive pg_stop_backup() and wait for all WAL segments to archive
P00   INFO: backup stop archive = 000000010000000000000006, lsn = 0/6000138
P00   INFO: check archive for segment(s) 000000010000000000000006:000000010000000000000006
P00   INFO: new backup label = 20220308-145104F
P00   INFO: full backup size = 56.5MB, file total = 1691
P00   INFO: backup command end: completed successfully

結論

TLSサーバーは、リモート操作のためのSSHの代替を提供します。この新機能は、パフォーマンスとユーザーエクスペリエンスを大幅に向上させることができるコンテナ化された世界に完全に適合します。