📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

概要

MySQLの認証プラグインは、クライアント接続時の認証方式を制御するプラガブルな認証フレームワークである。
サーバ側プラグインとクライアント側プラグインのペアにより、パスワード認証、LDAP認証、PAM認証、Kerberos認証、多要素認証等の多様な認証方式を実現する。

MySQL 8.0以降、デフォルトの認証プラグインは mysql_native_password (SHA-1ベース) から caching_sha2_password (SHA-256 + キャッシュ) に変更された。
caching_sha2_password は、より強力なセキュリティとパフォーマンスを両立する認証方式である。

MySQL 8.0.34以降、mysql_native_passwordは非推奨化され、MySQL 9.0で完全に削除された。
既存環境からの移行時には、認証プラグインの変更に伴うクライアント互換性の確認が必要である。

プラガブル認証フレームワークにより、サーバ側プラグインがクライアントの認証データを検証し、認証成功時に接続を確立する。
認証プラグインは、プロキシユーザ機能もサポートしており、接続ユーザが別のユーザの権限でアクセスすることが可能である。

MySQL 8.0.27以降、多要素認証 (MFA) フレームワークが導入され、2FA (2要素認証) および 3FA (3要素認証) による強化された認証が可能になった。

主要な認証プラグインには、caching_sha2_passwordmysql_native_passwordsha256_passwordauth_socket
LDAP認証プラグイン (Enterprise Edition)、PAM認証プラグイン (Enterprise Edition)、WebAuthn認証プラグイン等がある。


認証プラグインのアーキテクチャ

MySQLのプラガブル認証フレームワークは、サーバ側プラグインとクライアント側プラグインで構成される。

サーバ側プラグインとクライアント側プラグイン

認証プラグインの構成を以下に示す。

認証プラグインの種類
種類 説明
サーバ側プラグイン MySQLサーバ内で実行される。
クライアントから送信された認証データを検証する。
mysql.user システムテーブルの authentication_string カラムに保存された認証データと照合する。
クライアント側プラグイン クライアントプログラム内で実行される。
認証データ (パスワードハッシュ等) をサーバに送信する。
サーバ側プラグインと対応する認証プロトコルを実装する。


各認証方式は、サーバ側プラグインとクライアント側プラグインのペアとして実装される。
例として、caching_sha2_password サーバ側プラグインは、caching_sha2_password クライアント側プラグインと組み合わせて使用される。

認証フロー

MySQLの認証フローを以下に示す。

  1. クライアントがユーザ名とホスト名を指定して接続要求を送信する。
  2. サーバは mysql.user テーブルからアカウント行を検索する。
  3. サーバはアカウント行から適用される認証プラグインを特定する。
  4. サーバは特定された認証プラグインを実行してクライアントを認証する。
  5. 認証プラグインが認証の成功または失敗ステータスをサーバに返却する。
  6. 認証成功時は接続を確立し、失敗時は接続を拒否する。


認証プラグインは、プロキシユーザ機能をサポートする。
認証成功時に、接続ユーザが別のユーザのプロキシであることを示すことができる。
これにより、外部認証システムで認証されたユーザを、MySQL内部の特定ユーザにマッピングすることが可能である。


主要な認証プラグイン

MySQLでサポートされる主要な認証プラグインを以下に示す。

主要な認証プラグイン
プラグイン名 認証方式 デフォルト (バージョン別) ステータス
caching_sha2_password SHA-256 + サーバ側キャッシュ MySQL 8.0以降 推奨
mysql_native_password SHA-1 MySQL 5.7まで 削除 (MySQL 9.0)
sha256_password SHA-256 (キャッシュなし) なし 非推奨
auth_socket Unixソケット認証 なし サポート (ローカル接続)
authentication_ldap_simple LDAP (Simple) Enterprise のみ サポート
authentication_ldap_sasl LDAP (SASL) Enterprise のみ サポート
authentication_pam PAM (Linux/MacOS) Enterprise のみ サポート
authentication_kerberos Kerberos/GSSAPI Enterprise のみ サポート
authentication_webauthn WebAuthn/FIDO2 MySQL 8.2以降 サポート (MFA)
authentication_fido FIDO2/U2F MySQL 8.0.27以降 非推奨 (MySQL 8.0.35以降)
mysql_no_login ログイン禁止 なし サポート (プロキシユーザ用)


caching_sha2_password

caching_sha2_password は、MySQL 8.0以降のデフォルト認証プラグインである。

特徴を以下に示す。

特徴
SHA-256ハッシュ関数を使用 (5,000ラウンド)
サーバ側に認証情報をメモリキャッシュ
初回接続時は完全な認証プロセスを実行し、以降はキャッシュを利用して高速化
SSL/TLS接続またはRSA鍵ペアによるセキュアな接続が必須


キャッシュ無効化条件を以下に示す。

キャッシュ無効化条件
ユーザのパスワード変更 (ALTER USER ... IDENTIFIED BY)
ユーザの作成または削除
RENAME USER の実行
FLUSH PRIVILEGES の実行
サーバの再起動


関連するシステム変数を以下に示す。

関連するシステム変数
変数名 説明
caching_sha2_password_private_key_path RSA秘密鍵ファイルのパス
caching_sha2_password_public_key_path RSA公開鍵ファイルのパス
caching_sha2_password_digest_rounds SHA-256ハッシュの反復回数 (デフォルト: 5000)
caching_sha2_password_auto_generate_rsa_keys サーバ起動時の自動RSA鍵生成 (ON/OFF)


mysql_native_password

mysql_native_password は、MySQL 5.7までのデフォルト認証プラグインである。
SHA-1ハッシュアルゴリズムを使用する。

バージョン別の変更を以下に示す。

mysql_native_password の廃止スケジュール
バージョン 変更内容
MySQL 8.0.0 デフォルトが caching_sha2_password に変更
MySQL 8.0.34 mysql_native_password が非推奨化
MySQL 8.4 サーバプラグインがデフォルトで無効化
MySQL 9.0 完全削除


新規インストール環境では、caching_sha2_password への移行を推奨する。

sha256_password

sha256_password は、SHA-256ハッシュアルゴリズムを使用する認証プラグインである。
caching_sha2_password と異なり、サーバ側キャッシュ機能を持たない。

特徴を以下に示す。

  • SHA-256ハッシュを使用
  • キャッシュなし (毎回完全な認証処理)
  • SSL/TLS接続またはRSA鍵ペアによる接続が必須


caching_sha2_password の方が高性能であるため、sha256_password は非推奨である。

関連するシステム変数を以下に示す。

関連するシステム変数
変数名 説明
sha256_password_private_key_path RSA秘密鍵ファイルのパス
sha256_password_public_key_path RSA公開鍵ファイルのパス


auth_socket

auth_socket は、Unixソケット接続専用の認証プラグインである。
SO_PEERCRED ソケットオプションを使用して、接続元のOSユーザ情報を取得し、MySQLユーザ名と照合する。

特徴を以下に示す。

  • ローカルUnixソケット接続のみ対応
  • パスワード不要
  • OSユーザ名とMySQLユーザ名の一致を検証
  • ローカル管理者認証に適している


インストール方法を以下に示す。

 INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';


使用例を以下に示す。

 -- OSユーザ alice がMySQLユーザ alice としてログイン
 CREATE USER 'alice'@'localhost' IDENTIFIED WITH auth_socket;
 
 -- OSユーザ bob がMySQLユーザ alice としてログイン (マッピング)
 CREATE USER 'alice'@'localhost' IDENTIFIED WITH auth_socket AS 'bob';


LDAP認証プラグイン (Enterprise Edition)

LDAP認証プラグインは、MySQL Enterprise Editionでのみ利用可能である。
外部LDAPディレクトリサービスを使用した認証を提供する。

下表に、2種類のLDAP認証プラグインを示す。

LDAP認証プラグインの種類
プラグイン 説明
authentication_ldap_simple Simple LDAP認証
クライアント側プラグインは mysql_clear_password
パスワードがクリアテキストで送信されるため、TLS接続が必須
authentication_ldap_sasl SASL LDAP認証
クライアント側プラグインは authentication_ldap_sasl_client
SASLメッセージを使用した認証


下表に、主要なシステム変数を示す。

主要なシステム変数
変数名 説明
authentication_ldap_*_server_host LDAPサーバのホスト名
authentication_ldap_*_server_port LDAPサーバのポート番号
authentication_ldap_*_bind_base_dn ベースDN (ディレクトリ検索の起点)
authentication_ldap_*_bind_root_dn ルートDN (LDAPサーバへのバインド用)
authentication_ldap_*_bind_root_pwd ルートパスワード
authentication_ldap_*_user_search_attr ユーザ検索属性 (デフォルト: uid)


PAM認証プラグイン (Enterprise Edition)

PAM認証プラグインは、MySQL Enterprise Editionでのみ利用可能である。
Pluggable Authentication Module (PAM) を使用した認証を提供する。

特徴を以下に示す。

  • Unixパスワード、LDAPディレクトリ等のPAM対応認証方式をサポート
  • クライアント側プラグインは mysql_clear_password (TLS接続必須)
  • Linux / MacOSでサポート (Windowsは非対応)


PAM認証により、OS認証と統合されたアクセス制御が可能である。

WebAuthn / FIDO認証プラグイン

WebAuthn認証プラグインは、FIDO2デバイスを使用した多要素認証を提供する。

下表に、バージョン別の対応を示す。

多要素認証の変遷
バージョン 変更内容
MySQL 8.0.27 多要素認証フレームワーク導入、authentication_fido プラグイン追加
MySQL 8.2.0 authentication_webauthn プラグイン追加 (推奨)
MySQL 8.0.35 authentication_fido プラグイン非推奨化


WebAuthn認証の用途を以下に示す。

  • 多要素認証 (MFA) の第2要素または第3要素として使用
  • パスワードレスログイン (第1要素として使用)
  • FIDO U2FおよびFIDO2デバイス対応


authentication_webauthn の使用を推奨する。
authentication_fido は非推奨である。

その他の認証プラグイン

その他の認証プラグイン
プラグイン 説明
mysql_no_login 全てのクライアント接続を拒否する。
プロキシユーザ または ストアドプログラム・ビュー実行専用のアカウントに使用。
直接ログインは不可能だが、プロキシユーザ経由のアクセスは可能。
authentication_kerberos Enterprise Editionのみ。
Kerberos/GSSAPIを使用した相互認証。
パスワードがネットワークを通じて送信されない。
Windows Active Directoryとの統合に適している。



caching_sha2_passwordの詳細

caching_sha2_password は、MySQL 8.0以降のデフォルト認証プラグインであり、セキュリティとパフォーマンスを両立する。

動作原理

caching_sha2_password の動作原理を以下に示す。

  • ハッシュアルゴリズム
    SHA-256ハッシュ関数を5,000ラウンド実行
    caching_sha2_password_digest_rounds システム変数で調整可能
  • キャッシュ機構
    サーバ側のメモリにユーザの認証情報をキャッシュ
    初回接続時は完全な認証プロセスを実行
    以降の接続はキャッシュを利用して高速化
  • キャッシュ無効化
    パスワード変更、ユーザの作成・削除、RENAME USERFLUSH PRIVILEGES、サーバ再起動時にキャッシュがクリア


下表に、キャッシュ無効化条件の詳細を示す。

キャッシュ無効化条件
条件 説明
ALTER USER ... IDENTIFIED BY パスワード変更時、該当ユーザのキャッシュがクリア
CREATE USER / DROP USER ユーザの作成・削除時、全キャッシュがクリア
RENAME USER ユーザ名変更時、全キャッシュがクリア
FLUSH PRIVILEGES 権限テーブルのリロード時、全キャッシュがクリア
サーバ再起動 MySQLサーバ再起動時、全キャッシュがクリア (キャッシュはメモリのみ)


SSL/TLS と RSA鍵ペア

caching_sha2_password は、セキュアな接続を要求する。
以下のいずれかの接続方式が必要である。

  • TLS (SSL) 暗号化接続 (推奨)
    最も安全な接続方式
    パスワードが暗号化されて送信される
  • Unixソケット接続
    ローカル接続に使用
    ネットワークを経由しないため安全
  • 共有メモリ接続 (Windows)
    Windows環境でのローカル接続
  • RSA鍵ペアによる暗号化
    非暗号化TCP接続でRSA鍵ペアを使用してパスワードを暗号化
    TLS接続が利用できない環境で使用


RSA鍵ペアの設定方法を以下に示す。

 [mysqld]
 # RSA秘密鍵と公開鍵のパス
 caching_sha2_password_private_key_path=/var/lib/mysql/private_key.pem
 caching_sha2_password_public_key_path=/var/lib/mysql/public_key.pem
 
 # サーバ起動時の自動RSA鍵生成 (デフォルト: ON)
 caching_sha2_password_auto_generate_rsa_keys=ON
 
 # SHA-256ハッシュの反復回数 (デフォルト: 5000)
 caching_sha2_password_digest_rounds=5000


caching_sha2_password_auto_generate_rsa_keys=ON により、サーバ起動時にRSA鍵ペアが自動生成される。
既存の鍵ファイルが存在する場合は、既存のファイルが使用される。

クライアント接続例を以下に示す。

 # SSL/TLS接続 (推奨)
 mysql --ssl-mode=REQUIRED -u username -p
 
 # RSA公開鍵をサーバから取得して接続
 mysql --ssl-mode=DISABLED -u username -p --get-server-public-key
 
 # ローカルファイルの公開鍵を使用して接続
 mysql --ssl-mode=DISABLED -u username -p --server-public-key-path=/path/to/public_key.pem


mysql_native_passwordからの移行

既存の mysql_native_password ユーザを caching_sha2_password に移行する方法を以下に示す。

 -- 既存ユーザの認証プラグインを変更
 ALTER USER 'username'@'hostname' IDENTIFIED WITH caching_sha2_password BY 'password';


また、新規ユーザ作成時にデフォルトの認証プラグインを設定する方法を以下に示す。

 [mysqld]
 # MySQL 8.0のデフォルト (明示的に指定する場合)
 default_authentication_plugin=caching_sha2_password


移行時の注意事項を以下に示す。

  • クライアントライブラリが caching_sha2_password に対応しているか確認する。
  • 古いクライアントライブラリは caching_sha2_password をサポートしていない可能性がある。
  • SSL/TLS接続が利用可能か確認する。
  • レプリケーション環境では、スレーブサーバのクライアントライブラリも確認する。



認証プラグインの設定

認証プラグインは、グローバルレベルとユーザレベルで設定できる。

デフォルト認証プラグインの設定

サーバ全体のデフォルト認証プラグインを設定する方法を以下に示す。

設定ファイルによる設定を以下に示す。

 [mysqld]
 # MySQL 8.0のデフォルト
 default_authentication_plugin=caching_sha2_password
 
 # MySQL 5.7互換モード (非推奨)
 # default_authentication_plugin=mysql_native_password


動的変更による設定を以下に示す。

 -- デフォルト認証プラグインを変更
 SET GLOBAL default_authentication_plugin = 'caching_sha2_password';


現在の設定を確認する方法を以下に示す。

 SHOW VARIABLES LIKE 'default_authentication_plugin';


MySQL 8.0以降では、default_authentication_plugin のデフォルト値は caching_sha2_password である。
MySQL 5.7では、デフォルト値は mysql_native_password である。

新規ユーザ作成時に認証プラグインを明示的に指定しない場合、デフォルト認証プラグインが使用される。

ユーザごとの認証プラグイン設定

ユーザごとに異なる認証プラグインを設定できる。

CREATE USER による設定を以下に示す。

 -- caching_sha2_password を使用
 CREATE USER 'user1'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';
 
 -- mysql_native_password を使用 (MySQL 8.4未満)
 CREATE USER 'user2'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
 
 -- auth_socket を使用 (パスワード不要)
 CREATE USER 'alice'@'localhost' IDENTIFIED WITH auth_socket;
 
 -- LDAP認証を使用 (Enterprise Edition)
 CREATE USER 'user3'@'localhost' IDENTIFIED WITH authentication_ldap_simple AS 'uid=user3,ou=People,dc=example,dc=com';


ALTER USER による変更を以下に示す。

 -- 既存ユーザの認証プラグインを変更
 ALTER USER 'user1'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'newpassword';
 
 -- パスワードのみ変更 (認証プラグインは維持)
 ALTER USER 'user1'@'localhost' IDENTIFIED BY 'newpassword';


ユーザの認証プラグイン確認を以下に示す。

 SELECT user, host, plugin FROM mysql.user;



パスワードポリシーと管理

MySQL 8.0以降、パスワードの強度、有効期限、再利用制限、アカウントロック等の高度なパスワード管理機能が提供される。

validate_passwordコンポーネント

validate_password コンポーネントは、パスワードの強度を検証する。

インストール方法を以下に示す。

 INSTALL COMPONENT 'file://component_validate_password';


パスワードポリシーレベルを以下に示す。

パスワードポリシーレベル
レベル 説明 要件
LOW 長さのみ検証 最小長を満たすパスワード
MEDIUM 長さ + 複雑性検証 最小長 + 大文字・小文字・数字・特殊文字を含む
STRONG MEDIUM + 辞書検証 MEDIUM要件 + 辞書ファイルに含まれる単語を禁止


パスワードポリシーの設定例を以下に示す。

 -- ポリシーレベル設定
 SET GLOBAL validate_password.policy = 'MEDIUM';
 
 -- 最小長設定
 SET GLOBAL validate_password.length = 10;
 
 -- 数字の最小個数
 SET GLOBAL validate_password.number_count = 2;
 
 -- 大文字・小文字の最小個数
 SET GLOBAL validate_password.mixed_case_count = 1;
 
 -- 特殊文字の最小個数
 SET GLOBAL validate_password.special_char_count = 1;
 
 -- ユーザ名を含むパスワードを禁止
 SET GLOBAL validate_password.check_user_name = ON;


設定ファイルによる永続化を以下に示す。

 [mysqld]
 # パスワードポリシー設定
 validate_password.policy=MEDIUM
 validate_password.length=10
 validate_password.number_count=2
 validate_password.mixed_case_count=1
 validate_password.special_char_count=1
 validate_password.check_user_name=ON


パスワード有効期限

パスワード有効期限により、定期的なパスワード変更を強制できる。

グローバル設定を以下に示す。

 -- グローバルデフォルト有効期限 (日数)
 SET GLOBAL default_password_lifetime = 180;
 
 -- 無期限 (デフォルト)
 SET GLOBAL default_password_lifetime = 0;


ユーザ単位設定を以下に示す。

 -- 90日で期限切れ
 CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE INTERVAL 90 DAY;
 
 -- 無期限
 CREATE USER 'user2'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
 
 -- グローバル設定に従う
 CREATE USER 'user3'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE DEFAULT;
 
 -- 既存ユーザの変更
 ALTER USER 'user1'@'localhost' PASSWORD EXPIRE INTERVAL 180 DAY;


設定ファイルによる設定を以下に示す。

 [mysqld]
 # グローバルデフォルト有効期限 (180日)
 default_password_lifetime=180


パスワード再利用制限

パスワード再利用制限により、過去に使用したパスワードの再利用を防止できる。

ユーザ単位設定を以下に示す。

 -- 直近5個のパスワードを再利用禁止
 CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password' PASSWORD HISTORY 5;
 
 -- 365日以内のパスワードを再利用禁止
 CREATE USER 'user2'@'localhost' IDENTIFIED BY 'password' PASSWORD REUSE INTERVAL 365 DAY;
 
 -- 両方の条件を適用
 CREATE USER 'user3'@'localhost' IDENTIFIED BY 'password'
   PASSWORD HISTORY 5
   PASSWORD REUSE INTERVAL 365 DAY;
 
 -- 既存ユーザの変更
 ALTER USER 'user1'@'localhost' PASSWORD HISTORY 10;


グローバル設定を以下に示す。

 SET GLOBAL password_history = 5;
 SET GLOBAL password_reuse_interval = 365;


設定ファイルによる設定を以下に示す。

 [mysqld]
 # パスワード履歴管理
 password_history=5
 password_reuse_interval=365


デュアルパスワード

デュアルパスワード機能により、段階的なパスワード変更が可能である。
プライマリパスワードとセカンダリパスワードの2つのパスワードを同時に有効にできる。

デュアルパスワードの設定例を以下に示す。

 -- 新しいパスワードを設定し、現在のパスワードを保持
 ALTER USER 'user1'@'localhost' IDENTIFIED BY 'new_password' RETAIN CURRENT PASSWORD;
 
 -- この時点で new_password (プライマリ) と old_password (セカンダリ) の両方が有効
 
 -- アプリケーションを段階的に新パスワードに移行
 
 -- 移行完了後、古いパスワードを破棄
 ALTER USER 'user1'@'localhost' DISCARD OLD PASSWORD;


デュアルパスワードの用途を以下に示す。

  • アプリケーションの段階的パスワード変更
    複数のアプリケーションが同一アカウントを使用している場合、全アプリケーションを同時に更新できない
    デュアルパスワードにより、順次更新が可能
  • ダウンタイムなしのパスワードローテーション
    サービス停止なしでパスワードを変更できる


失敗ログインの追跡とアカウントロック

失敗ログインの追跡により、ブルートフォース攻撃を防止できる。

アカウントロック設定を以下に示す。

 -- 3回の連続失敗で2日間ロック
 CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password'
   FAILED_LOGIN_ATTEMPTS 3
   PASSWORD_LOCK_TIME 2;
 
 -- 3回の連続失敗で永続ロック (管理者による解除まで)
 CREATE USER 'user2'@'localhost' IDENTIFIED BY 'password'
   FAILED_LOGIN_ATTEMPTS 3
   PASSWORD_LOCK_TIME UNBOUNDED;
 
 -- 既存ユーザの変更
 ALTER USER 'user1'@'localhost'
   FAILED_LOGIN_ATTEMPTS 5
   PASSWORD_LOCK_TIME 1;


アカウントロックの手動解除を以下に示す。

 -- アカウントロックを解除
 ALTER USER 'user1'@'localhost' ACCOUNT UNLOCK;


ロック状態の確認を以下に示す。

 SELECT user, host, account_locked FROM mysql.user;



多要素認証 (MFA)

MySQL 8.0.27以降、多要素認証 (Multi-Factor Authentication, MFA) がサポートされる。
最大3つの認証ファクタ (1FA、2FA、3FA) を組み合わせることができる。

authentication_policyシステム変数

authentication_policy システム変数により、多要素認証の要件を定義する。

設定値の意味を以下に示す。

authentication_policyの設定値
設定値 説明
* ファクタ必須、任意のプラグインを使用可能
空要素 ファクタオプション
プラグイン名 特定のプラグイン必須


authentication_policy の設定例を以下に示す。

 -- デフォルト設定 (1FA必須、2FA/3FAオプション)
 SET GLOBAL authentication_policy = '*,,';
 
 -- 1FA・2FA必須、3FAオプション
 SET GLOBAL authentication_policy = '*,*,';
 
 -- 1FA・2FA・3FA全て必須
 SET GLOBAL authentication_policy = '*,*,*';
 
 -- 1FAはcaching_sha2_password、2FA/3FAオプション
 SET GLOBAL authentication_policy = 'caching_sha2_password,,';
 
 -- 1FAはcaching_sha2_password、2FAは任意、3FAはauthentication_webauthn
 SET GLOBAL authentication_policy = 'caching_sha2_password,*,authentication_webauthn';


設定ファイルによる設定を以下に示す。

 [mysqld]
 # 1FA・2FA必須、3FAオプション
 authentication_policy='*,*,'


2FA (2要素認証) の設定

2要素認証ユーザの作成例を以下に示す。

 -- 1FA: caching_sha2_password、2FA: LDAP SASL
 CREATE USER 'alice'@'localhost'
   IDENTIFIED WITH caching_sha2_password BY 'sha2_password'
   AND IDENTIFIED WITH authentication_ldap_sasl AS 'uid=alice_ldap,ou=People,dc=example,dc=com';
 
 -- 1FA: caching_sha2_password、2FA: WebAuthn
 CREATE USER 'bob'@'localhost'
   IDENTIFIED WITH caching_sha2_password BY 'password'
   AND IDENTIFIED WITH authentication_webauthn;


既存ユーザに2FAを追加する例を以下に示す。

 -- 2FAファクタを追加
 ALTER USER 'alice'@'localhost' ADD 2 FACTOR IDENTIFIED WITH authentication_webauthn;
 
 -- 2FAファクタを変更
 ALTER USER 'alice'@'localhost' MODIFY 2 FACTOR IDENTIFIED WITH authentication_ldap_sasl AS 'uid=alice,ou=People,dc=example,dc=com';
 
 -- 2FAファクタを削除
 ALTER USER 'alice'@'localhost' DROP 2 FACTOR;


3FA (3要素認証) の設定

3要素認証ユーザの作成例を以下に示す。

 -- 1FA: caching_sha2_password、2FA: LDAP SASL、3FA: WebAuthn
 CREATE USER 'charlie'@'localhost'
   IDENTIFIED WITH caching_sha2_password BY 'password'
   AND IDENTIFIED WITH authentication_ldap_sasl AS 'uid=charlie_ldap,ou=People,dc=example,dc=com'
   AND IDENTIFIED WITH authentication_webauthn;


既存ユーザに3FAを追加する例を以下に示す。

 -- 3FAファクタを追加
 ALTER USER 'bob'@'localhost' ADD 3 FACTOR IDENTIFIED WITH authentication_webauthn;
 
 -- 3FAファクタを削除
 ALTER USER 'bob'@'localhost' DROP 3 FACTOR;


MFAの制約

多要素認証の制約を以下に示す。

多要素認証の制約
内部認証プラグイン (caching_sha2_passwordmysql_native_passwordsha256_password) は、第1ファクタのみで使用可能。
第2ファクタおよび第3ファクタでは使用不可。
外部認証プラグイン (LDAP、PAM、Kerberos、WebAuthn等) は、第2ファクタおよび第3ファクタで使用可能。
同一の認証プラグインを複数のファクタで使用することは非推奨。
WebAuthn認証プラグインは、第1ファクタ (パスワードレス) または第2/第3ファクタ (MFA) で使用可能。



バージョン別の変更点

MySQLのバージョンによって、デフォルト認証プラグインと対応認証方式が変更されている。

バージョン別のデフォルト認証プラグイン
バージョン デフォルトプラグイン 主な変更点
MySQL 5.7 mysql_native_password プラガブル認証フレームワーク確立
sha256_password追加
MySQL 8.0.0 - 8.0.26 caching_sha2_password デフォルト認証方式変更
caching_sha2_password導入
MySQL 8.0.27 - 8.0.33 caching_sha2_password 多要素認証フレームワーク追加
authentication_fido追加
MySQL 8.0.34 caching_sha2_password mysql_native_password非推奨化
MySQL 8.0.35+ caching_sha2_password authentication_fido非推奨化
authentication_webauthn推奨
MySQL 8.2.0+ caching_sha2_password authentication_webauthn追加
MySQL 8.4 caching_sha2_password mysql_native_passwordデフォルト無効化
MySQL 9.0+ caching_sha2_password mysql_native_password完全削除


バージョン別の認証プラグイン対応状況を以下に示す。

認証プラグインのバージョン別対応
プラグイン名 MySQL 5.7 MySQL 8.0 MySQL 8.2+ MySQL 9.0+
caching_sha2_password サポート デフォルト デフォルト デフォルト
mysql_native_password デフォルト サポート (非推奨 8.0.34+) サポート (無効 8.4+) 削除
sha256_password サポート サポート (非推奨) サポート (非推奨) サポート (非推奨)
auth_socket サポート サポート サポート サポート
authentication_ldap_* Enterprise Enterprise Enterprise Enterprise
authentication_pam Enterprise Enterprise Enterprise Enterprise
authentication_kerberos - Enterprise Enterprise Enterprise
authentication_fido - サポート (8.0.27+) 非推奨 (8.0.35+) 非推奨
authentication_webauthn - - サポート (8.2.0+) サポート


移行時の注意事項を以下に示す。

  • MySQL 5.7からMySQL 8.0への移行時は、caching_sha2_password 対応を確認する。
  • MySQL 8.4以降への移行時は、mysql_native_password ユーザを caching_sha2_password に変更する。
  • MySQL 9.0への移行時は、mysql_native_password は使用不可
  • クライアントライブラリのバージョンも確認し、必要に応じて更新する。



トラブルシューティング

アクセス拒否エラー

アクセス拒否エラー (ERROR 1045 (28000): Access denied) が発生する場合の対処方法を以下に示す。

  • パスワード誤り
    パスワードを確認し、必要に応じて ALTER USER でリセットする。
  • ユーザが存在しない
    SELECT user, host FROM mysql.user WHERE user='username'; でユーザの存在を確認する。
  • ホスト制限
    mysql.user テーブルの host カラムを確認する。
    bind-address システム変数を確認する。
  • 認証プラグイン非対応
    SHOW PLUGINS; でプラグインの有効化を確認する。
    クライアントライブラリが認証プラグインをサポートしているか確認する。


パスワードリセット例を以下に示す。

 -- rootユーザでログインしてパスワードをリセット
 ALTER USER '<ユーザ名>'@'<IPアドレス または ホスト名>' IDENTIFIED BY '<新しいパスワード>';
 FLUSH PRIVILEGES;


クライアント互換性の問題

古いクライアントライブラリで caching_sha2_password に対応していない場合の対処方法を以下に示す。

エラーメッセージの例を以下に示す。

  • Authentication plugin 'caching_sha2_password' cannot be loaded
  • Authentication plugin 'caching_sha2_password' is not supported


対処方法を以下に示す。

  • クライアントライブラリのアップデート (推奨)
    MySQL Connector/J 8.0.9以降
    MySQL Connector/Python 8.0.11以降
    PHP mysqlnd 7.2.4以降
    Node.js mysql2パッケージ
  • サーバ側で mysql_native_password を使用 (MySQL 8.4未満のみ)
    ALTER USER '<ユーザ名>'@'<IPアドレス または ホスト名>' IDENTIFIED WITH mysql_native_password BY '<パスワード>';
  • SSL/TLS接続を有効化
    mysql --ssl-mode=REQUIRED -u <ユーザ名> -p


クライアントライブラリの対応状況の確認方法を以下に示す。

  • MySQL Connector/Jのバージョン確認
    java -jar mysql-connector-java-*.jar --version
  • PHP mysqldのバージョン確認
    php -i | grep mysqlnd
  • Pythonパッケージのバージョン確認
    pip show mysql-connector-python


RSA鍵関連のエラー

caching_sha2_password 使用時にRSA鍵関連のエラーが発生する場合の対処方法を以下に示す。

エラーメッセージの例を以下に示す。

  • Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection
  • Public key is not available


対処方法を以下に示す。

  • SSL/TLS接続を使用 (推奨)
    mysql --ssl-mode=REQUIRED -u <ユーザ名> -p
  • RSA鍵の自動生成を有効化
    caching_sha2_password_auto_generate_rsa_keys=ON を設定ファイルに追加
    MySQLサーバを再起動
  • クライアント側でRSA公開鍵を取得
    mysql --ssl-mode=DISABLED -u <ユーザ名> -p --get-server-public-key
  • ファイル権限の確認
    RSA鍵ファイルがMySQLプロセスユーザ (通常 mysql) に読み取り可能か確認


RSA鍵ファイルの権限設定例を以下に示す。

 # RSA秘密鍵の権限設定
 chown mysql:mysql /var/lib/mysql/private_key.pem
 chmod 400 /var/lib/mysql/private_key.pem
 
 # RSA公開鍵の権限設定
 chown mysql:mysql /var/lib/mysql/public_key.pem
 chmod 444 /var/lib/mysql/public_key.pem


RSA鍵の手動生成例を以下に示す。

 # RSA秘密鍵生成 (2048ビット)
 openssl genrsa -out /var/lib/mysql/private_key.pem 2048
 
 # RSA公開鍵生成
 openssl rsa -in /var/lib/mysql/private_key.pem -pubout -out /var/lib/mysql/public_key.pem
 
 # 権限設定
 chown mysql:mysql /var/lib/mysql/private_key.pem /var/lib/mysql/public_key.pem
 chmod 400 /var/lib/mysql/private_key.pem
 chmod 444 /var/lib/mysql/public_key.pem


設定ファイルでRSA鍵パスを明示する例を以下に示す。

 [mysqld]
 caching_sha2_password_private_key_path=/var/lib/mysql/private_key.pem
 caching_sha2_password_public_key_path=/var/lib/mysql/public_key.pem
 caching_sha2_password_auto_generate_rsa_keys=ON



参考リンク