Fedora ServerへのPostgreSQLデプロイ:SELinuxとFirewalldによるセキュリティ強化

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

適切なPostgreSQLデプロイ方法の選択

Fedora Serverでデータベースを構築するのは、単にインストールコマンドを実行するだけではありません。安定性や最新機能へのニーズに応じて、私は通常以下の3つのアプローチを検討します。

方法 メリット デメリット
AppStream (デフォルト) 高い安定性、SELinuxとの完璧な互換性。 バージョンが本家より半年から1年ほど遅れる。
PGDG Repo (公式) 最新のパッチや機能を即座に適用可能。 リポジトリの手動管理が必要。設定を誤ると競合が発生しやすい。
Podman (コンテナ) 隔離性が高く、複数バージョンを並行稼働できる。 ネットワーク仮想化レイヤーにより、I/Oパフォーマンスが3〜5%低下する可能性がある。

Fedoraを実際のプロジェクトで2年間運用した経験から、私はPGDGリポジトリを推奨します。この方法なら、JSONBの改善やロジカルレプリケーションなどの最新機能を待たずに利用できます。以下に、パフォーマンスとセキュリティの両立を考慮したデプロイ手順を示します。

ステップ1:公式リポジトリからのインストール

FedoraにはデフォルトでPostgreSQLモジュールが含まれています。混乱を避けるため、公式リポジトリを追加する前にこのモジュールを無効にする必要があります。

# 競合を避けるためにデフォルトモジュールを無効化
sudo dnf -qy module disable postgresql

# Fedora用のPGDGリポジトリを追加
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/F-$(rpm -E %fedora)-x86_64/pgdg-fedora-repo-latest.noarch.rpm

# バージョン16(現時点で最も安定)をインストール
sudo dnf install -y postgresql16-server postgresql16-contrib

インストール完了後、データベースクラスタを初期化します。このコマンドにより、ディレクトリ構造と必要なシステムファイルが作成されます。

sudo /usr/pgsql-16/bin/postgresql-16-setup initdb

ステップ2:Firewalldの設定 — 必要なポートのみ開放

Fedora Serverはポート管理が非常に厳格です。5432ポートをネットワーク全体に開放するのではなく、信頼できるIP(アプリケーションサーバーなど)のみにアクセスを制限しましょう。

# 安全な方法:特定のIP(例:Webサーバーの10.0.0.5)のみ許可
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port protocol="tcp" port="5432" accept'

# 信頼できる内部ネットワークで使用する場合
sudo firewall-cmd --add-service=postgresql --permanent

sudo firewall-cmd --reload

ステップ3:SELinuxを無効化せず、正しく制御する

多くの管理者は「Permission Denied」エラーを避けるためにSELinuxを無効にしがちですが、これはセキュリティ上の重大な過ちです。もしデータ保存先を別のディスク(例:/mnt/data/postgres)に変更した場合、ラベルが正しくないためSELinuxがサービスをブロックします。

以下のコマンドを使用して正しいラベルを割り当てることで、安全性を保ちながらPostgreSQLをスムーズに動作させることができます。

# 新しいデータディレクトリにセキュリティラベルを割り当て
sudo semanage fcontext -a -t postgresql_db_t "/mnt/data/postgres(/.*)?"
sudo restorecon -Rv /mnt/data/postgres

アプリケーションがメール通知を送信したり、外部に接続したりする必要がある場合は、以下の権限も有効にします:

sudo setsebool -P postgresql_can_network_connect 1

ステップ4:安全なリモートアクセスの設定

デフォルトの設定ファイルではローカル接続のみが許可されています。暗号化を確保しつつ、外部からの接続を待ち受けるように調整する必要があります。

1. postgresql.confの編集

localhost*に変更して、すべてのネットワークインターフェース for 待ち受けます:

listen_addresses = '*' 

2. pg_hba.confでの認証設定

決してtrustpassword(平文)を使用しないでください。ログイン情報を保護するためにscram-sha-256を使用します。

# 強力な暗号化パスワードを使用して内部IPレンジからのアクセスを許可
host    all             all             10.0.0.0/24             scram-sha-256

サービスを有効化して変更を適用します:

sudo systemctl enable --now postgresql-16

実際の運用から得られた最適化のヒント

しばらく運用を続ける中で、いくつかの微調整がパフォーマンスに大きな違いをもたらすことに気づきました:

  • Huge Pagesの活用: RAMが16GB以上のサーバーでは、huge_pages = tryに設定します。これにより、CPUのメモリ管理オーバーヘッドが削減され、クエリ速度が約10〜15%向上します。
  • ログ管理: PostgreSQLは制御しないと数十GBのログファイルを生成することがあります。ディスク容量の突然の枯渇を防ぐため、log_rotation_age = 1dおよびlog_rotation_size = 100MBを設定しましょう。
  • トラブルシューティング: データベースが起動しない場合は、推測に頼らず、journalctl -u postgresql-16を実行するか、ausearch -m avc -ts recentでSELinuxのログを確認してください。

FedoraへのPostgreSQLのデプロイには、SELinuxやFirewalldに関する細心の注意が必要です。しかし、一度正しく設定してしまえば、重要なプロダクションアプリケーションを支える非常に堅牢なシステムを手に入れることができます。

Share: