Rocky 9にてPostgreSQLをインストールし、DBクラスター作成する際、SELinux設定に注意すべき点

Linux Server

Rocky Linux 9にPostgreSQLをインストールし、DBクラスターを作成する際、SELinuxに関して注意すべき主なポイントは次の通りです。


SELinuxの状態を確認

最初にSELinuxが有効か確認しましょう。

$ sudo getenforce
  • 出力がEnforcingならSELinuxが有効です。
  • 出力がPermissiveDisabledなら、一時的または恒久的に無効になっています。
  • permissiveは、ポリシー違反の場合でもアクセスを遮断せず、ログに記録するだけの動作モードです。

本番は Enforcing で運用することを推奨します。


SELinuxのポリシー(モジュール)を確認・追加

Rocky Linux 9では標準でPostgreSQL向けのSELinuxポリシーモジュールが用意されていますが、特定用途やディレクトリをカスタマイズする場合は、手動でポリシーを調整する必要があります。

標準のポリシーがあるかを確認します。

$ sudo semanage fcontext -l | grep postgresql
…中間省略…
/var/lib/pgsql(/.*)?             all files system_u:object_r:postgresql_db_t:s0 
/var/lib/pgsql/.*\.log           all files system_u:object_r:postgresql_log_t:s0 
/var/lib/pgsql/data/log(/.*)?    all files system_u:object_r:postgresql_log_t:s0 
/var/lib/pgsql/data/pg_log(/.*)? all files system_u:object_r:postgresql_log_t:s0 
…中間省略…
  • 通常、/var/lib/pgsql(/.*)? 等が含まれます。

DBクラスターのディレクトリ配置に注意

PostgreSQLのデータベースクラスターを標準パス(/var/lib/pgsql)以外の場所(例:/data/pgsql)に作成する場合は、SELinuxのコンテキストを適切に設定する必要があります。

例えば、/data/pgsql 配下にクラスタを作成するなら以下のように変更します。

# コンテキスト設定を確認、結果に何もなければ、
$ sudo ls -Z /data

# コンテキストをpostgresql_db_tに変更(再帰的)
$ sudo semanage fcontext -a -t postgresql_db_t "/data/pgsql(/.*)?"
$ sudo restorecon -Rv /data/pgsql

コンテキスト設定の変更後はPostgreSQLがそのディレクトリにアクセス可能になります。


SELinuxを考慮せずに起こる問題の例

SELinuxの設定が間違っていると、以下のようなトラブルが発生します。

  • PostgreSQLの起動に失敗する
  • データベースに接続できない
  • クラスタの作成時に権限エラーが表示される

トラブルシューティング例

/var/log/audit/audit.log を確認すると、拒否ログを見つけることができます。

$ sudo ausearch -m AVC,USER_AVC -ts recent
<no matches>

原因がSELinuxの場合、ログに明確に表示されます。


対策手順 (SELinux設定例)

1)SELinuxコンテキストをセットする

## 例えば、データディレクトリが/data/pgsql の場合
$ sudo semanage fcontext -a -t postgresql_db_t "/data/pgsql(/.*)?"
$ sudo restorecon -Rv /data/pgsql

2) SELinuxの許可設定を調整

データベースがデフォルトポート(5432)以外を利用する場合以下のように許可します。

## 例: 5433ポートを許可する場合
$ sudo semanage port -a -t postgresql_port_t -p tcp 5433
## 設定内容の確認
$ sudo semanage port -l | grep 5433
postgresql_port_t              tcp      5435, 5434, 5433, 5432, 9898

3) SELinuxモジュール作成(特殊な場合)

どうしても問題が解決しない場合、auditログを元に専用モジュールを作成します。

$ sudo ausearch -c postgres --raw | audit2allow -M postgresql_custom
$ sudo semodule -i postgresql_custom.pp

※これはあくまで最終手段です。まずは標準コンテキストでの運用を推奨します。


コメント

タイトルとURLをコピーしました