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 パッケージがインストールされていることを前提としています。
  1. 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 が表示されています。本例で使用する新しいデータベース格納場所が期待通り正常に動作するよう、このコンテキストをその新しい場所に手作業で適用する必要があります。
  2. データベース格納場所となるディレクトリを新規作成します。この例では /opt/postgresql/data を使用しています。別の場所を使用する場合は、次のコマンドを使用する際に置換してください。
    # mkdir -p /opt/postgresql/data
    
  3. 新規に作成したディレクトリを表示させまます。このディレクトリの初期コンテキストは usr_t になっている点に注意してください。このコンテキストでは、SELinux による PostgreSQL への保護メカニズムを実施するには不十分です。コンテキストを変更することにより、新規に作成したディレクトリをデータ格納場所として適切に動作させることができるようになります。
    # ls -lZ /opt/postgresql/
    drwxr-xr-x. root root unconfined_u:object_r:usr_t:s0   data
    
  4. postgres ユーザーおよび postgres グループによるアクセスを許可するため所有権を変更します。この変更は従来の Unix パーミッションに対する変更であり、SELinux による制限はそのまま変更されていません。
    # chown -R postgres:postgres /opt/postgresql
    
  5. テキストエディターで PostgreSQL の初期設定ファイル /etc/rc.d/init.d/postgresql を開き、新しい場所をポイントするよう PGDATAPGLOG を変更します。
    # vi /etc/rc.d/init.d/postgresql
    PGDATA=/opt/postgresql/data
    PGLOG=/opt/postgresql/data/pgstartup.log
    
    このファイルを保存してからテキストエディターを終了します。
  6. 新しい場所にあるデータベースを初期化します。
    su - postgres -c "initdb -D /opt/postgresql/data"
    
  7. データベースの場所を変更したことにより、サービスの起動に失敗します。
    # service postgresql start
    Starting postgresql service: 			[FAILED]
    
    サービスが起動しない原因は SELinux にあります。新しい場所に適切なラベル付けが行なわれていないためです。以下の手順で、新しい場所 (/opt/postgresql) にラベルを付け、postgresql サービスを正常に起動させます。
  8. semanage コマンドを実行し、/opt/postgresql および配下にあるすべてのディレクトリとファイルに対するコンテキストマッピングを追加します。
    semanage fcontext -a -t postgresql_db_t "/opt/postgresql(/.*)?"
    
  9. このマッピングは /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
    
  10. restorecon コマンドを使ってこのコンテキストマッピングを実行中のシステムに適用します。
    restorecon -R -v /opt/postgresql
    
  11. これで /opt/postgresql のデータ格納場所に PostgreSQL 用の正しいコンテキストがラベル付けされました。postgresql サービスが正常に起動するようになります。
    # service postgresql start
    Starting postgreSQL service:                                            [  OK  ]
    
  12. コンテキストが確かに /opt/postgresql 用に正しく変更されているか確認します。
    ls -lZ /opt
    drwxr-xr-x. root root system_u:object_r:postgresql_db_t:s0 postgresql
    
  13. 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
  14. データ格納場所の変更そしてラベル付けが正しく行なわれたため、postgresql デーモンが正常に起動するようになりました。ここまでの設定が完了したら、実行中の全サービスが正常に動作しているか確認テストを行なってください。