21.2. postgresql RHEL システムロールを使用した、IdM から発行された TLS 証明書による PostgreSQL の設定
アプリケーションに PostgreSQL データベースサーバーが必要な場合は、TLS 暗号化を使用して PostgreSQL サービスを設定し、アプリケーションとデータベース間のセキュアな通信を有効にできます。PostgreSQL ホストが Red Hat Enterprise Linux Identity Management (IdM) ドメインのメンバーである場合、certmonger サービスによって証明書要求と将来の更新を管理できます。
postgresql RHEL システムロールを使用すると、このプロセスを自動化できます。TLS 暗号化を使用して PostgreSQL をリモートでインストールおよび設定できます。postgresql ロールは、certificate RHEL システムロールを使用して certmonger を設定し、IdM から証明書を要求します。
postgresql ロールは、firewalld サービスでポートを開くことができません。PostgreSQL サーバーへのリモートアクセスを許可するには、firewall RHEL システムロールを使用するタスクを Playbook に追加します。
前提条件
- コントロールノードと管理対象ノードの準備が完了している。
- 管理対象ノードで Playbook を実行できるユーザーとしてコントロールノードにログインしている。
-
管理対象ノードへの接続に使用するアカウントに、そのノードに対する
sudo権限がある。 - 管理対象ノードを IdM ドメインに登録した。
手順
機密性の高い変数を暗号化されたファイルに保存します。
vault を作成します。
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>ansible-vault createコマンドでエディターが開いたら、機密データを<key>: <value>形式で入力します。pwd: <password>- 変更を保存して、エディターを閉じます。Ansible は vault 内のデータを暗号化します。
次の内容を含む Playbook ファイル (例:
~/playbook.yml) を作成します。--- - name: Installing and configuring PostgreSQL hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: PostgreSQL with certificates issued by IdM ansible.builtin.include_role: name: redhat.rhel_system_roles.postgresql vars: postgresql_version: "16" postgresql_password: "{{ pwd }}" postgresql_ssl_enable: true postgresql_certificates: - name: postgresql_cert dns: "{{ inventory_hostname }}" ca: ipa principal: "postgresql/{{ inventory_hostname }}@EXAMPLE.COM" postgresql_server_conf: listen_addresses: "'*'" password_encryption: scram-sha-256 postgresql_pg_hba_conf: - type: local database: all user: all auth_method: scram-sha-256 - type: hostssl database: all user: all address: '127.0.0.1/32' auth_method: scram-sha-256 - type: hostssl database: all user: all address: '::1/128' auth_method: scram-sha-256 - type: hostssl database: all user: all address: '192.0.2.0/24' auth_method: scram-sha-256 - name: Open the PostgresQL port in firewalld ansible.builtin.include_role: name: redhat.rhel_system_roles.firewall vars: firewall: - service: postgresql state: enabledサンプル Playbook で指定されている設定は次のとおりです。
postgresql_version: <version>インストールする PostgreSQL のバージョンを設定します。設定できるバージョンは、管理対象ノードで実行されている Red Hat Enterprise Linux で使用可能な PostgreSQL バージョンによって異なります。
postgresql_version変数を変更して Playbook を再度実行しても、PostgreSQL をアップグレードまたはダウングレードすることはできません。postgresql_password: <password>postgresデータベーススーパーユーザーのパスワードを設定します。postgresql_password変数を変更して Playbook を再度実行しても、パスワードを変更することはできません。postgresql_certificates: <certificate_role_settings>-
certificateロールの設定を含む YAML ディクショナリーのリスト。 postgresql_server_conf: <list_of_settings>ロールが設定する必要がある
postgresql.conf設定を定義します。ロールはこれらの設定を/etc/postgresql/system-roles.confファイルに追加し、このファイルを/var/lib/pgsql/data/postgresql.confの最後に含めます。その結果、postgresql_server_conf変数の設定により、/var/lib/pgsql/data/postgresql.conf内の設定がオーバーライドされます。postgresql_server_confで異なる設定を使用して Playbook を再実行すると、/etc/postgresql/system-roles.confファイルが新しい設定で上書きされます。postgresql_pg_hba_conf: <list_of_authentication_entries>/var/lib/pgsql/data/pg_hba.confファイル内のクライアント認証エントリーを設定します。詳細は、PostgreSQL のドキュメントを参照してください。この例では、PostgreSQL への次の接続を許可します。
- ローカル UNIX ドメインソケットを使用した暗号化されていない接続。
- IPv4 および IPv6 ローカルホストアドレスへの TLS 暗号化接続。
-
192.0.2.0/24 サブネットからの TLS 暗号化接続。リモートアドレスからのアクセスは、
postgresql_server_conf変数のlisten_addresses設定も適切に設定した場合にのみ可能であることに注意してください。
postgresql_pg_hba_confで異なる設定を使用して Playbook を再実行すると、/var/lib/pgsql/data/pg_hba.confファイルが新しい設定で上書きされます。
Playbook で使用されるすべての変数の詳細は、コントロールノードの
/usr/share/ansible/roles/rhel-system-roles.postgresql/README.mdファイルを参照してください。Playbook の構文を検証します。
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.ymlこのコマンドは構文を検証するだけであり、有効だが不適切な設定から保護するものではないことに注意してください。
Playbook を実行します。
$ ansible-playbook --ask-vault-pass ~/playbook.yml
検証
postgresスーパーユーザーを使用して PostgreSQL サーバーに接続し、\conninfoメタコマンドを実行します。# psql "postgresql://postgres@managed-node-01.example.com:5432" -c '\conninfo' Password for user postgres: You are connected to database "postgres" as user "postgres" on host "192.0.2.1" at port "5432". SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)出力に TLS プロトコルのバージョンと暗号の詳細が表示される場合、接続は機能し、TLS 暗号化が有効になっています。