2.4. MySQL サーバーでの TLS 暗号化の設定
デフォルトでは、MySQL は暗号化されていない接続を使用します。安全な接続のために、MySQL サーバーで TLS サポートを有効にし、暗号化された接続を確立するようにクライアントを設定します。
2.4.1. MySQL サーバーに CA 証明書、サーバー証明書、および秘密鍵を配置する リンクのコピーリンクがクリップボードにコピーされました!
MySQL サーバーで TLS 暗号化を有効にする前に、認証局 (CA) 証明書、サーバー証明書、および秘密鍵を MySQL サーバーに保存します。
前提条件
Privacy Enhanced Mail(PEM) 形式の以下のファイルがサーバーにコピーされています。
-
サーバーの秘密鍵:
server.example.com.key.pem -
サーバー証明書:
server.example.com.crt.pem -
認証局 (CA) 証明書:
ca.crt.pem
秘密鍵および証明書署名要求 (CSR) の作成や、CA からの証明書要求に関する詳細は、CA のドキュメントを参照してください。
-
サーバーの秘密鍵:
手順
CA およびサーバー証明書を
/etc/pki/tls/certs/ディレクトリーに保存します。mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/ mv <path>/ca.crt.pem /etc/pki/tls/certs/
# mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/ # mv <path>/ca.crt.pem /etc/pki/tls/certs/Copy to Clipboard Copied! Toggle word wrap Toggle overflow MySQL サーバーがファイルを読み取れるように、CA とサーバー証明書のパーミッションを設定します。
chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
# chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 証明書は、セキュアな接続が確立される前は通信の一部であるため、任意のクライアントは認証なしで証明書を取得できます。そのため、CA およびサーバーの証明書ファイルに厳密なパーミッションを設定する必要はありません。
サーバーの秘密鍵を
/etc/pki/tls/private/ディレクトリーに保存します。mv <path>/server.example.com.key.pem /etc/pki/tls/private/
# mv <path>/server.example.com.key.pem /etc/pki/tls/private/Copy to Clipboard Copied! Toggle word wrap Toggle overflow サーバーの秘密鍵にセキュアなパーミッションを設定します。
chmod 640 /etc/pki/tls/private/server.example.com.key.pem chgrp mysql /etc/pki/tls/private/server.example.com.key.pem
# chmod 640 /etc/pki/tls/private/server.example.com.key.pem # chgrp mysql /etc/pki/tls/private/server.example.com.key.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 承認されていないユーザーが秘密鍵にアクセスできる場合、MySQL サーバーへの接続は安全ではなくなります。
SELinux コンテキストを復元します。
restorecon -Rv /etc/pki/tls/
# restorecon -Rv /etc/pki/tls/Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4.2. MySQL サーバーでの TLS 暗号化の設定 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、MySQL は暗号化されていない接続を使用します。よりセキュアな接続のために、MySQL サーバーで Transport Layer Security (TLS) サポートを有効にし、暗号化された接続を確立するようにクライアントを設定できます。
前提条件
- MySQL サーバーがインストールされている。
-
mysqldサービスが実行されている。 Privacy Enhanced Mail(PEM) 形式の以下のファイルがサーバー上にあり、
mysqlユーザーが読み取りできます。-
サーバーの秘密鍵:
/etc/pki/tls/private/server.example.com.key.pem -
サーバー証明書:
/etc/pki/tls/certs/server.example.com.crt.pem -
認証局 (CA) 証明書
/etc/pki/tls/certs/ca.crt.pem
-
サーバーの秘密鍵:
- サーバー証明書のサブジェクト識別名 (DN) またはサブジェクトの別名 (SAN) フィールドは、サーバーのホスト名と一致します。
手順
/etc/my.cnf.d/mysql-server-tls.cnfファイルを作成します。以下の内容を追加して、秘密鍵、サーバー、および CA 証明書へのパスを設定します。
[mysqld] ssl_key = /etc/pki/tls/private/server.example.com.key.pem ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem ssl_ca = /etc/pki/tls/certs/ca.crt.pem
[mysqld] ssl_key = /etc/pki/tls/private/server.example.com.key.pem ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem ssl_ca = /etc/pki/tls/certs/ca.crt.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow 証明書失効リスト (CRL) がある場合は、それを使用するように MySQL サーバーを設定します。
ssl_crl = /etc/pki/tls/certs/example.crl.pem
ssl_crl = /etc/pki/tls/certs/example.crl.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: 暗号化なしの接続試行を拒否します。この機能を有効にするには、以下を追加します。
require_secure_transport = on
require_secure_transport = onCopy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: サーバーがサポートする必要がある TLS バージョンを設定します。たとえば、TLS 1.3 のみをサポートするには、次を追加します。
tls_version = TLSv1.3
tls_version = TLSv1.3Copy to Clipboard Copied! Toggle word wrap Toggle overflow デフォルトでは、サーバーは TLS 1.2 と TLS 1.3 をサポートします。
mysqldサービスを再起動します。systemctl restart mysqld
# systemctl restart mysqldCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
トラブルシューティングを簡素化するには、ローカルクライアントが TLS 暗号化を使用するように設定する前に、MySQL サーバーで以下の手順を実行します。
MySQL で TLS 暗号化が有効になっていることを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow MySQL サーバーが特定の TLS バージョンのみをサポートするように設定している場合は、
tls_version変数を表示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow サーバーが正しい CA 証明書、サーバー証明書、および秘密鍵ファイルを使用していることを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4.3. MySQL サーバー上の特定のユーザーアカウントに対して TLS 暗号化接続を必須とする リンクのコピーリンクがクリップボードにコピーされました!
機密データの転送を保護するために、特定の MySQL ユーザーアカウントに対して TLS 暗号化接続を必須とするように設定できます。
サーバー側ですべての接続に対してセキュアな転送を必須とするように設定 (require_secure_transport = on) できない場合は、個々のユーザーアカウントに対して TLS 暗号化を必須とするように設定してください。
前提条件
- MySQL サーバーで TLS サポートが有効になっている。
- セキュアなトランスポートを必要とするように設定するユーザーが存在する。
- CA 証明書がクライアントに保存されている。
手順
管理ユーザーとして MySQL サーバーに接続します。
mysql -u root -p -h server.example.com
# mysql -u root -p -h server.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 管理ユーザーがリモートでサーバーにアクセスするパーミッションを持たない場合は、MySQL サーバーでコマンドを実行し、
localhostに接続します。REQUIRE SSL句を使用して、ユーザーが TLS 暗号化接続を使用して接続する必要があるよう強制します。MySQL [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
MySQL [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
TLS 暗号化を使用して、
exampleユーザーとしてサーバーに接続します。mysql -u example -p -h server.example.com
# mysql -u example -p -h server.example.com ... MySQL [(none)]>Copy to Clipboard Copied! Toggle word wrap Toggle overflow エラーが表示されず、インタラクティブな MySQL コンソールにアクセスできる場合は、TLS による接続は成功しています。
デフォルトでは、サーバーが TLS 暗号化を提供している場合、クライアントは自動的にその TLS 暗号化を使用します。したがって、
--ssl-ca=ca.crt.pemおよび--ssl-mode=VERIFY_IDENTITYオプションは必須ではありません。ただし、これらのオプションを使用するとクライアントはサーバーの ID を検証するため、セキュリティーが向上します。TLS を無効にして、
exampleユーザーとして接続を試みます。mysql -u example -p -h server.example.com --ssl-mode=DISABLED
# mysql -u example -p -h server.example.com --ssl-mode=DISABLED ERROR 1045 (28000): Access denied for user 'example'@'server.example.com' (using password: YES)Copy to Clipboard Copied! Toggle word wrap Toggle overflow このユーザーには TLS が必要なのにもかかわらず無効になっているため、サーバーはログインの試行を拒否しました (
--ssl-mode=DISABLED)。