Menu Close

Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

20.4. 設定の例

20.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 ユーザーおよびグループによるアクセスを許可するように、この場所の所有権を変更します。これにより、SELinux が引き続き監視する従来の Unix パーミッションが設定されます。
    ~]# 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
    
    この拒否の理由は、MariaDB データファイルに対して /mysql/ が正しくラベル付けされていないことです。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 が正常に起動されました。この時点で、実行中のすべてのサービスをテストして、通常の操作を確認してください。