10.4. 設定例
10.4.1. MySQL のデータベース格納場所を変更する
Red Hat Enterprise Linux 6 を使用する場合、MySQL のデフォルトのデータベース格納場所は
/var/lib/mysql
になります。この場所は SELinux でデータベースが配置される場所として期待される場所となるため、この領域にはすでに mysqld_db_t
タイプを使った適切なラベル付けが行なわれています。
データベースを格納する場所は、それぞれの環境要件や設定に応じて変更することもできますが、SELinux に変更後の新しい場所を認識させる、つまりラベル付けを行なうことが重要となります。MySQL データベースの格納場所を変更する方法、また SELinux によるコンテンツに応じた保護メカニズムを新しい格納場所にも適用できるようラベル付けを行なう方法を以下の例で説明していきます。
以下に示す例は、MySQL に対してどのように SELinux が影響を与えることができるのかを示す一例に過ぎません。MySQL に関する総合的な説明は本ガイドの範疇を越えてしまいますので、詳細については、公式の MySQL ドキュメント を参照してください。ここでは、mysql-server パッケージと setroubleshoot-server パッケージがインストールされていること、
auditd
サービスが実行されていること、有効なデータベースがデフォルトの場所である /var/lib/mysql
にあることを前提としています。
ls -lZ /var/lib/mysql
を実行し、mysql
デフォルトデータベース格納場所の SELinux コンテキストを表示させます。# ls -lZ /var/lib/mysql drwx------. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 mysql
データベースファイルの格納場所にデフォルトで付けられるコンテキストエレメントのmysqld_db_t
が表示されています。本例で使用する新しいデータベース格納場所が期待通り正常に動作するよう、このコンテキストをその新しい場所に手作業で適用する必要があります。mysqlshow -u root -p
を入力し、使用できるデータベースを表示させるためmysqld
の root パスワードを入力します。# mysqlshow -u root -p Enter password: ******* +--------------------+ | Databases | +--------------------+ | information_schema | | mysql | | test | | wikidb | +--------------------+
- root ユーザーで
service mysqld stop
を実行し、mysqld
デーモンをシャットダウンさせます。# service mysqld stop Stopping MySQL: [ OK ]
- データベース格納場所となるディレクトリを新規作成します。この例では
/mysql
を使用しています。# mkdir -p /mysql
- 古い場所にあるデータベースファイルを新しい場所にコピーします。
# cp -R /var/lib/mysql/* /mysql/
- mysql ユーザーおよび mysql グループによるアクセスを許可するため所有権を変更します。この変更は従来の Unix パーミッションに対する変更であり、SELinux による制限はそのまま変更されていません。
# chown -R mysql:mysql /mysql
ls -lZ /opt
を実行し、新規ディレクトリの初期コンテキストを表示してみます。# ls -lZ /opt drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0 mysql
コンテキストusr_t
は、現在、MySQL データベースファイルの格納場所として適したタイプではありません。コンテキストを変更すると、MySQL がこの場所で正しく動作できるようになります。- MySQL のメインとなる設定ファイル
/etc/my.cnf
をテキストエディターで開き、新しい格納場所を参照するようdatadir
オプションを編集します。この例の場合なら、新しい格納場所として入力するのは/mysql
になります。[mysqld] datadir=/mysql
このファイルを保存してから終了します。 - root ユーザーで
service mysqld start
を実行し、mysqld
を起動します。サービスの起動は失敗し、/var/log/messages
ファイルに拒否のログが記録されます。ただし、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
が MySQL データファイル用として適切なラベルが付けられていないためです。SELinux で、MySQL によるusr_t
タイプのラベルが付いたコンテンツへのアクセスが阻止されています。この問題を解決するため次の手順を行なってください。 - 次の
semanage
コマンドを実行し、/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
のデータ格納場所に MySQL 用の正しいコンテキストがラベル付けされました。mysqld
デーモンを起動します。# service mysqld start Starting MySQL: [ OK ]
- コンテキストが確かに
/mysql
用に正しく変更されているか確認します。ls -lZ /opt drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
- データ格納場所の変更そしてラベル付けが正しく行なわれたため、
mysqld
デーモンが正常に起動するようになりました。ここまでの設定が完了したら、実行中の全サービスが正常に動作しているか確認テストを行なってください。