Rocky Linux / PostgreSQL をインストールする方法

Rocky Linuxでは、基本リポジトリのpostgresql-serverパッケージでPostgreSQLをインストールできます。インストール後、データベースクラスターを初期化し、サービスを有効にする必要があり、リモート接続はlisten_addresses、pg_hba.conf、ファイアウォールとTLSを共に構成する必要があります。

Rocky Linuxのバージョンと有効なリポジトリによって、提供されるPostgreSQLのメジャーバージョンとサービス名は異なる場合があります。インストール前に利用可能なパッケージとアプリケーションが要求するバージョンを確認してください。

インストール可能なPostgreSQLバージョンを確認する

cat /etc/rocky-release
dnf info postgresql-server
dnf module list postgresql

dnf moduleはRocky LinuxとDNFのバージョンによって提供されない場合があります。特定のPostgreSQLメジャーバージョンが必要な場合は、Rockyの基本リポジトリのライフサイクルとPostgreSQL Global Development Group(PGDG)が提供するリポジトリのどちらを使用するかをまず決定し、異なるリポジトリのサーバーパッケージを混在させないでください。

PostgreSQLをインストールして初期化する

サーバーとクライアントのインストール

sudo dnf install postgresql-server postgresql

インストールされたバージョンとパッケージを確認します。

psql --version
rpm -q postgresql-server postgresql

データベースクラスターを初期化する

Rockyの標準パッケージでは通常次のツールを使います。実行前にpostgresql-setup --helpと既存サービス・データディレクトリを確認し、新規で空の対象だけを初期化します。インストール経路はPostgreSQL公式のRed Hat系向け案内で確認できます。

sudo postgresql-setup --initdb

初期化は空のデータディレクトリで最初の一度だけ行います。既存のデータがあるサーバで再度初期化すると、別のクラスターが作成されたりデータが破損するリスクがあるため、データディレクトリとバックアップを先に確認してください。

sudo postgresql-setup --help

サービスの開始と自動実行

sudo systemctl enable --now postgresql
systemctl status postgresql

PGDGリポジトリのバージョン別パッケージでは、postgresql-16のようにサービス名や初期化コマンドが異なる場合があります。インストールしたパッケージの公式案内とsystemctl list-unit-files 'postgresql*'の結果を確認してください。

ローカル接続と基本セキュリティ設定

postgresオペレーティングシステムアカウントで接続する

sudo -iu postgres psql

初期のローカル認証は、オペレーティングシステムアカウントとデータベースロールを関連付けるpeer方式である場合があります。PostgreSQLのpostgresロールパスワードとLinuxのpostgresアカウントパスワードは異なります。

パスワードを安全に設定する

psql内で\passwordを使うと、パスワードをSQL文やシェル履歴へ直接残さず変更できます。後述のSCRAM(Salted Challenge Response Authentication Mechanism)認証を使うため、変更前にSHOW password_encryption;を確認し、この管理セッションではSET password_encryption = 'scram-sha-256';を実行してからパスワードを設定します。既存ロールも、値の変更だけで過去のパスワード保存形式が変わるわけではありません。

\password postgres

管理者用ロールをアプリケーションで使わず、用途別のロールとデータベースを作ります。以下は引き続きpsql内で実行します。設定用のSQLもpsql内の操作で、終わったら\qでシェルへ戻ります。

CREATE ROLE appuser LOGIN;
\password appuser
CREATE DATABASE appdb OWNER appuser;

設定ファイルの実際の場所を確認する

SHOW config_file;
SHOW hba_file;
SHOW data_directory;

パッケージやバージョンによってパスが異なる場合があるため、インターネット上の文書のパスをそのまま推測せず、サーバーが報告する値を使用してください。

リモート接続を安全に許可する

受信アドレスを制限する

postgresql.conf の listen_addresses をサーバーの特定のプライベート IP に制限することをお勧めします。

listen_addresses = '192.0.2.20'

192.0.2.20 はドキュメント用の例です。実際のサーバーアドレスに置き換えてください。* はすべてのインターフェースを意味するので便利ですが、不必要なネットワークにも公開される可能性があります。PostgreSQL のデフォルトはローカルループバック接続であり、詳細な意味は PostgreSQL 接続設定公式ドキュメント で確認できます。

pg_hba.confでクライアントと認証を制限する

特定のアプリケーションサーバー1台からappdbへappuserとして接続させる例です。hostsslはTLS(Transport Layer Security)接続にだけ一致する規則で、これ自体がTLSを有効にするわけではありません。先にサーバーのssl = on、ssl_cert_file、ssl_key_fileを設定し、対応する証明書と秘密鍵を用意します。通常、postgres所有の秘密鍵は0600など要件に合う権限にし、SELinuxを含む読み取り条件も確認します。準備はPostgreSQLのTLS設定を参照してください。

hostssl  appdb  appuser  192.0.2.10/32  scram-sha-256

pg_hba.confは上から下へ順にチェックし、最初に一致したルールのみ使用します。広い範囲の許可ルールを前に置くと、後ろの制限ルールは適用されません。詳細なフィールドや順序については、PostgreSQL pg_hba.conf 公式ドキュメントを参照してください。

ファイアウォールでも送信元アドレスを制限する

sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.0.2.10/32" port port="5432" protocol="tcp" accept'

publicは例なので実際の接続に対応するゾーンを確認します。他の広い許可やIPv6側も確認し、新規クライアント接続をテストしてから保存します。--runtime-to-permanentは今回の規則だけでなくランタイム構成全体を永続設定へ保存するため、他の一時変更も点検してください。詳細はRocky Linuxのfirewalld管理を参照してください。

sudo firewall-cmd --runtime-to-permanent

データベースポートをインターネット全体に直接公開せず、プライベートネットワーク、VPN、セキュリティグループ、およびファイアウォールを併用してください。

設定の適用と検証

認証ルールを再読み込みする

pg_hba.conf のような再読み込み可能な設定は、次のように再読み込みできます。

sudo -iu postgres psql -c 'SELECT pg_reload_conf();'

pg_reload_conf()のtrueは再読み込みシグナルを送れたことを示し、全設定の採用成功を保証しません。以下のシステムビューとサーバーログを確認します。pg_hba_file_rulesは現在のファイル内容を示すため、現在読み込まれた規則そのものとは限りません。

sudo -iu postgres psql -c 'SELECT line_number, type, database, user_name, address, auth_method, error FROM pg_hba_file_rules;'

再起動が必要な設定の適用

listen_addresses のように、サーバー起動時に適用される設定は再起動が必要です。

sudo systemctl restart postgresql
sudo systemctl status postgresql

受信ポートと接続をテストする

次の1行目はデータベースサーバー、2行目は許可したクライアント端末で実行します。psqlはクライアント側にも必要です。5432は既定ポートの例で、SHOW port;の値に合わせます。パスワードはプロンプトへ入力し、接続文字列へ直接書かないでください。

ss -lntp | grep 5432
psql 'host=192.0.2.20 dbname=appdb user=appuser sslmode=verify-full'

verify-fullではクライアントが信頼するCA(Certificate Authority)の証明書を~/.postgresql/root.crtまたはsslrootcertで指定します。サーバー証明書の識別名も接続先と一致する必要があり、この例のようにIPアドレスで接続するなら対応するIPのSAN(Subject Alternative Name)が必要です。通常は証明書に含まれるDNS名を接続先に指定します。\conninfoやpg_stat_sslで接続を確認し、検証失敗を避けるためにTLS検証を無効化しないでください。詳細はlibpqの証明書検証を参照してください。

運用前に準備しておく項目

  • 定期的な論理・物理バックアップおよび実際の復旧テスト
  • サポートされるマイナーアップデート適用計画
  • アプリケーションごとの最小権限ロールとパスワードローテーション
  • TLS証明書の検証とプライベートネットワークまたはVPNの使用
  • ディスク使用量、接続数、遅延、チェックポイントおよびエラーログの監視
  • メジャーバージョンアップ前の互換性レビューと別途手順の準備

PostgreSQLのメジャーバージョンアップは単純なパッケージ更新とは異なります。pg_upgrade、論理レプリケーションまたはダンプ・リストアなどの公式アップグレード手順をバージョンに合わせて計画してください。

よくある質問

postgresql-setup コマンドが見つかりません

インストールしたリポジトリとパッケージ名を確認してください。Rocky標準パッケージとPGDGのバージョン別パッケージでは、初期化ツールとサービス名が異なる場合があります。

外部接続が継続して拒否されます

listen_addresses、pg_hba.confの最初の一致ルール、サービス受信ポート、firewalldとクラウドセキュリティグループを順番に確認してください。

pg_hba.confに0.0.0.0/0を許可してもいいですか?

インターネット全体と一致するため、一般的に避けるべきです。実際のアプリケーションサーバーの固定アドレスやプライベートサブネットに制限し、TLSと最小権限を使用してください。

設定ファイル変更後はreloadとrestartのどちらを使いますか?

項目ごとに異なります。pg_hba.confはreload可能ですが、listen_addressesは再起動が必要です。pg_settings.pending_restartおよび公式ドキュメントのコンテキストを確認してください。

まとめ

Rocky LinuxでPostgreSQLは、パッケージインストール、クラスター初期化、サービス有効化の順で準備します。リモート接続は特定の受信アドレス、狭いpg_hba.confルール、ファイアウォールの送信元制限とTLSを併せて適用してください。

設定パスとサービス名はインストール元とバージョンごとに異なることがあるため、PostgreSQLが直接提示するパスとインストールしたパッケージのドキュメントを基準に作業するのが安全です。