CLOVER🍀

That was when it all began.

MySQLで、接続が平文なのかSSL/TLSを使っているのかを確認する

これは、なにをしたくて書いたもの?

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で行います。

SSL/TLS通信を行っている場合。

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

Ssl_version

The SSL protocol version of the connection (for example, TLSv1). If the connection is not encrypted, the value is empty.

Ssl_cipher

The current encryption cipher (empty for unencrypted connections).