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.pem
Copy 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.pem
Copy 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 サーバーで TLS サポートを有効にします。その結果、クライアントは 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.pem
Copy 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.pem
Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: 暗号化なしの接続試行を拒否します。この機能を有効にするには、以下を追加します。
require_secure_transport = on
require_secure_transport = on
Copy to Clipboard Copied! Toggle word wrap Toggle overflow オプション: サーバーがサポートする必要がある TLS バージョンを設定します。たとえば、TLS 1.3 のみをサポートするには、次を追加します。
tls_version = TLSv1.3
tls_version = TLSv1.3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow デフォルトでは、サーバーは TLS 1.2 と TLS 1.3 をサポートします。
mysqld
サービスを再起動します。systemctl restart mysqld
# systemctl restart mysqld
Copy 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 暗号化接続を要求する リンクのコピーリンクがクリップボードにコピーされました!
機密データにアクセスできるユーザーは、ネットワーク上で暗号化されていないデータ送信を回避するために、常に 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.com
Copy 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
)。