CentOS に PostgreSQL をインストールする手順を徹底解説
はじめに
企業の情報システムから個人の開発環境まで、あらゆる分野でリレーショナルデータベースは不可欠な存在です。その中でも、PostgreSQL は高い信頼性、豊富な機能、そしてオープンソースであるという利点から、世界中で広く利用されています。この記事では、安定したサーバープラットフォームとして人気の高い CentOS に、PostgreSQL をインストールし、基本的な設定を行う手順を詳細に解説します。
PostgreSQL(しばしば “Postgres” と略されます)は、高度な機能と拡張性を備えたオブジェクトリレーショナルデータベースシステムです。SQL 標準に準拠しているだけでなく、トランザクション処理、ACID 特性、同時実行制御(MVCC)、ストアドプロシージャ、トリガー、外部キー、ビューなど、エンタープライズレベルのデータベースに求められる多くの機能をサポートしています。また、地理空間データ(PostGIS)、全文検索、JSON データ型など、現代の多様なデータ要件に対応するための強力な機能も提供されています。その堅牢性と柔軟性により、ミッションクリティカルなシステムから Web アプリケーションのバックエンド、データウェアハウスまで、幅広い用途で利用されています。
CentOS は、RHEL(Red Hat Enterprise Linux)のソースコードを基にした、コミュニティが開発・サポートを行う無償の Linux ディストリビューションでした。CentOS 8 の EOL(End Of Life)に伴い、今後は CentOS Stream が開発の主流となりますが、従来の CentOS 7 や CentOS 8 もまだ多くの環境で利用されています。本記事では、CentOS Stream 8 / CentOS 8 および CentOS 7 での手順を中心に解説しますが、CentOS Stream や他の RHEL クローン(Rocky Linux, AlmaLinuxなど)にも応用可能な内容となっています。CentOS はサーバー OS としての安定性と信頼性が高く評価されており、長期的な運用を前提としたデータベースサーバーのプラットフォームとして非常に適しています。
この記事は、Linux コマンドラインの基本的な操作経験がある方を対象としています。データベースや PostgreSQL に初めて触れる方でも理解できるよう、用語の解説や手順の意図を丁寧に説明することを心がけています。この記事を読むことで、単にコマンドを実行するだけでなく、PostgreSQL のインストール、初期設定、基本的な管理に必要な知識を習得し、セキュアで安定したデータベース環境を構築できるようになることを目指します。
約 5000 語にわたる詳細な解説を通じて、インストール方法の選択から、初期設定ファイル (pg_hba.conf, postgresql.conf) の編集、データベースユーザーと権限の設定、ファイアウォールの設定、基本的な運用管理まで、PostgreSQL サーバーを稼働させるために必要なステップを網羅します。さあ、PostgreSQL の世界へ足を踏み入れましょう。
1. インストール前の準備
PostgreSQL のインストールを始める前に、システム環境の確認と必要な準備を行いましょう。適切な準備を行うことで、インストールの途中で問題が発生するリスクを減らし、スムーズな導入が可能となります。
1.1. 必要な環境の確認
まず、PostgreSQL をインストールする CentOS サーバーの環境を確認します。
-
OS バージョン: 使用している CentOS のバージョンを確認します。
bash
cat /etc/redhat-release
または
bash
hostnamectl | grep "Operating System"
本記事では CentOS Stream 8 / CentOS 8 および CentOS 7 を想定した解説を含みます。バージョンによってパッケージマネージャー (yumまたはdnf) や一部のコマンドが異なります。 -
サーバーの形態: 物理サーバー、仮想マシン、クラウドインスタンスなど、どのような環境にインストールするのかを把握します。これは後のネットワーク設定やセキュリティ設定に関わってきます。
-
root 権限または sudo 権限: インストールやシステム設定の変更には管理者権限が必要です。root ユーザーでログインしているか、あるいは sudo コマンドを使用できるユーザーで作業を行います。本記事では基本的に sudo を使用することを前提とします。
1.2. システム要件
PostgreSQL を実行するために最低限必要なシステムリソースを確認します。必要なリソースは、データベースの規模、同時接続数、実行されるクエリの複雑さなどによって大きく変動しますが、一般的なガイドラインは以下の通りです。
- CPU: 現代のサーバー向け CPU であれば問題ありません。コア数が多いほど、同時実行されるクエリの処理能力が向上します。
- メモリ (RAM): PostgreSQL はメモリを積極的に利用してパフォーマンスを向上させます。データの一部やインデックスをキャッシュするために、十分なメモリ容量が推奨されます。最低でも 1GB、実稼働環境では 4GB 以上、大規模な場合は数十 GB またはそれ以上のメモリが必要になることもあります。
- ストレージ: データベースのデータ、ログ、一時ファイルなどを保存するためにストレージ容量が必要です。必要な容量は格納するデータの量に依存します。データ量に加えて、将来の増加分、インデックス、トランザクションログ(WAL: Write-Ahead Logging)のための容量も考慮する必要があります。ストレージの種類(HDD, SSD, NVMe)はパフォーマンスに大きく影響します。可能な限り高速なストレージ(SSD以上)の使用が推奨されます。
1.3. ネットワーク設定
データベースサーバーとして運用する場合、適切なネットワーク設定が重要です。
- IP アドレス: サーバーに固定 IP アドレスが割り当てられていることを確認します。IP アドレスが動的に変更されると、クライアントからの接続設定やファイアウォール設定の管理が煩雑になります。
- ホスト名の解決: 必要に応じて、サーバーのホスト名が正しく解決できることを確認します。
- ファイアウォール: 後述しますが、PostgreSQL が使用するポート(デフォルトは 5432/tcp)について、必要な通信元からの接続を許可するようにファイアウォールを設定する必要があります。
1.4. OS のアップデート
インストールの前に、システムのパッケージを最新の状態にアップデートしておくことを強く推奨します。これにより、依存関係の問題を防ぎ、セキュリティパッチを適用できます。
“`bash
sudo dnf update -y
または CentOS 7 の場合
sudo yum update -y
“`
アップデートが完了したら、必要に応じてサーバーを再起動します。
bash
sudo systemctl reboot
1.5. SELinux の状態確認
SELinux (Security-Enhanced Linux) は、Linux システムのセキュリティを強化するための仕組みですが、適切に設定されていないと、サービスの起動やファイルアクセスに問題を引き起こすことがあります。SELinux の状態を確認し、必要に応じて設定を変更または無効化(非推奨)することを検討します。
bash
getenforce
出力が Enforcing の場合、SELinux が有効になっています。通常、PostgreSQL の公式パッケージは SELinux ポリシーが考慮されていますが、予期せぬ問題が発生する場合は、一時的に Permissive モードに変更して問題を切り分けることもあります。
“`bash
一時的に Permissive モードに変更(再起動で元に戻る)
sudo setenforce 0
設定ファイルで恒久的に変更する場合は /etc/selinux/config を編集
SELINUX=enforcing から SELINUX=permissive または SELINUX=disabled に変更
変更後はサーバーの再起動が必要
“`
本記事では SELinux が Enforcing モードでも動作する前提で進めますが、もし後述の初期化や起動で問題が発生し、ログに “permission denied” のようなエラーが見られる場合は、SELinux が原因である可能性も考慮に入れてください。
2. CentOS への PostgreSQL インストール方法
CentOS に PostgreSQL をインストールする方法はいくつかありますが、ここでは主に以下の 2 つの方法を紹介します。
- CentOS 標準リポジトリを使用する方法: CentOS OS に最初から含まれているか、または追加設定なしに
yum/dnfで利用できるリポジトリからインストールします。手軽ですが、提供される PostgreSQL のバージョンはやや古いことが多いです。 - PostgreSQL 公式リポジトリを使用する方法: PostgreSQL プロジェクトが提供する公式のリポジトリを追加してインストールします。最新版を含む、複数の PostgreSQL バージョンを選択できます。実稼働環境ではこちらを推奨します。
2.1. 方法1: 標準リポジトリ (yum/dnf) からインストール
この方法は最も手軽に PostgreSQL をインストールできます。CentOS のリリースサイクルに合わせてテストされているため、OS との互換性も高い傾向にあります。ただし、提供される PostgreSQL のバージョンは、その CentOS のリリース時点での安定版、またはそれ以前のバージョンであることが多く、最新の機能や改善を利用できない場合があります。
メリット:
* OS のインストール直後から利用可能
* 依存関係の解決が容易
* OS のアップデートと一緒に管理しやすい
デメリット:
* PostgreSQL のバージョンが古いことが多い
* 複数の PostgreSQL バージョンを共存させることが難しい
インストール手順 (CentOS 8/Stream):
CentOS 8/Stream では、特定のモジュールを有効化してインストールします。
-
利用可能な PostgreSQL モジュールを確認します。
bash
sudo dnf module list postgresql
これにより、利用可能な PostgreSQL のバージョン(ストリーム)が表示されます。例えば、postgresql:12やpostgresql:13などが見つかるはずです。アクティブなストリーム([e]と表示されているもの)がデフォルトでインストールされます。 -
デフォルトの PostgreSQL ストリームを有効化します(通常は最新版がデフォルトになっています)。
bash
sudo dnf module enable postgresql:<バージョン>
# 例: sudo dnf module enable postgresql:13
もし、特定のバージョン(例: 13)をインストールしたいが、デフォルトが別のバージョン(例: 10)になっている場合は、一度無効化してから目的のバージョンを有効化します。
bash
sudo dnf module reset postgresql
sudo dnf module enable postgresql:13 -
PostgreSQL サーバーと contrib パッケージをインストールします。
postgresql-serverはデータベースサーバー本体、postgresql-contribは様々な便利なユーティリティや追加機能が含まれています。
bash
sudo dnf install postgresql-server postgresql-contrib
依存するパッケージも一緒にインストールされます。途中で確認を求められたらyを入力して進めます。
インストール手順 (CentOS 7):
CentOS 7 ではモジュールは使用しません。yum コマンドで直接インストールします。
-
利用可能な PostgreSQL パッケージを検索します。
bash
sudo yum search postgresql-server
通常は CentOS 7 のリリース時点の最新版または少し前のバージョン(例: PostgreSQL 9.2)が見つかります。EPEL リポジトリなどを追加している場合は、より新しいバージョンが見つかることもあります。 -
PostgreSQL サーバーと contrib パッケージをインストールします。
bash
sudo yum install postgresql-server postgresql-contrib
依存するパッケージも一緒にインストールされます。途中で確認を求められたらyを入力して進めます。
インストールが完了したら、インストールされた PostgreSQL のバージョンを確認できます。
bash
psql --version
または、パッケージマネージャーで確認します。
“`bash
sudo dnf list installed | grep postgresql-server
または yum list installed | grep postgresql-server
“`
2.2. 方法2: PostgreSQL 公式リポジトリからインストール
PostgreSQL プロジェクトは、様々な OS 向けに公式のリポジトリを提供しています。このリポジトリを利用することで、CentOS の標準リポジトリには含まれていない最新版や、サポートされている複数の旧バージョンをインストールできます。実稼働環境で最新機能を利用したい場合や、特定のバージョンが必要な場合に推奨される方法です。
メリット:
* 最新版を含む複数の PostgreSQL バージョンを選択できる
* 公式が提供しているため安心できる
* 新しいバージョンへのアップグレードパスが比較的容易
デメリット:
* リポジトリの追加設定が必要
* OS 標準パッケージとの間でバージョン管理に注意が必要な場合がある
インストール手順 (CentOS 8/Stream および CentOS 7 共通):
-
PostgreSQL Yum リポジトリの RPM パッケージをダウンロードし、インストールします。
使用する PostgreSQL のバージョンと CentOS のバージョンに合わせて、適切な RPM パッケージを選択します。
PostgreSQL Yum Repository のページ (https://yum.postgresql.org/) で、お使いの OS バージョンと PostgreSQL バージョンを選択し、ダウンロード URL を確認してください。例:CentOS 8/Stream に PostgreSQL 15 をインストールする場合
“`bash
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpmまたは curl でダウンロードして rpm -i しても良い
curl -O https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo rpm -ivh pgdg-redhat-repo-latest.noarch.rpm
例:CentOS 7 に PostgreSQL 15 をインストールする場合bash
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpmまたは curl でダウンロードして rpm -i しても良い
curl -O https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo rpm -ivh pgdg-redhat-repo-latest.noarch.rpm
``/etc/yum.repos.d/pgdg-redhat-all.repo` のようなリポジトリ定義ファイルが追加されます。
この RPM パッケージをインストールすることで、 -
(CentOS 8/Stream のみ)標準リポジトリの PostgreSQL モジュールを無効化します。
標準リポジトリと公式リポジトリの両方で同じ名前のパッケージ(postgresql-serverなど)が提供されていると、競合や意図しないバージョンのインストールが発生する可能性があります。公式リポジトリからインストールする場合は、OS 標準のモジュールを無効化することを強く推奨します。
bash
sudo dnf -qy module disable postgresql -
PostgreSQL サーバーと contrib パッケージをインストールします。
公式リポジトリからインストールする場合、パッケージ名にはバージョン番号が含まれます(例:postgresql15-server)。インストールしたいバージョンを指定してインストールします。
bash
sudo dnf install postgresql15-server postgresql15-contrib
# または CentOS 7 の場合
# sudo yum install postgresql15-server postgresql15-contrib
インストールされるパッケージ名はバージョンによって異なります(例:postgresql14-server,postgresql13-server)。インストールしたいバージョンに合わせてパッケージ名を変更してください。
インストールが完了したら、インストールされた PostgreSQL のバージョンを確認できます。
bash
psql --version
公式リポジトリからインストールした場合、/usr/pgsql-<バージョン> のようなパスにファイルがインストールされることが一般的です。例えば、PostgreSQL 15 なら /usr/pgsql-15/bin/psql のようになります。psql コマンドがパスに含まれていない場合は、フルパスで実行するか、環境変数を設定する必要があります。公式リポジトリからインストールされるパッケージには、通常 /usr/pgsql-<バージョン>/bin/ へのシンボリックリンクやパス設定が含まれているため、多くの場合 psql コマンドはそのまま実行できます。
2.3. 方法3: ソースコードからのビルド (概要のみ)
PostgreSQL はソースコードからビルドしてインストールすることも可能です。この方法は、最新の開発版を試したい、特定の機能だけを有効/無効にしたい、標準パッケージでは利用できない特定の環境にインストールしたい、といった高度なカスタマイズが必要な場合に適しています。しかし、ビルド環境の準備、依存ライブラリのインストール、configure オプションの指定、ビルド、インストールと、手順が複雑で手間がかかるため、一般的な用途では推奨されません。
手順の概要は以下のようになります。
1. ビルドに必要な開発ツールやライブラリ(GCC, make, zlib-devel, readline-develなど)をインストールする。
2. PostgreSQL のソースコードをダウンロードし、展開する。
3. 展開したディレクトリに移動し、configure スクリプトを実行してビルドオプションを設定する。
4. make コマンドでビルドする。
5. make install コマンドでインストールする。
この方法でインストールした場合、PostgreSQL のバイナリや設定ファイルは /usr/local/pgsql のようなディレクトリに配置されることが一般的です。サービス管理(systemd への登録など)や、設定ファイルの管理、アップデートなどはすべて手動で行う必要があります。本記事ではこれ以上深くは立ち入りません。
3. PostgreSQL の初期化と起動
PostgreSQL をインストールしただけでは、データベースはまだ使用できません。最初にデータベースクラスター(データベース群を管理するファイル群)を初期化する必要があります。その後、PostgreSQL サービスを起動します。
3.1. データベースクラスターの初期化 (initdb)
データベースクラスターの初期化は、データベースがデータを格納するための領域(データディレクトリ)を作成し、必要なシステムカタログテーブルなどを設定するプロセスです。この操作は PostgreSQL のインストール後、最初に一度だけ実行する必要があります。
インストール方法によって、初期化コマンドが異なります。
- 標準リポジトリからのインストール:
postgresql-setupコマンドを使用します。 - PostgreSQL 公式リポジトリからのインストール: バージョン固有のパスにある
initdbコマンドを直接実行します。
どちらの方法でも、初期化は PostgreSQL の実行ユーザー(通常 postgres)によって行われる必要があります。root ユーザーで作業している場合、sudo -u postgres を使用してユーザーを切り替えてコマンドを実行します。
初期化手順 (標準リポジトリ – CentOS 8/Stream):
bash
sudo /usr/bin/postgresql-setup --initdb
このコマンドは、デフォルトのデータディレクトリ (/var/lib/pgsql/data) にデータベースクラスターを作成します。CentOS 8/Stream の標準リポジトリからインストールした場合、systemd のサービスファイル (postgresql.service) がこの初期化コマンドを認識します。
初期化手順 (標準リポジトリ – CentOS 7):
bash
sudo postgresql-setup initdb
CentOS 7 の標準リポジトリからインストールした場合、このコマンドはデータディレクトリ (/var/lib/pgsql/data) を初期化します。
初期化手順 (PostgreSQL 公式リポジトリ):
公式リポジトリからインストールした場合、初期化コマンドのパスはインストールした PostgreSQL のバージョンによって異なります。例えば PostgreSQL 15 なら /usr/pgsql-15/bin/initdb となります。
“`bash
sudo /usr/pgsql-<バージョン>/bin/initdb -D /var/lib/pgsql/<バージョン>/data/
例: sudo /usr/pgsql-15/bin/initdb -D /var/lib/pgsql/15/data/
``-Dオプションでデータディレクトリの場所を指定します。公式リポジトリの RPM パッケージは、バージョンごとにデータディレクトリを分けるように設定されていることが多いです。上記の例では/var/lib/pgsql/15/data` を使用しています。
初期化が成功すると、指定したデータディレクトリ以下に必要なファイルやディレクトリ(base, global, pg_wal, postgresql.conf, pg_hba.conf など)が作成されます。
3.2. PostgreSQL サービスの起動と有効化
データベースクラスターの初期化が完了したら、PostgreSQL サービスを起動してデータベースサーバーを稼働させます。また、システム起動時に自動的にサービスが開始されるように設定(有効化)しておくことが一般的です。
CentOS 7/8/Stream では、サービスの管理に systemd を使用します。サービス名はインストール方法によって異なります。
- 標準リポジトリからのインストール: サービス名は
postgresqlです。 - PostgreSQL 公式リポジトリからのインストール: サービス名はバージョン番号を含みます。例えば PostgreSQL 15 なら
postgresql-15です。
サービスの起動:
サービスを起動します。
“`bash
sudo systemctl start <サービス名>
例: sudo systemctl start postgresql
例: sudo systemctl start postgresql-15
“`
サービスの自動起動設定:
システム起動時に自動的にサービスが開始されるように設定します。
“`bash
sudo systemctl enable <サービス名>
例: sudo systemctl enable postgresql
例: sudo systemctl enable postgresql-15
“`
サービスのステータス確認:
サービスが正常に起動しているか確認します。
“`bash
sudo systemctl status <サービス名>
例: sudo systemctl status postgresql
例: sudo systemctl status postgresql-15
``active (running)
ステータスがと表示されていれば成功です。もしfailedと表示されている場合は、journalctl` コマンドで詳細なログを確認して原因を調査します。
“`bash
sudo journalctl -u <サービス名> –since “1 hour ago”
例: sudo journalctl -u postgresql –since “1 hour ago”
“`
初期化や起動で問題が発生した場合、よくある原因としてはデータディレクトリの権限問題、SELinux の設定、またはすでに別の PostgreSQL インスタンスが同じポートで実行されているなどが考えられます。ログを丁寧に確認することが重要です。
4. 初期設定
PostgreSQL が起動したら、すぐに使い始めることができますが、より安全に、そして外部から接続できるようにするために、いくつかの初期設定を行う必要があります。主な設定は以下の2点です。
postgresデータベーススーパーユーザーのパスワード設定- クライアント認証の設定 (
pg_hba.conf) - リスニングアドレスの設定 (
postgresql.conf)
4.1. postgres ユーザーのパスワード設定
インストール直後の PostgreSQL には、postgres という名前のデータベーススーパーユーザーがデフォルトで作成されています。このユーザーは OS の postgres ユーザーと関連付けられており、デフォルトの認証方法では OS の postgres ユーザーとしてログインすることで、データベースの postgres ユーザーとしてパスワードなしで接続できます(peer 認証)。
セキュリティのため、通常はデータベースの postgres ユーザーにパスワードを設定し、pg_hba.conf でパスワード認証を有効にするのが一般的です。
-
OS の
postgresユーザーとして psql に接続します。
bash
sudo -u postgres psql
psqlは PostgreSQL のコマンドラインクライアントツールです。このコマンドは、OS のpostgresユーザーとしてログインし、デフォルトでpostgresデータベースに接続します。成功すると、postgres=#というプロンプトが表示されます。 -
postgresデータベースユーザーのパスワードを設定します。
psql プロンプトで以下の SQL コマンドを実行します。'mypassword'の部分は、設定したいパスワードに置き換えてください。強力なパスワードを設定することを推奨します。
sql
ALTER USER postgres PASSWORD 'mypassword';
成功するとALTER ROLEと表示されます。 -
psql を終了します。
sql
\q
これで、データベースの postgres ユーザーにパスワードが設定されました。しかし、この時点ではまだ OS の postgres ユーザーからの接続は peer 認証でパスワードなしで可能です。また、他の OS ユーザーやリモートからの接続は、デフォルト設定では許可されていないか、別の認証方法になっています。
4.2. クライアント認証の設定 (pg_hba.conf)
pg_hba.conf ファイルは、どのユーザーが、どのクライアントから、どのデータベースに、どのような方法で接続できるかを定義するファイルです。PostgreSQL のセキュリティ設定において最も重要なファイルの一つです。
pg_hba.conf ファイルの場所は、インストール方法やバージョンによって異なりますが、一般的にはデータディレクトリ内にあります。
- 標準リポジトリ (CentOS 7/8/Stream):
/var/lib/pgsql/data/pg_hba.conf - PostgreSQL 公式リポジトリ:
/var/lib/pgsql/<バージョン>/data/pg_hba.conf(例:/var/lib/pgsql/15/data/pg_hba.conf)
設定ファイルを編集するには、テキストエディタを使用します。データディレクトリは OS の postgres ユーザーまたは root ユーザーのみが書き込めるようになっているはずです。
“`bash
例: 公式リポジトリ PostgreSQL 15 の場合
sudo vi /var/lib/pgsql/15/data/pg_hba.conf
例: 標準リポジトリの場合
sudo vi /var/lib/pgsql/data/pg_hba.conf
“`
pg_hba.conf ファイルは、各行が認証ルールを表しています。コメント行(# で始まる行)や空行は無視されます。ルールは上から順に評価され、最初に一致したルールが適用されます。
各行の基本的な形式は以下の通りです。
TYPE DATABASE USER ADDRESS METHOD [OPTIONS]
- TYPE: 接続タイプ。
local(Unixドメインソケット),host(TCP/IP接続 – IPv4),hostnossl(TCP/IP接続 – SSLなし),hostssl(TCP/IP接続 – SSLあり),hostgssenc(GSSAPI暗号化接続),hostnogssenc(GSSAPI非暗号化接続) などがあります。 - DATABASE: 接続を許可するデータベース名。
allはすべてのデータベース、sameuserは接続ユーザーと同名のデータベース、sameroleは接続ユーザーがメンバーであるロールと同名のデータベース、replicationはレプリケーション接続を意味します。カンマ区切りで複数指定も可能です。 - USER: 接続を許可するデータベースユーザー名。
allはすべてのユーザーを意味します。カンマ区切りで複数指定も可能です。グループ名(ロール名)を指定する場合、前に+を付けます。 - ADDRESS: 接続元クライアントのアドレス。
localの場合は無視されます。host*の場合は IP アドレス、IP 範囲(CIDR 形式)、ホスト名、またはallが指定できます。127.0.0.1/32: ローカルホスト(IPv4)::1/128: ローカルホスト(IPv6)192.168.1.0/24: 192.168.1.xxx のネットワーク全体0.0.0.0/0: すべての IPv4 アドレス(非推奨!非常に危険)::/0: すべての IPv6 アドレス(非推奨!非常に危険)all: すべてのアドレス(0.0.0.0/0, ::/0と同等)
- METHOD: 認証方法。
trust: パスワードなしで接続許可(非推奨!非常に危険)reject: 接続を拒否md5: MD5 ハッシュによるパスワード認証scram-sha-256: SCRAM-SHA-256 によるパスワード認証(md5より安全、PostgreSQL 10 以降で推奨)ident: クライアントの OS ユーザー名に基づいて認証(local接続でよく使われる)peer: サーバー上のクライアントの OS ユーザー名に基づいて認証(local接続でよく使われる)gssapi,ssapi,pam,ldap,radius,certなど
デフォルト設定の確認:
インストール直後の pg_hba.conf は、多くの場合以下のような設定が含まれています。
“`conf
TYPE DATABASE USER ADDRESS METHOD
“local” is for Unix domain socket connections only
local all all peer
IPv4 local connections:
host all all 127.0.0.1/32 ident
IPv6 local connections:
host all all ::1/128 ident
Allow replication connections from localhost, by a user with the
replication privilege.
local replication all peer
host replication all 127.0.0.1/32 ident
host replication all ::1/128 ident
“`
このデフォルト設定の意味は以下の通りです。
* local (Unixドメインソケット) 接続では、OS ユーザー名とデータベースユーザー名が一致する場合にパスワードなしで接続できます (peer 認証)。これが sudo -u postgres psql でパスワードなしで接続できた理由です。
* host (TCP/IP) 接続では、ローカルホスト (127.0.0.1, ::1) からの接続について、クライアントの OS ユーザー名に基づいて認証されます (ident 認証)。これは通常、ローカル接続では postgres OS ユーザー以外からの接続を許可しないという意味になります。
* レプリケーション接続についても同様の認証設定になっています。
リモートからの接続を許可する設定例:
特定の IP アドレスまたはネットワークからのリモート接続を許可するには、host エントリを追加します。認証方法には md5 またはより安全な scram-sha-256 を推奨します。
例えば、IP アドレス 192.168.1.10 から mydatabase というデータベースに myuser というユーザーがパスワード認証 (scram-sha-256) で接続できるようにする場合:
“`conf
信頼できるクライアントからの接続許可 (IPアドレス指定)
host mydatabase myuser 192.168.1.10/32 scram-sha-256
“`
特定のネットワーク全体(例: 192.168.1.0/24)からのすべてのデータベース、すべてのユーザーの接続をパスワード認証 (md5) で許可する場合:
“`conf
信頼できるネットワークからの接続許可 (CIDR指定)
host all all 192.168.1.0/24 md5
“`
注意: ADDRESS を 0.0.0.0/0 や all に設定すると、インターネット上のどこからでも接続試行が可能になり、非常に危険です。決して 0.0.0.0/0 や all に trust 認証を組み合わせないでください。 必ず信頼できる IP アドレス範囲に限定し、パスワード認証 (md5 or scram-sha-256) を使用してください。
設定変更後、pg_hba.conf を保存します。変更を反映させるには、PostgreSQL サービスを再起動する必要があります。
“`bash
sudo systemctl restart <サービス名>
例: sudo systemctl restart postgresql-15
再起動せずに設定をリロードするコマンドもありますが、`pg_hba.conf` の変更は再起動または設定のリロードが必要です。リロードコマンドは以下の通りです。bash
sudo systemctl reload <サービス名>
“`
ただし、より確実なのは再起動です。
4.3. リスニングアドレスの設定 (postgresql.conf)
postgresql.conf ファイルは、PostgreSQL サーバー自体の動作に関する様々なパラメータを設定するファイルです。データディレクトリ内にあります。
- 標準リポジトリ (CentOS 7/8/Stream):
/var/lib/pgsql/data/postgresql.conf - PostgreSQL 公式リポジトリ:
/var/lib/pgsql/<バージョン>/data/postgresql.conf(例:/var/lib/pgsql/15/data/postgresql.conf)
このファイルを編集して、PostgreSQL がどの IP アドレスからの接続を待ち受けるか(リッスンするか)を設定します。
“`bash
例: 公式リポジトリ PostgreSQL 15 の場合
sudo vi /var/lib/pgsql/15/data/postgresql.conf
例: 標準リポジトリの場合
sudo vi /var/lib/pgsql/data/postgresql.conf
“`
ファイルを開き、listen_addresses パラメータを探します。デフォルトではコメントアウトされているか、'localhost' に設定されていることが多いです。
“`conf
listen_addresses = ‘localhost’ # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; '*' means all
# (change requires restart)
“`
'localhost'(またはコメントアウトされている場合): PostgreSQL はローカルホストからの接続のみを受け付けます(Unixドメインソケットおよび 127.0.0.1/::1 経由)。リモートからの接続はできません。'*': PostgreSQL はサーバーが持つすべてのネットワークインターフェースの IP アドレスからの接続を待ち受けます。これだけではセキュリティリスクにはなりませんが、pg_hba.confでアクセス制御を適切に行うことが必須です。'192.168.1.100': 特定の IP アドレスからの接続のみを待ち受けます。複数の IP アドレスを指定する場合はカンマで区切ります(例:'localhost', '192.168.1.100')。
リモートからの接続を許可したい場合は、listen_addresses を '*' または PostgreSQL サーバーのネットワークインターフェースに割り当てられた特定の IP アドレスに設定する必要があります。
例:すべてのインターフェースでリッスンする場合
conf
listen_addresses = '*'
注意: listen_addresses = '*' に設定した場合、サーバーのどの IP アドレスに接続要求がきても PostgreSQL が応答するようになります。しかし、実際に接続が確立され、認証が成功するかどうかは pg_hba.conf の設定によります。したがって、listen_addresses = '*' と pg_hba.conf で信頼できる IP アドレスからの接続だけを許可するという組み合わせが一般的でセキュアな設定方法です。
設定変更後、postgresql.conf を保存します。listen_addresses の変更は、PostgreSQL サービスの再起動が必要です。
“`bash
sudo systemctl restart <サービス名>
例: sudo systemctl restart postgresql-15
“`
5. データベースとユーザーの作成
PostgreSQL サーバーが稼働し、基本的な認証設定が終わったら、実際にアプリケーションが利用するためのデータベースとユーザーを作成します。デフォルトで存在する postgres データベースと postgres ユーザーは管理用として利用し、アプリケーションごとに専用のデータベースとユーザーを作成するのが良い習慣です。
-
OS の
postgresユーザーとして psql に接続します。
bash
sudo -u postgres psql
または、pg_hba.confでpostgresユーザーにパスワード認証を設定し、listen_addressesを'localhost'以外に設定した場合は、データベースのpostgresユーザーとしてパスワードを入力して接続することも可能です。
bash
psql -U postgres -h localhost -W
# パスワード入力を求められるので、設定したパスワードを入力します。
ただし、サーバー上で作業している場合はsudo -u postgres psqlが最も簡単で推奨されます。 -
新しいデータベースを作成します。
例えば、mydatabaseという名前のデータベースを作成する場合。
sql
CREATE DATABASE mydatabase;
データベース名には英数字、アンダースコアが使用できます。大文字小文字は区別されます(デフォルトでは小文字に変換されますが、ダブルクォートで囲むことで大文字小文字を区別できます)。文字コードやロケールを指定して作成することも可能です。例えば UTF-8 エンコーディングで作成する場合。
sql
CREATE DATABASE mydatabase WITH ENCODING 'UTF8' LC_COLLATE='en_US.UTF-8' LC_CTYPE='en_US.UTF-8' TEMPLATE=template0;
template0を元にすることで、現在のロケールの影響を受けない「まっさらな」データベースを作成できます。一般的には UTF-8 を使用することが推奨されます。 -
新しいデータベースユーザー(ロール)を作成します。
PostgreSQL では「ユーザー」と「ロール」は同じ概念です。ここではmyuserという名前のユーザーを作成し、パスワードを設定します。
sql
CREATE USER myuser WITH PASSWORD 'mypassword';
'mypassword'は設定したいパスワードに置き換えてください。ユーザー作成時に、様々な権限(属性)を付与できます。
*SUPERUSER: データベース全体に対する無制限の権限(postgresユーザーが持つ権限)。慎重に使用する必要があります。
*CREATEDB: 新しいデータベースを作成できる権限。
*CREATEROLE: 新しいロールを作成できる権限。
*LOGIN: データベースにログインできる権限。(デフォルトで付与されます)
*REPLICATION: レプリケーションに関連する権限。例:データベース作成権限を持つユーザーを作成する場合
sql
CREATE USER newadmin WITH CREATEDB PASSWORD 'anotherpassword'; -
作成したユーザーにデータベースへの権限を付与します。
デフォルトでは、作成したデータベースは所有者(通常はデータベースを作成したユーザー、つまりここではpostgres)とスーパーユーザーのみがアクセスできます。他のユーザーがアクセスできるように、権限を付与する必要があります。
myuserがmydatabaseに対するすべての権限を持てるようにする場合:
sql
GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser;
特定の権限(例:CONNECT)のみを付与することも可能です。 -
psql を終了します。
sql
\q
これで、mydatabase というデータベースが作成され、myuser というユーザーがパスワード 'mypassword' でそのデータベースに接続・操作できるようになりました。
psql の便利なコマンド
psql コマンドラインクライアントには、データベースの状態を確認するための便利なメタコマンド(\ で始まるコマンド)があります。
\l: 存在するすべてのデータベースを一覧表示します。\du: 存在するすべてのユーザー(ロール)とその属性を一覧表示します。\c <データベース名>: 接続するデータベースを切り替えます。例:\c mydatabase\d: 現在のデータベース内のテーブル、ビュー、シーケンスなどを一覧表示します。\dt: 現在のデータベース内のテーブルのみを一覧表示します。\dn: 現在のデータベース内のスキーマを一覧表示します。\?: psql のメタコマンド一覧と簡単な説明を表示します。\h: SQL コマンドのヘルプを表示します。例:\h CREATE TABLE
これらのコマンドを活用して、作成したデータベースやユーザーが正しく設定されているか確認しましょう。
6. ファイアウォールの設定
PostgreSQL サーバーがリモートからの接続を受け付けるように設定した場合 (listen_addresses = '*' など)、CentOS サーバー上で稼働しているファイアウォールがその接続をブロックしないように設定する必要があります。CentOS 7 以降では FirewallD が標準のファイアウォール管理ツールとして使用されています。
PostgreSQL のデフォルトのポート番号は 5432/tcp です。
-
FirewallD の状態を確認します。
bash
sudo systemctl status firewalld
active (running)と表示されていれば FirewallD が有効になっています。 -
PostgreSQL が使用するポート (5432/tcp) を開放します。
FirewallD の設定は、--permanentオプションを付けることで永続化されます。オプションを付けない場合は、サーバー再起動で設定が失われます。
bash
sudo firewall-cmd --permanent --add-port=5432/tcp
特定の送信元 IP アドレスやネットワークからの接続のみを許可する場合は、--add-sourceオプションを組み合わせます。
例:IP アドレス192.168.1.10からのみ 5432 ポートへのアクセスを許可する場合
bash
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.10" port protocol="tcp" port="5432" accept'
例:ネットワーク192.168.1.0/24からのみ 5432 ポートへのアクセスを許可する場合
bash
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="5432" accept'
注意:--add-port=5432/tcpだけでは、すべての IP アドレスからの 5432 ポートへの接続が許可されてしまいます。pg_hba.confで適切にアクセス元を制限している前提ですが、セキュリティグループやネットワークACL、FirewallD の--add-sourceや rich-rule などで、サーバーへの接続元自体を絞るのがより安全です。 -
設定を反映させます。
--permanentオプションで変更した設定は、FirewallD をリロードするか、サービスを再起動することで有効になります。
bash
sudo firewall-cmd --reload -
設定が反映されたか確認します。
許可されたポートやルールの一覧を表示して確認します。
bash
sudo firewall-cmd --list-ports
sudo firewall-cmd --list-rich-rules
これで、FirewallD によって PostgreSQL のポートが適切に開放されました。クライアントからの接続が、まず FirewallD を通過し、次に pg_hba.conf のルールに基づいて認証されることになります。
7. 接続テスト
インストール、初期化、サービス起動、基本設定、ファイアウォール設定が完了したら、実際にクライアントからデータベースに接続できるかテストを行います。
7.1. ローカルからの接続テスト
サーバー上で、作成したユーザー (myuser) とデータベース (mydatabase) を使用して接続してみます。
bash
psql -U myuser -d mydatabase -h localhost -W
* -U myuser: ユーザー名を指定
* -d mydatabase: 接続するデータベース名を指定
* -h localhost: 接続先ホストを指定 (localhost または 127.0.0.1)。listen_addresses が 'localhost' 以外になっていることを確認してください。
* -W: パスワード入力を促します。
パスワードの入力を求められたら、myuser に設定したパスワードを入力します。成功すると mydatabase=> というプロンプトが表示されます。
\q で終了できます。
7.2. リモートからの接続テスト
別のクライアントマシンから、PostgreSQL サーバーに接続してみます。クライアントマシンにも PostgreSQL クライアントツール(psql など)がインストールされている必要があります。
bash
psql -U myuser -d mydatabase -h <PostgreSQLサーバーのIPアドレス> -W
* -h <PostgreSQLサーバーのIPアドレス>: PostgreSQL サーバーの実際の IP アドレスを指定します。
パスワードの入力を求められたら、myuser に設定したパスワードを入力します。
接続に失敗した場合のチェックリスト:
- PostgreSQL サービスは起動していますか? サーバーで
sudo systemctl status <サービス名>を確認。 postgresql.confのlisten_addressesは適切に設定されていますか?'*'またはサーバーの IP アドレスになっている必要があります。変更した場合は PostgreSQL サービスを再起動しましたか?pg_hba.confに、接続元の IP アドレス、接続ユーザー、接続データベース、認証方法 (md5orscram-sha-256など) が一致するルールがありますか? 変更した場合は PostgreSQL サービスを再起動またはリロードしましたか?- ファイアウォール (FirewallD) は、PostgreSQL のポート (5432/tcp) への接続を許可していますか? 特に、接続元の IP アドレスまたはネットワークからの接続が許可されているか確認してください。FirewallD の設定変更後に
firewall-cmd --reloadを実行しましたか? - 入力したユーザー名、データベース名、パスワードは正しいですか? 大文字小文字も区別されます。
- サーバー、クライアント間のネットワーク経路に問題はありませんか?
ping <PostgreSQLサーバーのIPアドレス>やtelnet <PostgreSQLサーバーのIPアドレス> 5432(telnet コマンドがない場合はnc -zv <PostgreSQLサーバーのIPアドレス> 5432) でポートに到達可能か確認できます。telnet や nc で接続できたとしても、それはファイアウォールを通過できただけであり、認証や PostgreSQL の設定の問題は別途確認が必要です。
これらの項目を順に確認することで、接続できない原因を特定できます。
8. 基本的な運用と管理
PostgreSQL サーバーが正常に稼働したら、日々の運用に必要な基本的な管理作業について知っておきましょう。
8.1. サービスの管理
PostgreSQL サービスの起動、停止、再起動は systemctl コマンドで行います。
“`bash
サービスの停止
sudo systemctl stop <サービス名>
サービスの起動
sudo systemctl start <サービス名>
サービスの再起動
sudo systemctl restart <サービス名>
設定のリロード (設定ファイル変更時に再起動が不要な場合)
sudo systemctl reload <サービス名>
サービスのステータス確認
sudo systemctl status <サービス名>
システム起動時の自動起動設定
sudo systemctl enable <サービス名>
sudo systemctl disable <サービス名>
``<サービス名>はインストール方法によってpostgresqlまたはpostgresql-<バージョン>` です。
8.2. ログファイルの確認
PostgreSQL のエラーや警告、アクティビティログはログファイルに記録されます。問題発生時の調査に不可欠です。ログファイルの場所は postgresql.conf の log_directory パラメータで設定されます。デフォルトではデータディレクトリ内の log サブディレクトリになっていることが多いです。
- 標準リポジトリ (CentOS 7/8/Stream):
/var/lib/pgsql/data/log/ - PostgreSQL 公式リポジトリ:
/var/lib/pgsql/<バージョン>/data/log/(例:/var/lib/pgsql/15/data/log/)
ログファイル名には日付などが含まれることが一般的です。tail コマンドなどで最新のログを確認できます。
bash
tail /var/lib/pgsql/15/data/log/postgresql-Mon.log
または journalctl でも PostgreSQL のログを確認できます。
bash
sudo journalctl -u <サービス名>
8.3. バックアップとリストア
データベースのバックアップは最も重要な運用作業の一つです。PostgreSQL には論理バックアップツール pg_dump と物理バックアップ(PITR – Point-In-Time Recovery)のための WAL (Write-Ahead Logging) アーカイブ機能などがありますが、ここでは基本的な論理バックアップとリストアのコマンドを紹介します。
データベース全体のバックアップ:
pg_dump コマンドを使用します。データベースユーザー、接続先ホスト、データベース名を指定します。バックアップファイルは標準出力に出力されるため、ファイルにリダイレクトします。
“`bash
OSユーザー postgres として実行(パスワード不要)
sudo -u postgres pg_dump mydatabase > mydatabase_backup_$(date +%Y%m%d).sql
または、パスワード認証を使用する場合
pg_dump -U myuser -h localhost mydatabase > mydatabase_backup_$(date +%Y%m%d).sql
パスワード入力を求められます
``$(date +%Y%m%d)` をファイル名に含めることで、実行日ごとに異なるファイル名を付けられます。
バックアップからのリストア:
psql コマンドを使用して、バックアップファイルからリストアします。リストア先のデータベースは事前に作成しておく必要があります。
“`bash
OSユーザー postgres として実行
sudo -u postgres psql -d mydatabase -f mydatabase_backup_20231027.sql
または、パスワード認証を使用する場合
psql -U myuser -h localhost -d mydatabase -f mydatabase_backup_20231027.sql
パスワード入力を求められます
``-d mydatabaseでリストア先のデータベースを指定します。-f` オプションで入力ファイル(バックアップファイル)を指定します。
大規模なデータベースの場合や、パフォーマンスが重要な場合は、pg_dumpall (全データベースのバックアップ), カスタム形式でのバックアップ (pg_dump -F c) と pg_restore を使用する方法、物理バックアップなど、より高度なバックアップ・リストア戦略を検討する必要があります。
9. セキュリティに関する考慮事項
データベースは重要な情報資産を格納するため、セキュリティには十分な配慮が必要です。以下は基本的なセキュリティに関する考慮事項です。
postgresユーザーのパスワード設定: デフォルトのスーパーユーザーpostgresには必ずパスワードを設定し、強固なパスワードを使用します。pg_hba.confでのアクセス元制限: 信頼できる IP アドレスまたはネットワークからのみ接続を許可するように設定します。インターネット上のどこからでも接続できるような設定 (0.0.0.0/0やallにmd5/scram-sha-256認証) は、パスワードが漏洩した場合に大きなリスクとなります。可能な限りアクセス元を絞り込みます。listen_addressesの適切な設定: 必要なネットワークインターフェースでのみリッスンするように設定します。- 不要なユーザーの削除または権限制限: アプリケーションや管理に必要な最小限のユーザーのみを作成し、各ユーザーに必要な最小限の権限のみを付与します。不要になったユーザーは削除します。
- データベースユーザーのパスワードポリシー: アプリケーションで使用するデータベースユーザーについても、推測されにくい強力なパスワードを設定し、定期的な変更ポリシーを検討します。パスワードを平文でアプリケーションコードに埋め込まないよう、安全な管理方法を採用します。
- SSL 接続の有効化: クライアントとサーバー間の通信を暗号化するために、SSL 接続を有効化することを強く推奨します。これにより、通信経路でのデータの盗聴や改ざんを防ぐことができます。
postgresql.confでssl = onを設定し、適切なサーバー証明書と秘密鍵を配置する必要があります。クライアント側も SSL 接続を有効にして接続します。 - PostgreSQL の定期的なアップデート: セキュリティの脆弱性への対策やバグ修正が含まれているため、PostgreSQL 本体および関連パッケージを定期的にアップデートします。
- OS 自体のセキュリティ強化: データベースサーバーとして使用する CentOS のセキュリティも重要です。OS の定期的なアップデート、不要なサービスの停止、SSH へのアクセス制限(公開鍵認証のみ、特定ユーザー/IP からのみ許可など)、侵入検知システム(IDS)の導入などを検討します。SELinux を Enforcing モードで適切に運用することもセキュリティ強化につながります。
10. トラブルシューティング
インストールや設定の途中で問題が発生した場合の一般的なトラブルシューティング方法です。
-
インストール失敗:
- パッケージマネージャー (
dnforyum) のエラーメッセージをよく読みます。依存関係の問題やリポジトリの設定ミスが多いです。 - リポジトリ設定ファイル (
/etc/yum.repos.d/) を確認し、特に公式リポジトリを追加した場合は、標準リポジトリのモジュール無効化が正しく行われているか確認します (CentOS 8/Stream)。 - ネットワーク接続を確認します(リポジトリからパッケージをダウンロードできるか)。
- パッケージマネージャー (
-
PostgreSQL サービス起動失敗:
- 最も重要なのはログファイルの確認です。
sudo journalctl -u <サービス名> --since "1 hour ago" -xeコマンドで詳細なログを確認します。エラーメッセージが原因を示していることが多いです。 - 初期化は実行しましたか? 初期化されていないデータディレクトリではサービスは起動できません。
- データディレクトリ (
/var/lib/pgsql/data/など) の所有者とパーミッションが OS のpostgresユーザーに適切に設定されているか確認します。 postgresql.confファイルに構文エラーがないか確認します。- SELinux が有効な場合、ログに
AVC deniedのようなメッセージが出ていないか確認します。SELinux が原因の場合は、適切なポリシーを追加するか、一時的に Permissive モードにして切り分けを行います。 - 他のプロセス(他のデータベースなど)がすでに 5432 ポートを使用していませんか?
sudo ss -tulnp | grep 5432などで確認できます。
- 最も重要なのはログファイルの確認です。
-
クライアントからの接続失敗:
- サーバー側の PostgreSQL サービスは起動していますか?
- クライアントからサーバーの 5432 ポートに到達可能ですか? ファイアウォールやネットワーク経路を確認します (
telnetまたはncでの接続テスト)。 postgresql.confのlisten_addressesがリモートからの接続を受け付ける設定になっていますか?pg_hba.confに、接続元の IP アドレス、ユーザー名、データベース名、そして使用している認証方法(パスワード認証など)が一致するルールがありますか?- クライアント側で指定した接続情報(ホスト名/IP、ポート番号、データベース名、ユーザー名、パスワード)は正しいですか?
- パスワード認証を使用している場合、入力したパスワードは正しいですか?
11. まとめ
この記事では、CentOS に PostgreSQL をインストールするための詳細な手順を解説しました。OS 標準リポジトリからのインストール方法と、PostgreSQL 公式リポジトリからのインストール方法という、主に二つのアプローチを紹介し、それぞれの利点と欠点に触れました。
インストール後は、データベースクラスターの初期化、PostgreSQL サービスの起動と自動起動設定を行いました。さらに、データベースサーバーとして安全かつ実用的に運用するために不可欠な初期設定、特に postgres スーパーユーザーのパスワード設定、クライアント認証を制御する pg_hba.conf の編集、そしてリスニングアドレスを設定する postgresql.conf の編集手順を詳しく解説しました。
また、アプリケーションが使用するための新しいデータベースとユーザーの作成方法、そしてファイアウォール (FirewallD) の設定によるポート開放についても手順を示しました。これらの設定が正しく行われたかを確認するため、ローカルおよびリモートからの接続テスト方法も説明しました。
最後に、データベースの基本的な運用(サービスの管理、ログ確認、バックアップ・リストア)と、セキュリティに関する重要な考慮事項、そしてインストールや設定中に発生しがちな問題とそのトラブルシューティング方法についても触れました。
PostgreSQL は非常に高機能でカスタマイズ可能なデータベースシステムです。この記事で解説した手順は、PostgreSQL を使い始めるための基礎となります。ここからさらに、パフォーマンスチューニング、レプリケーションによる可用性の向上、高可用性クラスターの構築、監視ツールの導入、PostGIS のような拡張機能の利用など、PostgreSQL の能力を最大限に引き出すための様々なステップに進むことができます。
データベースの運用は継続的な学習と改善が必要です。PostgreSQL の公式ドキュメントは非常に充実しており、様々な情報源やコミュニティも存在します。この記事が、あなたの PostgreSQL 環境構築の第一歩となり、今後の学習や運用の一助となれば幸いです。
安全で安定した PostgreSQL データベース環境を構築し、活用してください。