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/ にあることを前提としています。
  1. mysql のデフォルトのデータベース格納場所の SELinux コンテキストを表示します。
    ~]# ls -lZ /var/lib/mysql
    drwx------. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
    データベースファイルの格納場所にデフォルトで付けられるコンテキスト要素の mysqld_db_t が表示されています。この例で使用する新しいデータベース格納場所が期待通り正常に動作するよう、このコンテキストをその新しい場所に手作業で適用する必要があります。
  2. 以下のコマンドを実行し、mysqld の root パスワードを実行して、利用可能なデータベースを表示します。
    ~]# mysqlshow -u root -p
    Enter password: *******
    +--------------------+
    |     Databases      |
    +--------------------+
    | information_schema |
    | mysql              |
    | test               |
    | wikidb             |
    +--------------------+
  3. mysqld デーモンを停止します。
    ~]# systemctl stop mariadb.service
  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 /mysql
    drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0   mysql
    新規作成されたこのディレクトリーのコンテキスト usr_t は現在、MariaDB データベースファイルの格納場所として SELinux に適したものではありません。コンテキストを変更すると、MariaDB がこの場所で正しく動作できるようになります。
  8. MariaDB のメインとなる設定ファイル /etc/my.cnf をテキストエディターで開き、新しい格納場所を参照するよう datadir オプションを編集します。この例の場合、/mysql の値を入力します。
    [mysqld]
    datadir=/mysql
    このファイルを保存してから終了します。
  9. 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 タイプのラベルが付いたコンテンツにアクセスすることを禁止しています。この問題を解決するには、以下の手順にしたがいます。
  10. 以下のコマンドを実行し、/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/ の場所に MariaDB 用の適切なコンテキストがラベル付けされたので、mysqld を起動できます。
    ~]# systemctl start mariadb.service
  14. /mysql/ のコンテキストが変更されたことを確認します。
    ~]$ ls -lZ /mysql
    drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
  15. データ格納場所が変更され、ラベルが適切に付けられたため、mysqld デーモンが正常に起動するようになりました。この時点で、実行中の全サービスが正常に動作しているかテストしてください。

このページには機械翻訳が使用されている場合があります (詳細はこちら)。