11.4. 設定例
11.4.1. PostgreSQL のデータベース格納場所を変更する
Red Hat Enterprise Linux 6 を使用する場合、PostgreSQL のデフォルトのデータベース格納場所は
/var/lib/pgsql/data
になります。この場所は SELinux でデータベースが配置される場所として期待される場所となるため、この領域にはすでに postgresql_db_t
タイプを使った適切なラベル付けが行なわれています。
データベースを格納する場所は、それぞれの環境要件や設定に応じて変更することもできますが、SELinux に変更後の新しい場所を認識させる、つまりラベル付けを行なうことが重要となります。PostgreSQL データベースの格納場所を変更する方法、また SELinux によるコンテンツに応じた保護メカニズムを新しい格納場所にも適用できるようラベル付けを行なう方法を以下の例で説明していきます。
以下に示す例は、PostgreSQL に対してどのように SELinux が影響を与えることができるのかを示す一例に過ぎません。PostgreSQL に関する総合的な説明は本ガイドの範疇を越えてしまいますので、詳細については、公式の PostgreSQL ドキュメント を参照してください。ここでは、postgresql-server パッケージがインストールされていることを前提としています。
ls -lZ /var/lib/pgsql
を実行し、postgresql
デフォルトデータベース格納場所の SELinux コンテキストを表示させます。# ls -lZ /var/lib/pgsql drwx------. postgres postgres system_u:object_r:postgresql_db_t:s0 data
データベースファイルの格納場所にデフォルトで付けられるコンテキストエレメントのpostgresql_db_t
が表示されています。本例で使用する新しいデータベース格納場所が期待通り正常に動作するよう、このコンテキストをその新しい場所に手作業で適用する必要があります。- データベース格納場所となるディレクトリを新規作成します。この例では
/opt/postgresql/data
を使用しています。別の場所を使用する場合は、次のコマンドを使用する際に置換してください。# mkdir -p /opt/postgresql/data
- 新規に作成したディレクトリを表示させまます。このディレクトリの初期コンテキストは usr_t になっている点に注意してください。このコンテキストでは、SELinux による PostgreSQL への保護メカニズムを実施するには不十分です。コンテキストを変更することにより、新規に作成したディレクトリをデータ格納場所として適切に動作させることができるようになります。
# ls -lZ /opt/postgresql/ drwxr-xr-x. root root unconfined_u:object_r:usr_t:s0 data
- postgres ユーザーおよび postgres グループによるアクセスを許可するため所有権を変更します。この変更は従来の Unix パーミッションに対する変更であり、SELinux による制限はそのまま変更されていません。
# chown -R postgres:postgres /opt/postgresql
- テキストエディターで PostgreSQL の初期設定ファイル
/etc/rc.d/init.d/postgresql
を開き、新しい場所をポイントするようPGDATA
とPGLOG
を変更します。# vi /etc/rc.d/init.d/postgresql PGDATA=/opt/postgresql/data PGLOG=/opt/postgresql/data/pgstartup.log
このファイルを保存してからテキストエディターを終了します。 - 新しい場所にあるデータベースを初期化します。
su - postgres -c "initdb -D /opt/postgresql/data"
- データベースの場所を変更したことにより、サービスの起動に失敗します。
# service postgresql start Starting postgresql service: [FAILED]
サービスが起動しない原因は SELinux にあります。新しい場所に適切なラベル付けが行なわれていないためです。以下の手順で、新しい場所 (/opt/postgresql
) にラベルを付け、postgresql サービスを正常に起動させます。 semanage
コマンドを実行し、/opt/postgresql
および配下にあるすべてのディレクトリとファイルに対するコンテキストマッピングを追加します。semanage fcontext -a -t postgresql_db_t "/opt/postgresql(/.*)?"
- このマッピングは
/etc/selinux/targeted/contexts/files/file_contexts.local
ファイルに書き込まれます。# grep -i postgresql /etc/selinux/targeted/contexts/files/file_contexts.local /opt/postgresql(/.*)? system_u:object_r:postgresql_db_t:s0
restorecon
コマンドを使ってこのコンテキストマッピングを実行中のシステムに適用します。restorecon -R -v /opt/postgresql
- これで
/opt/postgresql
のデータ格納場所に PostgreSQL 用の正しいコンテキストがラベル付けされました。postgresql
サービスが正常に起動するようになります。# service postgresql start Starting postgreSQL service: [ OK ]
- コンテキストが確かに
/opt/postgresql
用に正しく変更されているか確認します。ls -lZ /opt drwxr-xr-x. root root system_u:object_r:postgresql_db_t:s0 postgresql
ps
コマンドを使って、postgresql
プロセスで新しい場所が表示されるか確認します。# ps aux | grep -i postmaster postgres 21564 0.3 0.3 42308 4032 ? S 10:13 0:00 /usr/bin/postmaster -p 5432 -D /opt/postgresql/data
- データ格納場所の変更そしてラベル付けが正しく行なわれたため、
postgresql
デーモンが正常に起動するようになりました。ここまでの設定が完了したら、実行中の全サービスが正常に動作しているか確認テストを行なってください。