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を有効にするチュートリアルは終了です。質問がある場合は、以下のコメントに投稿してください。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。