MySQL は、caching_sha2_password を拡張し、新しいパスワード保存形式としてSHA-512 を使用したPBKDF2をサポートするようになりました。

これはパスワードセキュリティにおける重要な前進です。新しい認証プラグインを導入することなく、既存のクライアントとの互換性を維持しながら、保存されるパスワード情報の保護を強化できます。また、一斉移行を強制する必要もありません。

既存のアカウントは引き続き利用可能であり、新しく設定されるパスワードにはより強固な保存形式を適用できます。さらに管理者は、実行時の制御機能を利用して、新形式への移行を段階的に促進したり、必要に応じて強制したりすることができます。

この改善の本質的な価値は、より強固なパスワード保存方式の提供、アプリケーションやユーザーへの影響を最小限に抑えた導入、明確でスムーズな移行パスの実現 の3点にあります。

つまり、この機能は 「より強力でありながら、現実的に導入しやすいセキュリティ強化策」 と言えるでしょう。

改善の背景

パスワードの保存方式は、暗号要件の変化に合わせて進化し続ける必要があります。特に、長期的な耐性が重要視されるようになり、耐量子計算機(ポスト量子)時代を見据えたセキュリティ対策への関心が高まる中、より強力なパスワード変換アルゴリズムを採用することは合理的な選択と言えます。

これまで caching_sha2_password では、保存されるパスワードの変換処理に CRYPT5(SHA-256ベース) が使用されてきました。今回の機能強化により、MySQLは PBKDF2 (SHA-512ベース) をサポートし、認証フローを変更することなく、より強力なパスワード保存オプションを提供できるようになりました。

これにより、既存のアプリケーションや認証方式との互換性を維持しながら、パスワード保存時のセキュリティレベルを向上させることが可能になります。

caching_sha2_password における変更点

caching_sha2_passwordプラグインは 2 つのパスワード保存形式をサポートします:

  • CRYPT5(SHA-256ベース) : 従来の動作
  • PBKDF2(SHA-512ベース) : より強力なパスワード変換方式

管理者は、新規作成されるパスワードやパスワードリセット時に使用する保存形式を動的に選択できるようになります。

また、MySQLでは 実行時に設定可能な制御機能が追加され、パスワード保存形式を強制できるようになります。この強制機能を有効にした場合、異なる形式で保存されているアカウントであってもログインは可能ですが、ログイン直後にパスワード変更が要求され、管理者が指定した形式で再保存されます。

さらに、パスワード保存に関連する設定の一貫性も向上します。

これまでダイジェスト計算の反復回数(digest rounds)を制御するためのオプションが存在していましたが、このオプションも 動的変更可能(dynamic) となり、新たに追加された実行時設定可能な保存形式の管理機能と整合性が取られるようになります。

以降のセクションでは、これらの変更点についてさらに詳しく説明し、実際の運用においてどのように機能するのかを解説します。保存形式の強制も可能になります。強制が有効な場合、異なる形式で保存されたアカウントはログインできますが、パスワード変更を要求されて推奨形式で再保存されます。

パスワード保存形式に関する実行時制御

新しいグローバル動的変数により、パスワードの作成やリセット時に使用される形式を制御できるようになりました:
--caching_sha2_password_storage_format

有効な値:

  • CRYPT5
  • PBKDF2_SHA512

デフォルト:

  • CRYPT5

この設定は動的なため、管理者は実行時に変更することができます。その後のCREATE USERまたはALTER USER操作では、その時点で指定されている形式が使用されます。

これにより簡単に導入でき、サービスの中断やプラグインの変更を伴わずに、独自のスケジュールに従って段階的に PBKDF2 へ移行することができます。

下位互換性

この設計の重要な点は、認証が現在優先されている形式ではなく、保存されたパスワードの形式に基づいて行われるということです。

つまり、古い形式を使用してアカウントが作成された場合でも、サーバーの設定が変更された後も通常通り認証が行われます。新しいポリシーは、新しく設定されるパスワードにのみ適用され、既存のパスワードには遡及的に適用されることはありません。

これこそが、安全な移行のためにあるべき姿です。予期せぬ不具合を引き起こすことなく、移行を進められるということです。

移行のための強制機能(オプション)

一方で、より強力なポリシー制御を必要とする環境もあるため、MySQLにはもう1つのグローバル動的変数が追加されています:

--caching_sha2_password_enforce_storage_format

有効な値:

  • 0 (FALSE)
  • 1 (TRUE)

デフォルト:

  • 0

この設定を無効にしている場合、デフォルト以外の形式を使用しているアカウントは引き続き正常に動作します。次にパスワードが変更されたときのみ保存形式が変更されます。

この設定を有効にしている場合、推奨されない保存形式を使用しているユーザーは引き続き認証できますが、直ちにパスワードの変更を強制されます。そのパスワード変更により、ユーザーは推奨形式に移行することになります。

これはロックアウトを回避しつつ、システムをポリシーの統一へと導くことができる妥協案となります。

認証キャッシュの動作

実行時に --caching_sha2_password_enforce_storage_format が変更されると、高速認証キャッシュがクリアされます。これにより、新しいポリシーが一貫して適用されることが保証されます。

また、パスワード変更強制機能が有効になっている状態で、推奨されない形式で保存されたパスワードを使用してユーザーがログインした場合、そのパスワードは高速認証用にキャッシュされません。これにより、アカウントのパスワード更新が予定されている間、旧形式の認証情報がキャッシュされたログイン情報が利用されることを防ぎます。

二重パスワードを持つアカウント

二重パスワードを持つアカウントの場合、強制変更の判断はログイン時に実際に使用されたパスワードに基づいて行われます。

一貫性の向上

今回の機能改善の一環として、--caching_sha2_password_digest_rounds も 動的に変更されるようになりました。これにより、他の保存形式に関連する設定と整合性が取れ、実行時の管理の一貫性が向上します。

レプリケーションと ロールアウトに関する留意事項

レプリケーションの動作は変更ありません。プライマリ側で特定の形式でパスワードハッシュが生成された場合、同じ形式でセカンダリおよびレプリカにレプリケートされます。

運用上、以下の3点が重要です:

  • セカンダリおよびレプリカは、プライマリよりも先にアップグレードする必要があります
  • 設定内容は、ノード間で一貫性を保つ必要があります
  • 設定内容が一致していない場合、トポロジー全体でユーザー体験に一貫性が失われる可能性があります

したがって、この機能は既存のレプリケーションのセマンティクスに適合しますが、調整されたロールアウトは依然として重要です。

X Plugin のサポート

この変更は X Plugin 認証にも適用され、PBKDF2形式で保存されたパスワードを検証するように更新されます。

これにより、この変更が単一の認証パスに限定された部分的な機能強化ではないことが保証されます。PBKDF2のサポートは、より広範なMySQLの認証領域の一部となります。

内部の仕組み: 開発者向けの詳細

運用面のメリットに加えて、この変更には、認証機能、プラグインの統合、またはプロトコルレベルの動作に携わる開発者にとって特に重要となる実装上の変更も含まれています。

PBKDF2の保存形式

新しいPBKDF2ベースのパスワード形式は、サーバーが保存された値から変換方式を直接識別し、それに応じて認証を実行できるようにシリアライズされています。

シリアライズされた形式には、以下の情報が含まれます。

  • ダイジェストタイプ識別子B
  • 反復回数(iteration count):3桁の16進数で格納され、実際の反復回数はその値に1000を掛けて算出される
  • ソルト長CRYPT_SALT_LENGTH
  • ダイジェスト値:Base64形式で保存

実装の観点から重要な点は、検証が形式に依存したままであるということです。サーバーは、現在のポリシーに基づいて保存されたパスワードデータを再解釈することはせず、保存された変換自体にエンコードされた形式を使用します。

認証プラグイン ABI のサポート

有効な認証情報を不必要に拒否することなく、保存形式の強制適用をサポートするために、認証プラグイン ABI が拡張され、新しい戻り値が追加されました:

CR_OK_FORCE_PASSWORD_CHANGE

この値が返却されると、password-expired 属性がセキュリティコンテキスト内で true に設定され、ユーザーはログイン直後にパスワード変更を強制されます。

caching_sha2_password プラグインでは、以下の両方の条件を満たした場合に、この戻り値が使用されます:

  • --caching_sha2_password_enforce_storage_format=1
  • アカウントに保存されているパスワード形式(デュアルパスワード利用時は使用中のパスワード)が、--caching_sha2_password_storage_format の設定と一致しない

この仕組みにより、認証レイヤーは以下の2つの状態を明確に区別できるようになります。

  • 認証に成功した状態
  • 認証には成功したが、直後にパスワードのローテーション(変更)が必要な状態

つまり、認証そのものは許可しつつ、新しいパスワード保存形式への移行を段階的に推進できるようになっています。

まとめ

caching_sha2_password への PBKDF2-SHA512 のサポートが追加されたことで、アプリケーションやユーザーへの影響を最小限に抑えながら、より強力で将来性のあるパスワード保存方式を利用できるようになりました。この改善により、暗号学的な安全性が向上するとともに、導入時の負担を抑えながら、従来の保存方式からより強力なパスワード管理方式へ移行するための明確な道筋が提供されます。

管理者にとっては、移行の負担を抑えながらセキュリティを向上させることができ、ユーザーにとっても、影響を最小限に抑えながら移行を進めることが可能です。この両立こそが、今回の本機能の大きな価値と言えるでしょう。

現在caching_sha2_passwordをご利用の場合は、この機会にご利用の環境においてPBKDF2-SHA512を評価し、より強力な保存形式への段階的な移行計画を検討することをお勧めします。

いつも、MySQLをご利用いただき誠にありがとうございます。