MySQL - 認証プラグイン
概要
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_password、mysql_native_password、sha256_password、auth_socket、
LDAP認証プラグイン (Enterprise Edition)、PAM認証プラグイン (Enterprise Edition)、WebAuthn認証プラグイン等がある。
認証プラグインのアーキテクチャ
MySQLのプラガブル認証フレームワークは、サーバ側プラグインとクライアント側プラグインで構成される。
サーバ側プラグインとクライアント側プラグイン
認証プラグインの構成を以下に示す。
| 種類 | 説明 |
|---|---|
| サーバ側プラグイン | MySQLサーバ内で実行される。 クライアントから送信された認証データを検証する。 mysql.user システムテーブルの authentication_string カラムに保存された認証データと照合する。
|
| クライアント側プラグイン | クライアントプログラム内で実行される。 認証データ (パスワードハッシュ等) をサーバに送信する。 サーバ側プラグインと対応する認証プロトコルを実装する。 |
各認証方式は、サーバ側プラグインとクライアント側プラグインのペアとして実装される。
例として、caching_sha2_password サーバ側プラグインは、caching_sha2_password クライアント側プラグインと組み合わせて使用される。
認証フロー
MySQLの認証フローを以下に示す。
- クライアントがユーザ名とホスト名を指定して接続要求を送信する。
- サーバは
mysql.userテーブルからアカウント行を検索する。 - サーバはアカウント行から適用される認証プラグインを特定する。
- サーバは特定された認証プラグインを実行してクライアントを認証する。
- 認証プラグインが認証の成功または失敗ステータスをサーバに返却する。
- 認証成功時は接続を確立し、失敗時は接続を拒否する。
認証プラグインは、プロキシユーザ機能をサポートする。
認証成功時に、接続ユーザが別のユーザのプロキシであることを示すことができる。
これにより、外部認証システムで認証されたユーザを、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 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認証プラグインを示す。
| プラグイン | 説明 |
|---|---|
authentication_ldap_simple |
Simple LDAP認証 クライアント側プラグインは mysql_clear_passwordパスワードがクリアテキストで送信されるため、TLS接続が必須 |
authentication_ldap_sasl |
SASL LDAP認証 クライアント側プラグインは authentication_ldap_sasl_clientSASLメッセージを使用した認証 |
下表に、主要なシステム変数を示す。
| 変数名 | 説明 |
|---|---|
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 USER、FLUSH 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 の設定例を以下に示す。
-- デフォルト設定 (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_password、mysql_native_password、sha256_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鍵ファイルが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
参考リンク
- MySQL 8.0 リファレンスマニュアル - プラガブル認証
- プラガブル認証フレームワークの詳細説明
- MySQL 8.0 リファレンスマニュアル - Caching SHA-2 プラガブル認証
- caching_sha2_password プラグインの詳細
- MySQL 8.0 リファレンスマニュアル - ネイティブプラガブル認証
- mysql_native_password プラグインの詳細
- MySQL 8.0 リファレンスマニュアル - 多要素認証
- 多要素認証 (MFA) の設定と使用方法
- MySQL 8.0 リファレンスマニュアル - パスワード管理
- パスワードポリシー、有効期限、再利用制限の詳細
- MySQL 8.0 リファレンスマニュアル - validate_password コンポーネント
- パスワード強度検証の設定
- MySQL セキュアデプロイメントガイド - 認証の設定
- セキュアな認証設定のベストプラクティス