Menu Close

Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

21.4. 設定の例

21.4.1. PostgreSQL がデータベースの場所の変更

Red Hat Enterprise Linux を使用する場合、PostgreSQL のデフォルトの場所は /var/lib/pgsql/data/ になります。これは、デフォルトで SELinux が想定されるため、postgresql _db_t タイプを使用して、この領域はすでに適切にラベル付けされています。
データベースがあるエリアは、個々の環境要件または設定に応じて変更できますが、SELinux はこの新しい場所を認識することが重要です。それに応じて、そのラベルが付けられます。この例では、PostgreSQL データベースの場所を変更し、SELinux がコンテンツに基づいて新しい領域に保護メカニズムを提供できるように、新しい場所にラベルを付ける方法を説明します。
これは単なる例であり、SELinux が PostgreSQL にどのように影響するかを実証することに注意してください。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 ユーザーおよびグループがアクセスできるようにします。これにより、SELinux が引き続き監視する従来の Unix パーミッションが設定されます。
    ~]# chown -R postgres:postgres /opt/postgresql
  5. テキストエディターで /etc/systemd/system/postgresql.service ファイルを開き、PGDATA 変数および PGLOG 変数を変更して新しい場所を参照します。
    ~]# 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 が正常に 開始しました。この時点では、通常の操作を確認するには、実行中のサービスをすべてテストする必要があります。