MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  SELinux のトラブルシューティング

6.7.6 SELinux のトラブルシューティング

SELinux のトラブルシューティングでは、通常、SELinux を許容モードにし、問題のある操作を再実行し、SELinux 監査ログでアクセス拒否メッセージをチェックし、問題が解決した後に SELinux を強制モードに戻します。

setenforce を使用してシステム全体を許可モードにしないようにするには、semanage コマンドを使用して SELinux ドメイン (mysqld_t) を許可モードにすることで、MySQL サービスのみを許可できます:

semanage permissive -a mysqld_t

トラブルシューティングが終了したら、次のコマンドを使用して mysqld_t ドメインを強制モードに戻します:

semanage permissive -d mysqld_t

SELinux は、拒否された操作のログを/var/log/audit/audit.log に書き込みます。 拒否を確認するには、「拒否」メッセージを検索します。

grep "denied" /var/log/audit/audit.log

次の各セクションでは、SELinux 関連の問題が発生する可能性のあるいくつかの一般的な領域について説明します。

ファイルコンテキスト

MySQL ディレクトリまたはファイルの SELinux コンテキストが正しくない場合、アクセスが拒否される可能性があります。 この問題は、MySQL がデフォルト以外のディレクトリまたはファイルに対して読取りまたは書込みを行うように構成されている場合に発生することがあります。 たとえば、デフォルト以外のデータディレクトリを使用するように MySQL を構成する場合、ディレクトリには予期される SELinux コンテキストがない可能性があります。

無効な SELinux コンテキストを持つデフォルト以外のデータディレクトリで MySQL サービスを起動しようとすると、次の起動が失敗します。

shell> systemctl start mysql.service
Job for mysqld.service failed because the control process exited with error code.
See "systemctl status mysqld.service" and "journalctl -xe" for details.

この場合、否認メッセージは/var/log/audit/audit.log に記録されます:

shell> grep "denied" /var/log/audit/audit.log
type=AVC msg=audit(1587133719.786:194): avc:  denied  { write } for  pid=7133 comm="mysqld"
name="mysql" dev="dm-0" ino=51347078 scontext=system_u:system_r:mysqld_t:s0
tcontext=unconfined_u:object_r:default_t:s0 tclass=dir permissive=0

MySQL ディレクトリおよびファイルに対する適切な SELinux コンテキストの設定の詳細は、セクション6.7.4「SELinux ファイルコンテキスト」 を参照してください。

ポートアクセス

SELinux は、MySQL Server などのサービスが特定のポートを使用することを想定しています。 SELinux ポリシーを更新せずにポートを変更すると、サービス障害が発生する場合があります。

mysqld_port_t ポートタイプは、MySQL がリスニングするポートを定義します。 ポート 3307 などのデフォルト以外のポートを使用するように MySQL Server を構成し、変更を反映するようにポリシーを更新しない場合、MySQL サービスは起動に失敗します:

shell> systemctl start mysqld.service
Job for mysqld.service failed because the control process exited with error code.
See "systemctl status mysqld.service" and "journalctl -xe" for details.

この場合、拒否メッセージが/var/log/audit/audit.log に記録されます:

shell> grep "denied" /var/log/audit/audit.log
type=AVC msg=audit(1587134375.845:198): avc:  denied  { name_bind } for  pid=7340
comm="mysqld" src=3307 scontext=system_u:system_r:mysqld_t:s0
tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket permissive=0

MySQL の適切な SELinux ポートコンテキストの設定の詳細は、セクション6.7.5「SELinux TCP ポートコンテキスト」 を参照してください。 必要なコンテキストで定義されていないポートを使用する MySQL 機能を有効にすると、同様のポートアクセスの問題が発生する可能性があります。 詳細は、セクション6.7.5.2「MySQL 機能の TCP ポートコンテキストの設定」を参照してください。

アプリケーションの変更

SELinux は、アプリケーションの変更を認識しない場合があります。 たとえば、新しいリリース、アプリケーション拡張機能または新機能が SELinux で許可されていない方法でシステムリソースにアクセスすると、アクセスが拒否される場合があります。 このような場合は、audit2allow ユーティリティを使用して、必要に応じてアクセスを許可するカスタムポリシーを作成できます。 カスタムポリシーを作成する一般的な方法は、SELinux モードを permissive に変更し、SELinux 監査ログでアクセス拒否メッセージを識別し、audit2allow ユーティリティを使用してアクセスを許可するカスタムポリシーを作成することです。

audit2allow ユーティリティの使用の詳細は、ディストリビューションの SELinux ドキュメントを参照してください。

標準の MySQL SELinux ポリシーモジュールで処理する必要があると思われる MySQL のアクセスの問題が発生した場合は、配布バグ追跡システムでバグレポートを開きます。


関連キーワード:  mysqld, ポート, コンテキスト, audit, 認証, パスワード, 監査, プラガブル, アクセス, セキュリティー