Slide 1

Slide 1 text

caching_sha2_passwordの はなし MySQL30周年&ユーザ会25周年記念イベント @amamanamam

Slide 2

Slide 2 text

くぼ ● DBREやってます ● MySQL 8.0から仲良くなり始めました ● ビールをよく飲みます ● Xはこちら ○ https://twitter.com/amamanamam

Slide 3

Slide 3 text

皆さん caching_sha2_password 移行の準備は できていますか?

Slide 4

Slide 4 text

ということで caching_sha2_password について簡単に まとめてきました

Slide 5

Slide 5 text

アジェンダ ・前提 ・mysql_native_passwordの仕様の話 ・sha256_passwordの仕様の話 ・caching_sha2_passwordの仕様の話

Slide 6

Slide 6 text

アジェンダ ・前提 ・mysql_native_passwordの仕様の話 ・sha256_passwordの仕様の話 ・caching_sha2_passwordの仕様の話

Slide 7

Slide 7 text

前提 ● MySQL 8.0と8.4LTSでは caching_sha2_passwordがデフォルト ● MySQL8.4LTSでは mysql_native_passwordが無効 ● MySQL9.0 Innovation Releaseでは mysql_native_passwordが廃止

Slide 8

Slide 8 text

前提 ● AuroraMySQL V3では mysql_native_passwordがデフォルト ● AuroraMySQL V4(?)でやっと caching_sha2_passwordがデフォルトに  なったりするかな...?

Slide 9

Slide 9 text

前提 https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_lifecycle.html

Slide 10

Slide 10 text

前提 ● ServerGreeting ○ Initial Handshake packetの送信 ○ default_authentication_pluginで設定されている認証プ ラグインを送信 ● LoginRequest ○ Initial Handshake packetの応答 ○ クライアント側で使用する認証プラグインを送信 ○ その後サーバー側でmysql.userのpluginを確認

Slide 11

Slide 11 text

前提 ● AuthSwitchRequest/Response ○ ユーザの認証プラグインが期待されている認証プラグイ ンと異なった時に、使用すべき認証プラグインを送信

Slide 12

Slide 12 text

アジェンダ ・前提 ・mysql_native_passwordの仕様の話 ・sha256_passwordの仕様の話 ・caching_sha2_passwordの仕様の話

Slide 13

Slide 13 text

mysql_native_passwordの仕様の話 ● パスワードハッシュ(SHA-1)を用いたチャレンジ&レスポンス認 証 ● ユーザ作成を行うと、mysql.userのauthentication_stringカラ ムにSHA1(SHA1(passwors))の結果が格納される mysql> create user kubo identified with 'mysql_native_password' by 'password'; Query OK, 0 rows affected (0.27 sec) mysql> select Host,User,plugin,authentication_string from mysql.user where User='kubo'; +------+------+-----------------------+-------------------------------------------+ | Host | User | plugin | authentication_string | +------+------+-----------------------+-------------------------------------------+ | % | kubo | mysql_native_password | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 | +------+------+-----------------------+-------------------------------------------+ 1 row in set (0.03 sec)

Slide 14

Slide 14 text

mysql_native_passwordの仕様の話 ● サーバ側からクライアント側に20バイトのランダムデータが 送信され、クライアント側で以下の計算をしてサーバーに送 信 SHA1( password ) XOR SHA1( "20-bytes random data from server" SHA1( SHA1( password ) ) ) ● サーバーはSHA1(SHA1( password ))とランダムデータの値 を知っているので、それらとクライアントから送られてきた計 算結果にXORとSHA1を作用させることで、パスワードハッ シュを照合

Slide 15

Slide 15 text

アジェンダ ・前提 ・mysql_native_passwordの仕様の話 ・sha256_passwordの仕様の話 ・caching_sha2_passwordの仕様の話

Slide 16

Slide 16 text

sha256_passwordの仕様の話 ● パスワードハッシュ方式(SHA-256)に基づいた認証 ● salt付きでハッシュ化されるため、同じパスワードのユーザ作 成でも異なるauthentication_stringの値となる mysql> create user kubo1 identified with 'sha256_password' by 'password'; Query OK, 0 rows affected (0.03 sec) mysql> create user kubo2 identified with 'sha256_password' by 'password'; Query OK, 0 rows affected (0.03 sec) mysql> select Host,User,plugin,SUBSTR(HEX(authentication_string), -10) from mysql.user where User in ('kubo1','kubo2'); +------+-------+-----------------+-----------------------------------------+ | Host | User | plugin | SUBSTR(HEX(authentication_string), -10) | +------+-------+-----------------+-----------------------------------------+ | % | kubo1 | sha256_password | 736D4A6132 | | % | kubo2 | sha256_password | 7631786841 | +------+-------+-----------------+-----------------------------------------+

Slide 17

Slide 17 text

sha256_passwordの仕様の話 ● パスワードをプレーンテキストで送る必要があるため、 SSL/TLSやRSA暗号鍵でのセキュアな接続を必要とす る

Slide 18

Slide 18 text

アジェンダ ・前提 ・mysql_native_passwordの仕様の話 ・sha256_passwordの仕様の話 ・caching_sha2_passwordの仕様の話

Slide 19

Slide 19 text

caching_sha2_passwordの仕様の話 ● パスワードハッシュ方式(SHA-256)に基づいた認証 ● クライアント・サーバー間のやり取りには以下の2つのフェー ズがある ○ Fast authentication ○ Complete authentication

Slide 20

Slide 20 text

caching_sha2_passwordの仕様の話 ● Fast authenticationではmysql_native_passwordのように まずサーバーからクライアントへランダムデータを送る ● クライアントでは以下の計算結果をサーバーに送る XOR(SHA256(password), SHA256(SHA256(SHA256(password)), Nonce)) ● サーバー側では該当ユーザのパスワードハッシュの値が キャッシュ内にあるか確認 ● そこでもし見つかれば、クライアントから送られてきた計算結 果にその値とランダムデータの値をXORとSHAを作用させる ことで、パスワードハッシュの照合

Slide 21

Slide 21 text

caching_sha2_passwordの仕様の話 ● キャッシュ内に何も見つからなければComplete authenticationのフェーズに入る ● Complete authenticationでは、sha256_passwordのように SSL/TLS接続もしくはRSA暗号化通信がなされた状況下で パスワードをそのまま受け取って照合を行う

Slide 22

Slide 22 text

caching_sha2_passwordの仕様の話 ● キャッシュ内に何も見つからなければComplete authenticationのフェーズに入る ● Complete authenticationでは、sha256_passwordのように SSL/TLS接続もしくはRSA暗号化通信がなされた状況下で パスワードをそのまま受け取って照合を行う

Slide 23

Slide 23 text

まとめ ● caching_sha2_passwordはmysql_native_passwordと sha256_passwordを組み合わせたような認証プラグイン ● 1回目の認証はsha256_passwordのようにセキュアな経路 を必要とする ● 2回目以降はキャッシュ内のパスワードハッシュに基づいて mysql_native_passwordのような認証を行う

Slide 24

Slide 24 text

参考 ● Protecting MySQL Passwords With the sha256_password Plugin ● MySQL 8.0.4 : New Default Authentication Plugin : caching_sha2_password ● Caching_sha2_password information