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デーモンが正常に起動するようになりました。ここまでの設定が完了したら、実行中の全サービスが正常に動作しているか確認テストを行なってください。