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 にあることを前提としています。
  1. 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 が表示されています。本例で使用する新しいデータベース格納場所が期待通り正常に動作するよう、このコンテキストをその新しい場所に手作業で適用する必要があります。
  2. mysqlshow -u root -p を入力し、使用できるデータベースを表示させるため mysqld の root パスワードを入力します。
    # mysqlshow -u root -p
    Enter password: *******
    +--------------------+
    |     Databases      |
    +--------------------+
    | information_schema |
    | mysql              |
    | test               |
    | wikidb             |
    +--------------------+
    
  3. root ユーザーで service mysqld stop を実行し、mysqld デーモンをシャットダウンさせます。
    # service mysqld stop
    Stopping MySQL:                                            [  OK  ]
    
  4. データベース格納場所となるディレクトリを新規作成します。この例では /mysql を使用しています。
    # mkdir -p /mysql
    
  5. 古い場所にあるデータベースファイルを新しい場所にコピーします。
    # cp -R /var/lib/mysql/* /mysql/
    
  6. mysql ユーザーおよび mysql グループによるアクセスを許可するため所有権を変更します。この変更は従来の Unix パーミッションに対する変更であり、SELinux による制限はそのまま変更されていません。
    # chown -R mysql:mysql /mysql
    
  7. ls -lZ /opt を実行し、新規ディレクトリの初期コンテキストを表示してみます。
    # ls -lZ /opt
    drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0   mysql
    
    コンテキスト usr_t は、現在、MySQL データベースファイルの格納場所として適したタイプではありません。コンテキストを変更すると、MySQL がこの場所で正しく動作できるようになります。
  8. MySQL のメインとなる設定ファイル /etc/my.cnf をテキストエディターで開き、新しい格納場所を参照するよう datadir オプションを編集します。この例の場合なら、新しい格納場所として入力するのは /mysql になります。
    [mysqld]
    datadir=/mysql
    
    このファイルを保存してから終了します。
  9. 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 タイプのラベルが付いたコンテンツへのアクセスが阻止されています。この問題を解決するため次の手順を行なってください。
  10. 次の semanage コマンドを実行し、/mysql のコンテキストマッピングを追加します。semanage はデフォルトではインストールされていないため注意してください。インストールされていない場合は、policycoreutils-python パッケージをインストールします。
    semanage fcontext -a -t mysqld_db_t "/mysql(/.*)?"
    
  11. このマッピングは /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
    
  12. restorecon コマンドを使ってこのコンテキストマッピングを実行中のシステムに適用します。
    restorecon -R -v /mysql
    
  13. これで /mysql のデータ格納場所に MySQL 用の正しいコンテキストがラベル付けされました。mysqld デーモンを起動します。
    # service mysqld start
    Starting MySQL:                                            [  OK  ]
    
  14. コンテキストが確かに /mysql 用に正しく変更されているか確認します。
    ls -lZ /opt
    drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
    
  15. データ格納場所の変更そしてラベル付けが正しく行なわれたため、mysqld デーモンが正常に起動するようになりました。ここまでの設定が完了したら、実行中の全サービスが正常に動作しているか確認テストを行なってください。