Rocky Linux 9にPostgreSQLをインストールし、DBクラスターを作成する際、SELinuxに関して注意すべき主なポイントは次の通りです。
SELinuxの状態を確認
最初にSELinuxが有効か確認しましょう。
$ sudo getenforce
- 出力が
Enforcing
ならSELinuxが有効です。 - 出力が
Permissive
やDisabled
なら、一時的または恒久的に無効になっています。 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
※これはあくまで最終手段です。まずは標準コンテキストでの運用を推奨します。
コメント