22.4. 設定例

22.4.1. PostgreSQL のデータベース格納場所を変更する

Red Hat Enterprise Linux を使用する場合、PostgreSQL のデフォルトのデータベース格納場所は /var/lib/pgsql/data/ になります。SELinux はこの場所にこのデータベースがデフォルトで配置されることを予期しているので、この領域にはすでに postgresql_db_t タイプを使った適切なラベル付けが行われています。
データベースを格納する場所は、個別の環境要件や設定に応じて変更することもできますが、適切にラベル付けを行い、SELinux が変更後の新しい場所を認識することが重要となります。以下の例では、PostgreSQL データベースの格納場所を変更する方法、また この新しい格納場所にラベルをつけて SELinux がコンテンツに基づいて保護メカニズムを適用できるようにする方法を説明します。
以下に示す例は、PostgreSQL に対してどのように SELinux が影響を与えることができるのかを示す一例に過ぎません。PostgreSQL に関する総合的な説明は本ガイドの対象外となります。詳細については、公式の PostgreSQL ドキュメント を参照してください。ここでは、postgresql-server パッケージがインストールされていることを前提としています。
  1. 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. テキストエディターで /etc/systemd/system/postgresql.service ファイルを開き、新しい場所を指定するように PGDATAPGLOG 変数を変更します。
    ~]# vi /etc/systemd/system/postgresql.service
    PGDATA=/opt/postgresql/data
    PGLOG=/opt/postgresql/data/pgstartup.log
    ファイルを保存して、テキストエディターを終了します。
    /etc/systemd/system/postgresql.service ファイルが存在しない場合は作成し、以下の内容を追加します。
    .include /lib/systemd/system/postgresql.service
    [Service]
    
    # Location of database directory
    Environment=PGDATA=/opt/postgresql/data
    Environment=PGLOG=/opt/postgresql/data/pgstartup.log
  6. 新しい場所にあるデータベースを初期化します。
    ~]$ su - postgres -c "initdb -D /opt/postgresql/data"
  7. データベースの場所を変更したことで、この時点ではサービスの起動に失敗します。
    ~]# systemctl start postgresql.service
    Job for postgresql.service failed. See 'systemctl status postgresql.service' and 'journalctl -xn' for details.
    サービスが起動しない原因は 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 サービスが正常に起動するようになります。
    ~]# systemctl start postgresql.service
  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 が正常に起動するようになりました。この時点で、実行中の全サービスが正常に動作しているかテストしてください。

このページには機械翻訳が使用されている場合があります (詳細はこちら)。