MySQL セキュリティ強化(状態診断、ネットワーク、TLS、認証、権限、監査、暗号化)
MySQLレベル: 中級所要時間: 5 分(診断)~3 時間(全面的な強化)インストールガイドではありません。稼働中の MySQL 8.4 / 8.0 サーバーのセキュリティ上の弱点を見つけて塞ぎます。まず読み取り専用の 状態診断 が検出事項を重要度順に一覧し、各検出事項がどのカードにつながるかを示します。その後、各領域を個別に、またはすべてを順番に対処します。対象は bind_address、firewall とアカウントのホスト制限、TLS・require_secure_transport・クライアント側の VERIFY_IDENTITY、caching_sha2_password・パスワードポリシー・リモート root・匿名アカウント、ロールと DDL 権限のないアプリケーションアカウント、監査、InnoDB テーブルスペース暗号化(keyring コンポーネント)、暗号化バックアップ、オペレーティングシステム、バージョン管理です。監査は Community にはありません。MySQL Enterprise(有償サブスクリプション)または Percona Server(無償)が必要です。TDE は Community でも使えます。最後に診断を再度実行します。
構成: 単一の MySQL サーバー + アプリケーションサーバー(クライアント側の検証)。レプリカ / InnoDB Cluster は注記を参照
シナリオ
- 状態診断:どこに弱点があるか(読み取り専用) — 最初に実行するスキャンです。匿名・パスワードなし・リモート root のアカウント、任意の場所(%)からのアクセス、弱い認証プラグイン、グローバル権限、TLS、監査、暗号化、ファイル権限、firewall を確認します。何も変更しません。
- 全面的な強化(すべてを順番に) — 新規構築直後、または一度も強化していないサーバー向けです。すべての領域を安全な順序で適用します。MySQL を数回再起動するため、メンテナンスウィンドウが必要です。
- ネットワークと接続:誰がどこから接続できるか(bind_address、firewall、ホスト制限) — MySQL がすべてのインターフェースで待ち受けており、アカウントのホストが '%'、ポートが誰にでも開いている状態です。bind_address を変更すると再起動が必要です。
- 接続を暗号化する(TLS、require_secure_transport、VERIFY_IDENTITY) — 自動生成された自己署名証明書を使っている、暗号化されていない接続を受け付けている、またはクライアントが証明書を検証していない状態です。ALTER INSTANCE RELOAD TLS により無停止で対応できます。
- 認証とパスワード(caching_sha2、パスワードポリシー、root) — mysql_native_password のアカウント、パスワードポリシーなし、リモート root、匿名アカウント、test データベース。無停止で対応できます。
- 最小権限:ロールと DDL 権限のないアプリケーションアカウント — アプリケーションアカウントに CREATE/ALTER/DROP や . の権限がある、FILE/SUPER 権限を持つアカウントがある状態です。読み取り / 書き込み / DDL のロールと権限レポートを作成します。無停止で対応できます。
- 監査:誰が何をしたか — 監査担当者がセッションとクエリの記録を求めています。MySQL Community には組み込みの監査機能がありません。選択肢は Enterprise Audit、Percona Server の Audit Log Filter、または Community 向けの限定的な方法です。ライセンス: Enterprise Audit は MySQL Enterprise サブスクリプションでのみ提供されます。Percona の Audit Log Filter は無償です。
- 保存データを暗号化する(InnoDB テーブルスペース暗号化、keyring) — ディスクやバックアップコピーの盗難に備えて、テーブル、redo、undo、binlog を暗号化します。keyring コンポーネントの導入に再起動が 1 回必要で、大きなテーブルでは ALTER に時間がかかります。Community でもライセンス不要です。暗号化 keyring / KMS keyring は Enterprise の機能です。
- バックアップのセキュリティ(暗号化バックアップ、login-path、権限) — バックアップが暗号化されていない、または誰でも読めるディレクトリにある、スクリプトに平文パスワードがある状態です。mysqldump + GPG または XtraBackup --encrypt、バックアップ用アカウントと login-path で対処します。
- オペレーティングシステム側(サービスアカウント、権限、コアダンプ、SELinux) — データディレクトリや証明書ファイルが他ユーザーに開いている、secure_file_priv が空、local_infile が有効、SELinux が無効の状態です。一部の設定は再起動後に有効になります。
- パッチとバージョン:サポート対象のバージョンか — バージョン、サポート終了日(8.0 は 2026 年 4 月に終了)、未適用の更新を確認します。適用はアップグレードガイドで行います。読み取り専用です。
開始前の確認
- MySQL … が稼働しており、サーバー上で root として mysql コマンドがパスワードなしでログインできること(root@localhost が auth_socket、または mysql_config_editor で設定した client login-path)。MySQL インストールガイド で構築した場合はこの状態になっています。各ステップの SQL は root で mysql -t から実行します。
- サーバーに 2 つの SSH セッション を開いておき、一方では mysql クライアントを開いたままにします。アカウントのホスト、require_secure_transport、firewall を変更した後は、別のセッションで新しい接続を試してください。成功を確認するまで古いセッションは閉じないでください。このガイドでは root@localhost のソケットログインは一切変更しません。常に戻り道として残ります。
- メンテナンスウィンドウ: 選択した領域によっては MySQL を再起動します(bind_address、keyring コンポーネント、監査プラグイン、コアダンプの制限)。レプリカのある環境では、まずレプリカで適用してください。
- MySQL に接続するすべてのアプリケーションの一覧(サーバー IP、アカウント、ドライバーのバージョン)。診断ステップで現在の接続が表示されます。一覧にないクライアントは制限後に接続できなくなります。
- 最新で、リストアを検証済みのバックアップがあること(論理 または XtraBackup)。暗号化(TDE)のステップでは、keyring ファイルを失うとデータが読めなくなります。バックアップは keyring の導入より前に取得してください。
ガイドのフェーズ
- 状態診断(読み取り専用) — データベース内の検出事項を一覧する · オペレーティングシステム側を診断する
- 開始前に: 戻りポイント — 現在の設定、アカウント、権限のコピーを取る · 追加の設定ディレクトリを有効にする
- 権限 — 1. 現状確認 — アカウントの権限を表示する
- 権限 — 3. 適用 — ロールを作成して権限を付与する · アカウントを作成してロールに割り当てる · アプリケーションアカウントに直接付与された権限を削除する · 権限レポート
- 権限 — 4. 検証 — 実効権限に DDL がないことを確認する · アプリケーションサーバーから DDL を試す
- 権限 — 5. 事後作業 — マイグレーション用アカウントを使用時以外はロックしておく
- 認証 — 1. 現状確認 — 認証プラグイン、パスワード設定、デフォルトのアカウントを表示する
- 認証 — 2. 安全策 — ドライバーの互換性を確認する
- 認証 — 3. 適用 — 匿名アカウント、リモート root、test データベースを削除する · パスワードポリシーを設定する(validate_password、履歴) · mysql_native_password のアカウントを caching_sha2_password に移行する · 個人用 DBA アカウントを作成する
- 認証 — 4. 検証 — アカウントの状態を確認する · アプリケーションサーバーから root でのログインを試す
- TLS — 1. 現状確認 — 現在の TLS 設定と暗号化なしのクライアントを表示する
- TLS — 3. 適用 — テスト CA とサーバー証明書を作成する · 鍵と証明書署名要求(CSR)を作成する · 署名済み証明書を配置する · 証明書と鍵を検証する · SELinux ラベルを付与する · サーバーを新しい証明書に切り替える(無停止) …
- TLS — 4. 検証 — 暗号化なしの接続が拒否されることを確認する
- TLS — 5. 事後作業: 証明書の更新 — 証明書の更新手順
- ネットワーク — 1. 現状確認: 誰がどこから接続しているか — 待ち受けアドレス、アカウントのホスト、接続中のクライアントを表示する
- ネットワーク — 3. 適用 — ホストが '%' のアカウントをアプリケーションのネットワークに絞る · 待ち受けアドレスを絞る(再起動後に有効) · firewall でポートを許可したネットワークにのみ開放する · 待ち受けアドレスを反映するため MySQL を再起動する
- ネットワーク — 4. 検証 — アプリケーションサーバーから接続を試す(新しいセッション)
- 監査 — 1. 現状確認 — 監査プラグインとログ設定を表示する
- 監査 — 3. 適用 — Community: ログイン失敗と DML のクエリ文を記録する · Enterprise Audit プラグインをインストールする · Enterprise Audit のフィルタを定義する · Percona Audit Log Filter コンポーネントをインストールする · Percona の監査フィルタを定義する · 監査ログを集中サーバーに転送する(rsyslog imfile) …
- 監査 — 4. 検証 — 変更を加えて記録を確認する
- バックアップ — 1. 現状確認 — バックアップの暗号化状態とパスワードファイルを表示する
- バックアップ — 3. 適用 — 最小権限のバックアップ用アカウントを作成する · パスワードを login-path に保存する · GPG 公開鍵をインポートする · 暗号化バックアップのスクリプト · XtraBackup による暗号化バックアップのスクリプト · 鍵ファイル、バックアップディレクトリ、手動テスト …
- バックアップ — 4. 検証 — 暗号化バックアップを復号できるか試す
- オペレーティングシステム — 1. 現状確認 — サービスアカウント、権限、ファイルのパーミッション、SELinux
- オペレーティングシステム — 3. 適用 — ファイルのインポート / エクスポートを制限する · データディレクトリと鍵ファイルのパーミッションを修正する · コアダンプを無効にする · systemd を再読み込みして MySQL を再起動する · コマンド履歴にパスワードが残らないようにする · SELinux を Enforcing に保つ
- オペレーティングシステム — 4. 検証 — 変更を確認する
- 暗号化 — 1. 現状確認 — keyring と暗号化の状態を表示する
- 暗号化 — 2. 安全策 — 暗号化の前にフルバックアップを取る
- 暗号化 — 3. 適用 — keyring コンポーネントのマニフェストを書く · keyring のディレクトリと設定を準備する · keyring をロードするために再起動する · redo、undo、binlog、新規テーブルの暗号化を有効にする · アプリケーションのデータベースのテーブルを暗号化する · keyring ファイルをバックアップする
- 暗号化 — 4. 検証 — 暗号化と keyring を確認する