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/
のデフォルトの場所に有効なデータベースがあることを前提としています。
mysql
のデフォルトのデータベースの場所の SELinux コンテキストを表示します。~]# ls -lZ /var/lib/mysql drwx------. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
これは、データベースファイルの場所のデフォルトのコンテキスト要素であるmysqld_db_t
を示しています。このコンテキストを適切に機能させるために、この例で使用される新しいデータベースの場所に、手動で適用する必要があります。- 次のコマンドを入力し、
mysqld
root パスワードを入力して、利用可能なデータベースを表示します。~]# mysqlshow -u root -p Enter password: ******* +--------------------+ | Databases | +--------------------+ | information_schema | | mysql | | test | | wikidb | +--------------------+
mariadb.service
サービスを停止します。~]# systemctl stop mariadb.service
- データベースの新しい場所に、新しいディレクトリーを作成します。この例では、
/mysql/
が使用されています。~]# mkdir -p /mysql
- 古い場所から新しい場所に、データベースファイルをコピーします。
~]# cp -R /var/lib/mysql/* /mysql/
- mysql ユーザーおよびグループによるアクセスを許可するように、この場所の所有権を変更します。これにより、SELinux が引き続き監視する従来の Unix パーミッションが設定されます。
~]# chown -R mysql:mysql /mysql
- 以下のコマンドを実行すると、作成したディレクトリーの初期コンテキストが表示されます。
~]# ls -lZ /mysql drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0 mysql
新しく作成されたこのディレクトリーのコンテキストusr_t
は、現在、MariaDB データベースファイルの場所として SELinux には適していません。コンテキストを変更すると、MariaDB はこのエリアで適切に機能できるようになります。 - テキストエディターで、MariaDB のメイン設定ファイル
/etc/my.cnf
を開き、新しい場所を参照できるようにdatadir
オプションを変更します。この例で入力する必要のある値は、/mysql
です。[mysqld] datadir=/mysql
このファイルを保存して終了します。 mariadb.service
を起動します。サービスの起動に失敗し、拒否メッセージが/var/log/messages
ファイルに記録されます。~]# systemctl start mariadb.service Job for mariadb.service failed. See 'systemctl status mariadb.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
とラベル付けされたコンテンツにアクセスできなくなりました。この問題を解決するには、以下の手順を実行します。- 以下のコマンドを入力して、
/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/
の場所には MariaDB の正しいコンテキストでラベル付けされ、mysqld
が起動します。~]# systemctl start mariadb.service
/mysql/
に対してコンテキストが変更されたことを確認します。~]$ ls -lZ /mysql drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
- この場所が変更され、ラベルが付けられ、
mysqld
が正常に起動されました。この時点で、実行中のすべてのサービスをテストして、通常の操作を確認してください。