Show Table of Contents
このページには機械翻訳が使用されている場合があります (詳細はこちら)。
21.4. 設定例
21.4.1. MariaDB のデータベース格納場所を変更する
Red Hat Enterprise Linux を使用する場合、MariaDB のデフォルトのデータベース格納場所は
/var/lib/mysql/
になります。SELinux はこの場所にこのデータベースがデフォルトで配置されることを予期しているので、この領域にはすでに mysqld_db_t
タイプを使った適切なラベル付けが行われています。
データベースを格納する場所は、個別の環境要件や設定に応じて変更することもできますが、適切にラベル付けを行い、SELinux が変更後の新しい場所を認識することが重要となります。以下の例では、MariaDB データベースの格納場所を変更する方法、また この新しい格納場所にラベルをつけて SELinux がコンテンツに基づいて保護メカニズムを適用できるようにする方法を説明します。
以下に示す例は、SELinux が MariaDB に対して与える影響を示す一例に過ぎません。MariaDB に関する総合的な説明は本ガイドの対象外となります。詳細については、公式の MariaDB ドキュメント を参照してください。ここでは、mariadb-server パッケージと setroubleshoot-server パッケージがインストールされていること、
auditd
サービスが実行されていること、有効なデータベースがデフォルトの場所である /var/lib/mysql/
にあることを前提としています。
mysql
のデフォルトのデータベース格納場所の SELinux コンテキストを表示します。~]#
ls -lZ /var/lib/mysql
drwx------. mysql mysql system_u:object_r:mysqld_db_t:s0 mysqlデータベースファイルの格納場所にデフォルトで付けられるコンテキスト要素のmysqld_db_t
が表示されています。この例で使用する新しいデータベース格納場所が期待通り正常に動作するよう、このコンテキストをその新しい場所に手作業で適用する必要があります。- 以下のコマンドを実行し、
mysqld
の root パスワードを実行して、利用可能なデータベースを表示します。~]#
mysqlshow -u root -p
Enter password: ******* +--------------------+ | Databases | +--------------------+ | information_schema | | mysql | | test | | wikidb | +--------------------+ mysqld
デーモンを停止します。~]#
systemctl stop mariadb.service
- データベース格納場所となるディレクトリーを新規作成します。この例では
/mysql/
を使用しています。~]#
mkdir -p /mysql
- 古い場所にあるデータベースファイルを新しい場所にコピーします。
~]#
cp -R /var/lib/mysql/* /mysql/
- この場所の所有権を変更して、mysql ユーザーおよび mysql グループによるアクセスを許可します。これは従来の Unix パーミッションを設定するもので、SELinux はこれを順守します。
~]#
chown -R mysql:mysql /mysql
- 以下のコマンドを実行して、新規ディレクトリーの初期のコンテキストを確認します。
~]#
ls -lZ /mysql
drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0 mysql新規作成されたこのディレクトリーのコンテキストusr_t
は現在、MariaDB データベースファイルの格納場所として SELinux に適したものではありません。コンテキストを変更すると、MariaDB がこの場所で正しく動作できるようになります。 - MariaDB のメインとなる設定ファイル
/etc/my.cnf
をテキストエディターで開き、新しい格納場所を参照するようdatadir
オプションを編集します。この例の場合、/mysql
の値を入力します。[mysqld] datadir=/mysql
このファイルを保存してから終了します。 mysqld
を起動します。サービスは起動に失敗し、拒否メッセージが/var/log/messages
ファイルにログ記録されるはずです。~]#
systemctl start mariadb.service
Job for mariadb.service failed. See 'systemctl status postgresql.service' and 'journalctl -xn' for details.ただし、audit
デーモンがsetroubleshoot
サービスとともに実行されている場合は、拒否メッセージは/var/log/audit/audit.log
にログ記録されます。SELinux is preventing /usr/libexec/mysqld "write" access on /mysql. For complete SELinux messages. run sealert -l b3f01aff-7fa6-4ebe-ad46-abaef6f8ad71
この拒否の理由は、/mysql/
に MariaDB のデータファイル用として適切なラベルが付けられていないためです。SELinux は、MariaDB がusr_t
タイプのラベルが付いたコンテンツにアクセスすることを禁止しています。この問題を解決するには、以下の手順にしたがいます。- 以下のコマンドを実行し、
/mysql/
のコンテキストマッピングを追加します。semanage
ユーティリティーはデフォルトではインストールされていないことに注意してください。インストールされていない場合は、policycoreutils-python パッケージをインストールします。~]#
semanage fcontext -a -t mysqld_db_t "/mysql(/.*)?"
- このマッピングは
/etc/selinux/targeted/contexts/files/file_contexts.local
ファイルに書き込まれます。~]#
grep -i mysql /etc/selinux/targeted/contexts/files/file_contexts.local
/mysql(/.*)? system_u:object_r:mysqld_db_t:s0 restorecon
ユーティリティーを使ってこのコンテキストマッピングを稼働中のシステムに適用します。~]#
restorecon -R -v /mysql
- これで
/mysql/
の場所に MariaDB 用の適切なコンテキストがラベル付けされたので、mysqld
を起動できます。~]#
systemctl start mariadb.service
/mysql/
のコンテキストが変更されたことを確認します。~]$
ls -lZ /mysql
drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql- データ格納場所が変更され、ラベルが適切に付けられたため、
mysqld
デーモンが正常に起動するようになりました。この時点で、実行中の全サービスが正常に動作しているかテストしてください。
このページには機械翻訳が使用されている場合があります (詳細はこちら)。