これは、なにをしたくて書いたもの?
SSL/TLS接続を受け付けられるMySQLサーバーを立てた時に、クライアントの接続が平文なのか、SSL/TLSを使っているのか
確認する方法はないかな?と。
環境
今回の環境は、こちら。
mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.20 | +-----------+ 1 row in set (0.00 sec)
確認方法
すべての接続に対して確認する場合
以下のSQLで行います。
select status_by_thread.variable_value as tls_version, status_by_thread2.variable_value as cipher, threads.processlist_user as user, threads.processlist_host as host from performance_schema.status_by_thread as status_by_thread join performance_schema.threads as threads on threads.thread_id = status_by_thread.thread_id join performance_schema.status_by_thread as status_by_thread2 on status_by_thread2.thread_id = threads.thread_id where status_by_thread.variable_name = 'Ssl_version' and status_by_thread2.variable_name = 'Ssl_cipher' order by tls_version;
実行例。
+-------------+------------------------+-----------+-------------+ | tls_version | cipher | user | host | +-------------+------------------------+-----------+-------------+ | | | user1 | xxx.xxx.xxx.xxx | | TLSv1.3 | TLS_AES_256_GCM_SHA384 | user2 | xxx.xxx.xxx.xxx | | TLSv1.3 | TLS_AES_128_GCM_SHA256 | user3 | xxx.xxx.xxx.xxx | +-------------+------------------------+-----------+-------------+ 3 rows in set (0.00 sec)
もうひとつ
+-------------+------------------------+-----------+-------------+ | tls_version | cipher | user | host | +-------------+------------------------+-----------+-------------+ | | | user1 | xxx.xxx.xxx.xxx | | | | user2 | xxx.xxx.xxx.xxx | | TLSv1.3 | TLS_AES_256_GCM_SHA384 | user3 | xxx.xxx.xxx.xxx | +-------------+------------------------+-----------+-------------+
SSL/TLS通信を行っている場合は、SSL/TLSのバージョンと、使用しているアルゴリズムが表示されます。
Performance Schemaからの情報ですね。MySQL内のスレッドおよび、スレッドのステータス変数を利用しています。
MySQL :: MySQL 8.0 Reference Manual :: 26.12.15 Performance Schema Status Variable Tables
MySQL :: MySQL 8.0 Reference Manual :: 26.12.19.7 The threads Table
現在の接続に対して確認する場合
show statusで行います。
mysql> show status where variable_name = 'Ssl_version' or variable_name ='Ssl_cipher'; +---------------+------------------------+ | Variable_name | Value | +---------------+------------------------+ | Ssl_cipher | TLS_AES_256_GCM_SHA384 | | Ssl_version | TLSv1.3 | +---------------+------------------------+ 2 rows in set (0.00 sec)
平文で行っている場合。
mysql> show status where variable_name = 'Ssl_version' or variable_name ='Ssl_cipher'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Ssl_cipher | | | Ssl_version | | +---------------+-------+ 2 rows in set (0.25 sec)
こちらは、サーバーステータス変数を使用しています。
MySQL :: MySQL 8.0 Reference Manual :: 13.7.7.35 SHOW STATUS Statement
MySQL :: MySQL 8.0 Reference Manual :: 5.1.10 Server Status Variables
The SSL protocol version of the connection (for example, TLSv1). If the connection is not encrypted, the value is empty.
The current encryption cipher (empty for unencrypted connections).