PostgreSQL · 3 min read · Dec 21, 2025

PostgreSQL接続のためのSSLを有効にする方法

デフォルトでは、すべてのPostgreSQL接続は安全ではなく、高トラフィックの本番環境で実行されるとセキュリティ上の問題を引き起こす可能性があります。SSL暗号化は、接続の中間で誰にもデータが傍受されないことを保証します。

このチュートリアルでは、PostgreSQL接続のためにSSL/TLSを有効にする方法を学びます。

前提条件

  • Linuxサーバー。私たちのチュートリアルでは、Ubuntu 22.04サーバーを実行しています。
  • 非rootのsudoユーザー。
  • postgresql.example.comのような完全修飾ドメイン名(FQDN)。
  • すべてが更新されていることを確認してください。 $ sudo apt update $ sudo apt upgrade
  • システムに必要なパッケージがいくつかあります。 $ sudo apt install curl nano software-properties-common apt-transport-https ca-certificates lsb-release ubuntu-keyring -y これらのパッケージのいくつかは、すでにシステムにインストールされているかもしれません。

ステップ1 - ファイアウォールの設定

パッケージをインストールする前に、最初のステップはHTTP、HTTPS、およびPostgreSQLのポートを開くためにファイアウォールを設定することです。

ファイアウォールの状態を確認します。

$ sudo ufw status

以下のような出力が表示されるはずです。

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

ファイアウォールでHTTP、HTTPS、およびPostgreSQLのポートを開きます。

$ sudo ufw allow 5432
$ sudo ufw allow http
$ sudo ufw allow https

再度状態を確認して確認します。

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
80/tcp                     ALLOW       Anywhere                  
443                        ALLOW       Anywhere                  
5432                       ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
80/tcp (v6)                ALLOW       Anywhere (v6)             
443 (v6)                   ALLOW       Anywhere (v6)
5432 (v6)                  ALLOW       Anywhere (v6)             

ステップ2 - PostgreSQL 14のインストール

Ubuntu 22.04にはデフォルトでPostgreSQL 14が含まれています。インストールするには、次のコマンドを実行します。

$ sudo apt install postgresql postgresql-contrib

postgresql-contribパッケージには、いくつかの追加ユーティリティが含まれています。

PostgreSQLの公式APTリポジトリを使用してインストールすることもできます。次のコマンドを実行してPostgreSQL GPGキーを追加します。

$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null

APTリポジトリをソースリストに追加します。

$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/postgresql-key.gpg arch=amd64] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

システムリポジトリを更新します。

$ sudo apt update

これで、上記のコマンドを使用してPostgreSQLをインストールできます。

PostgreSQLサービスの状態を確認します。

$ sudo systemctl status postgresql
? postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Mon 2022-12-12 00:01:06 UTC; 19s ago
   Main PID: 3497 (code=exited, status=0/SUCCESS)
        CPU: 1ms

Dec 12 00:01:06 postgresql systemd[1]: Starting PostgreSQL RDBMS...
Dec 12 00:01:06 postgresql systemd[1]: Finished PostgreSQL RDBMS.

サービスがデフォルトで有効になっており、実行中であることが確認できます。

postgresアカウントのパスワードを設定します。

$ sudo -i -u postgres psql -c "ALTER USER postgres PASSWORD '';"

ステップ3 - SSLのインストール

Let’s Encryptを使用してSSL証明書をインストールするには、Certbotツールをダウンロードする必要があります。そのためにSnapdパッケージインストーラーを使用します。Ubuntu 22.04にはSnapがプリインストールされています。

Snapdのバージョンが最新であることを確認します。

$ sudo snap install core 
$ sudo snap refresh core

Certbotをインストールします。

$ sudo snap install --classic certbot

Certbotコマンドが/usr/binディレクトリにシンボリックリンクを作成して実行されるように、次のコマンドを使用します。

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

SSL証明書を生成します。

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d postgresql.example.com

上記のコマンドは、サーバーの/etc/letsencrypt/live/postgresql.example.comディレクトリに証明書をダウンロードします。

Diffie-Hellmanグループ証明書を生成します。

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

ステップ4 - PostgreSQLのためのCertbot更新の設定

PostgreSQLはLet’s Encryptフォルダーから証明書にアクセスする権限がないため、フォルダーから直接証明書を使用するように指示することはできません。代替手段は、証明書をPostgreSQLディレクトリにコピーすることですが、それは一時的にしか機能せず、期限切れになったら再度手動でコピーする必要があります。

最良の方法は、更新ごとに自動的に実行され、コピー操作を行う更新フックを使用することです。

PostgreSQLデータディレクトリを調べます。

$ sudo -i -u postgres psql -U postgres -c 'SHOW data_directory'

更新フックファイルを作成し、編集のために開きます。

$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh

以下のコードを貼り付けます。

#!/bin/bash
umask 0177
DOMAIN=postgresql.example.com
DATA_DIR=/var/lib/postgresql/15/main
cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem $DATA_DIR/server.crt
cp /etc/letsencrypt/live/$DOMAIN/privkey.pem $DATA_DIR/server.key
chown postgres:postgres $DATA_DIR/server.crt $DATA_DIR/server.key
# only for SELinux - CentOS, Red Hat
# chcon -t postgresql_db_t $DATA_DIR/server.crt $DATA_DIR/server.key

Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。

ファイルを実行可能にします。

$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh

ステップ5 - PostgreSQLの設定

PostgreSQL設定ファイルのパスを見つけます。

$ sudo -i -u postgres psql -U postgres -c 'SHOW config_file'

ファイルを編集のために開きます。

$ sudo nano /etc/postgresql/15/main/postgresql.conf

接続設定セクションを見つけ、listen_address変数のコメントを外し、その値を*に変更します。以下のように見えることを確認してください。

listen_address = '*'        # what IP address(es) to listen on;

SSLセクションを見つけ、ファイルを次の値に一致するように編集します。

ssl = on  
ssl_cert_file = 'server.crt'  
ssl_key_file = 'server.key'  
ssl_prefer_server_ciphers = on
ssl_dh_params_file = '/etc/ssl/certs/dhparam.pem'

Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。

ステップ6 - PostgreSQL接続の設定

/etc/postgresql/15/main/pg_hba.confファイルを編集のために開きます。

$ sudo nano /etc/postgresql/15/main/pg_hba.conf

PostgreSQLのSSLを有効にするために、次の行を追加します。

hostssl all  all  0.0.0.0/0  scram-sha-256

Ctrl + Xを押してファイルを保存し、プロンプトが表示されたらYを入力します。

ステップ7 - 証明書の更新

強制更新を実行するために次のコマンドを実行します。これにより、証明書をPostgreSQLが使用する正しい場所にコピーするデプロイスクリプトがトリガーされます。

$ sudo certbot renew --force-renewal

証明書がPostgreSQLデータディレクトリにコピーされていることを確認します。

$ sudo ls /var/lib/postgresql/15/main/

次のような出力が表示され、証明書が表示されます。

base          pg_dynshmem   pg_notify    pg_snapshots  pg_subtrans  PG_VERSION  postgresql.auto.conf  server.crt
global        pg_logical    pg_replslot  pg_stat       pg_tblspc    pg_wal      postmaster.opts       server.key
pg_commit_ts  pg_multixact  pg_serial    pg_stat_tmp   pg_twophase  pg_xact     postmaster.pid

PostgreSQLを再起動して変更を適用します。

$ sudo systemctl restart postgresql

ステップ8 - 接続のテスト

PostgreSQLクライアントがインストールされた別のマシンからデータベースに接続します。

$ psql -d "dbname=postgres sslmode=require" -h postgresql.example.com -U postgres

次のPostgreSQLプロンプトが表示されるはずです。PostgreSQL 14クライアントを使用しているため、互換性のないバージョンに関する警告が表示されます。

Password for user postgres:
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1), server 15.1 (Ubuntu 15.1-1.pgdg22.04+1))
WARNING: psql major version 14, server major version 15.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=#

これにより、SSL接続が成功したことが確認されます。

シェルを終了します。

postgres=# \q

アプリが接続文字列を使用している場合、SSL接続のために次の形式を使用します。

postgres://user:[email protected]:5432/database_name?sslmode=require

クライアント側の/var/lib/postgresql/.postgresqlにLet’s Encryptのルート証明書がある場合、SSLモードをverify-fullまたはverify-caに変更できます。

/var/lib/postgresql/.postgresqlディレクトリを作成します。

$ sudo mkdir -p /var/lib/postgresql/.postgresql

Let’s Encryptのルート証明書はISRG Root X1で、サーバーの/usr/share/ca-certificates/mozilla/ISRG_Root_X1.crtにあります。

ルート証明書を/var/lib/postgresql/.postgresqlディレクトリにコピーします。

$ sudo cp /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt /var/lib/postgresql/.postgresql/root.crt

verify-fullまたはverify-caモードを使用して接続をテストすると、成功した接続が表示されるはずです。

ステップ9 - クライアントの確認

サーバーのPostgreSQLシェルにログインします。

$ sudo -i -u postgres psql

接続されているクライアントを確認するために次のSQLコマンドを実行します。

SELECT ssl.pid, usename, datname, ssl, ssl.version, ssl.cipher, ssl.bits, client_addr
FROM pg_catalog.pg_stat_ssl ssl, pg_catalog.pg_stat_activity activity
WHERE ssl.pid = activity.pid;

次のような出力が表示されるはずです。

 pid  | usename  | datname  | ssl | version |         cipher         | bits |  client_addr
------+----------+----------+-----+---------+------------------------+------+----------------
 5126 | postgres | postgres | t   | TLSv1.3 | TLS_AES_256_GCM_SHA384 |  256 | 122.161.84.220
 5154 | postgres | postgres | f   |         |                        |      |
(2 rows)

これにより、サーバー側からのクライアント接続が確認されます。

結論

これで、PostgreSQL接続でSSLを有効にするチュートリアルは終了です。質問がある場合は、以下のコメントに投稿してください。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。