Show Table of Contents
このページには機械翻訳が使用されている場合があります (詳細はこちら)。
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 パッケージがインストールされていることを前提としています。
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
- テキストエディターで
/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 postgresqlps
コマンドを使って、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
が正常に起動するようになりました。この時点で、実行中の全サービスが正常に動作しているかテストしてください。
このページには機械翻訳が使用されている場合があります (詳細はこちら)。