MySQLでのSSL/TLS利用の基本

この記事は最終更新から6年以上経過しています。内容が古くなっている可能性があります。

はじめに

昨今のWebサービスでは常時SSL/TLS化が当たり前となっています。
HTTPだけに限らず、リモートとの通信をする場合はできる限り暗号化して、セキュリティを高めていきたいところです。
そこで改めてMySQLでSSL/TLSについて確認してみます。
現在では脆弱性等の問題でSSLを使用することはないと思いますが、便宜上まとめてSSL/TLSと表記します。

目次

SSL(Secure Socket Layer)/TLS(Transport Layer Security)

まず簡単にSSL/TLSの概要として
【暗号鍵を使いデータを暗号化し、メッセージ認証コードを使用し改ざんを検出し、デジタル署名で正当な相手との通信をする】
というものになるかと思います。

これらによって下記のようなセキュリティ向上が期待できます。
(自己署名証明書ではその限りではありません)

  • 盗聴を防ぐ
  • データの書き換えを防ぐ
  • なりすましを防ぐ
  • 事後否認を防ぐ
  • MySQLでの暗号化通信

    現在MySQL5.7を公式リポジトリからダウンロードしてインストールし、起動すると
    デフォルトで証明書が用意され、SSL/TLSが有効化されています。
    (5.6では手動で証明書を用意し、有効化する必要があります。)

    試しに5.7.21をリポジトリからインストールし、起動します。

    サーバー起動後、データディレクトリを確認すると各種鍵/証明書が用意されます。

    各ファイルの説明
    ca-cert.pem: サーバー側とクライアント側で –ssl-ca への引数として使用(CA 証明書を使用する場合は、両側で同じものを指定する必要)
    server-cert.pem、server-key.pem: サーバー側で –ssl-cert および –ssl-key への引数として使用
    client-cert.pem、client-key.pem: クライアント側で –ssl-cert および –ssl-key への引数として使用
    https://dev.mysql.com/doc/refman/5.6/ja/creating-ssl-certs.htmlより

    ではリモートから接続して暗号化されているか確認して見ましょう
    (初期のパスワード設定は割愛します)

    ちゃんと設定されていますね。
    では、実際のパケットでも確認してみましょう。

    サーバー側で「tcpdump」を使いキャプチャ出来るように準備します。

    ※tcpdumpはネットワーク上に流れるパケットをキャプチャ出来る便利ツールです

    リモートのクライアントから接続してみます。
    まずは暗号化されていない状態で確認。

    ではサーバー側で確認してみます。
    セッションをつなぐ際のログが流れていますが、コマンド実行時のパケットを抜粋すると下記のようになります。

    平文でリクエストとレスポンスが確認できました。
    それでは暗号化して実施して見ましょう
    クライアント側で先ほどのコマンドのオプションを除いて実行します。
    その結果、下記のパケットが確認できます。

    暗号化されているので実際にどのような内容かはパケットからでは判断できませんので、
    通信フローから実施したコマンドのパケットと判断しています。

    SSLを使用したレプリケーションに関して

    上記の手順で作成したMySQLサーバーでは下記のようにCHANGE MASTER TOステートメントで「MASTER_SSL=1」を設定すると、SSLを有効化出来ました。

    まとめ

    以上で簡単にSSL/TLSの概要でした。
    たとえプライベートなネットワークの中でも、何が起こるかわかりませんので出来る限りセキュリティを高めていく意識が大切ですね。


     

     

    スマートスタイルTECHブログについて

    スマートスタイルTECHブログでは、日頃MySQLのサポート業務に従事している有資格者で構成された技術サポートチームがMySQLに関する技術情報を発信しています。データベースのお困りごとはお気軽にご相談下さい。

    よかったらシェアしてね!
    • URLをコピーしました!
    目次