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 パッケージがインストールされていることを前提としています。
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 ユーザーおよびグループによるアクセスを許可するために、新しい場所の所有権を変更します。これにより、SELinux が引き続き監視する従来の Unix パーミッションが設定されます。
~]# chown -R postgres:postgres /opt/postgresql
- テキストエディターで
/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
- 新しい場所でデータベースを初期化します。
~]$ su - postgres -c "initdb -D /opt/postgresql/data"
- データベースの場所を変更すると、この時点でサービスの起動に失敗します。
~]# systemctl start postgresql.service Job for postgresql.service failed. See 'systemctl status postgresql.service' and 'journalctl -xn' for details.
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
サービスが正常に起動します。~]# systemctl start postgresql.service
/opt/postgresql/
のコンテキストが正しいことを確認します。~]$ ls -lZ /opt drwxr-xr-x. root root system_u:object_r:postgresql_db_t:s0 postgresql
postgresql
処理で新しい場所が表示されることを、ps コマンドで確認します。~]# 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
が正常に起動しました。この時点で、実行中のすべてのサービスをテストして、通常の操作を確認してください。