MySQL の SSL 接続の有効化

MySQL サーバの SSL 接続を有効にし、保護された接続を使用して通信するように Gateway を設定します。これは、MySQL がオフボックスで、配置されているネットワークが異なり、セキュリティまたは暗号化の強化が必要な環境である場合に理想的です。
2
サーバ証明書の検証なしの MySQL SSL のセットアップ
この設定では、5.5.45+、5.6.26+、5.7.6+ 以降の MySQL を使用している場合に、以下の警告メッセージが表示されることがあります。
警告:
サーバの識別情報を検証せずに SSL 接続を確立することはお勧めしません。オプションを明示的に設定していない場合には、MySQL 5.5.45+、5.6.26+、5.7.6+ の要件に従って、デフォルトで SSL 接続を確立する必要があります。SSL を使用しない既存のアプリケーションに準拠するには、verifyServerCertificate プロパティを「false」に設定します。useSSL を false に設定して SSL を明示的に無効にするか、useSSL を true に設定してサーバ証明書検証用のトラストストアを提供する必要があります。
1)以下のコマンドを実行して、MySQL で SSL が有効になっていないことを確認します。
mysql> show global variables like '%ssl%'; +---------------+----------+ | Variable_name | Value | +---------------+----------+ | have_openssl | DISABLED | | have_ssl | DISABLED | | ... | ... |
2)以下のコマンドを実行して、認証局(CA)キーを作成します。
mkdir /etc/mysql cd /etc/mysql openssl genrsa 2048 > ca-key.pem openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
3)以下のコマンドを実行して、サーバの SSL キーおよび証明書を作成します。
注:
MySQL で使用する証明書を生成する場合は、RSA キーを従来の PKCS #1 PEM 形式に変換し、証明書で SHA1 ダイジェストが使用されていることを確認してください。
openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem > server-req.pem openssl x509 -sha1 -req -in server-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem openssl rsa -in server-key.pem -out server-key.pem
4)証明書フォルダ、ファイル、および更新権限の所有権を更新します。
chown -R mysql:mysql /etc/mysql
5) MySQL の設定ファイル /etc/my.cnf を更新します。[mysqld]セクションの下に以下を含めます。
[mysqld] ssl-ca = /etc/mysql/ca-cert.pem ssl-cert = /etc/mysql/server-cert.pem ssl-key = /etc/mysql/server-key.pem
6) /etc/my.cnf で以下を検索してコメントアウトします。
[mysqld] #skip_ssl
7)
require_secure_transport
変数を有効にして、クライアントによる暗号化接続を必須にします。
[mysqld] # Require clients to connect either using SSL # or through a local socket file require_secure_transport = ON
8) mysql サービス/サーバを再起動します。
service mysqld restart
9) MySQL にログインし、MySQL に対して ssl がオンになっていることを確認します。
mysql -u root -p --ssl-mode=required
mysql> show global variables like '%ssl%'; +---------------+----------------------------+ | Variable_name | Value | +---------------+----------------------------+ | have_openssl | YES | | have_ssl | YES | | ssl_ca | /etc/mysql/ca-cert.pem | | ssl_capath | | | ssl_cert | /etc/mysql/server-cert.pem | | ssl_cipher | | | ssl_crl | | | ssl_crlpath | | | ssl_key | /etc/mysql/server-key.pem | +---------------+----------------------------+
10)さらにステータスを確認します。
mysql> status -------------- mysql Ver 8.0.18-commercial for Linux on x86_64 (MySQL Enterprise Server - Commercial) Connection id: 201 Current database: Current user: [email protected] SSL: Cipher in use is DHE-RSA-AES128-GCM-SHA256 Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 8.0.18-commercial MySQL Enterprise Server - Commercial Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8 Db characterset: utf8 Client characterset: utf8mb4 Conn. characterset: utf8mb4 UNIX socket: /var/lib/mysql/mysql.sock Uptime: 13 min 18 sec
SSL が有効になっていない場合は、証明書のロードで MySQL に問題がなかったか、
/var/log/mysqld.log
を調べてください。
11) SSL を必要とするように Gateway データベース ユーザを更新します。
以下のコマンドを実行すると、Gateway の設定内容に関係なく、すべての接続で SSL が強制的に使用されるようになります。これは、ここでの設定内容(Gateway db ユーザに対して SSL が有効か無効か)と一致する必要があります。
mysql> UPDATE mysql.user SET ssl_type = 'ANY' WHERE user = 'gateway'; mysql> FLUSH PRIVILEGES;
12)以下を確認します。
SELECT user,ssl_type from mysql.user; mysql> SELECT user,ssl_type from mysql.user; +---------------+----------+ | user | ssl_type | +---------------+----------+ | root | | | mysql.session | | | mysql.sys | | | gateway | ANY |
13)以下のコマンドを実行して、MySQL が SSL 接続のみを受け入れることを確認します。MySQL クライアントが MySQL サーバに接続していないことを確認します。
mysql -u gateway -p --ssl-mode=DISABLED
14) Gateway の node.properties に以下を追加します。これにより、Hibernate 接続で SSL を使用できるようになります。
l7.mysql.url.parameters.extra = &useSSL=true&requireSSL=true&verifyServerCertificate=false
セットアップを実行すると、SSG ログに警告が出力される場合があります。
Thu Aug 29 10:47:22 PDT 2019 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. Thu Aug 29 10:47:22 PDT 2019 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. Thu Aug 29 10:47:22 PDT 2019 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
次のセクションを参照してサーバ証明書の検証を有効にしてください。有効にすると、上記の警告メッセージは表示されなくなります。
サーバ証明書の検証ありの MySQL SSL のセットアップ
信頼できる CA によって署名された証明書:
サーバ認証用に作成された証明書に関して追加の設定は必要ありません。Java がデフォルトの信頼できる CA 証明書(通常は $JAVA_HOME/lib/security/cacerts にあります)を使用してサーバ証明書を検証します。
自己署名証明書の使用:
サーバ証明書を確認するには、クライアントが署名入りの証明書(自己署名のサーバ証明書または自己署名 CA 証明書)を読み取る必要があります。
1)カスタム Java トラストストア ファイルに証明書をインポートし、それに応じてクライアント ドライバを設定するには、以下の手順に従います。
2) ca-cert.pem が含まれているノードから、トラストストアを作成して CA 証明書(MySQL サーバ証明書への自己署名に使用した前の手順のもの)をインポートします。
/opt/SecureSpan/JDK/bin/keytool -importcert -alias MySQLCACert -file ca-cert.pem -keystore truststore.jks -storepass <mypassword>
3)以下のコマンドを実行して、CA 証明書がトラストストア内にあることを確認します。
/opt/SecureSpan/JDK/bin/keytool -list -v -keystore truststore.jks
4) MySQL/etc/mysqlclient に接続するすべてのノードに truststore.jks をコピーします。
5) JKS ファイルの権限を変更します。
chmod 444 /etc/mysqlclient/truststore.jks
6)以下の行を
node.properties
ファイルに追加します。
l7.mysql.url.parameters.extra =&useSSL=
true
&requireSSL=
true
&verifyServerCertificate=
true
&clientCertificateKeyStoreUrl=file:/etc/mysqlclient/truststore.jks&clientCertificateKeyStorePassword=<mypassword>&clientCertificateKeyStoreType=JKS&trustCertificateKeyStoreUrl=file:/etc/mysqlclient/truststore.jks&trustCertificateKeyStoreType=JKS&trustCertificateKeyStorePassword=<mypassword>
サーバ証明書が検証され、警告メッセージが表示されなくなります。
暗号化接続を使用するためのレプリケーションのセットアップ
クラスタ データベースのレプリケーションの設定」で説明している手順を完了しておいてください。
レプリケーション時に必要なバイナリ ログの転送に暗号化接続を使用できるようにするには、マスタ サーバとスレーブ サーバの両方が暗号化ネットワーク接続をサポートしている必要があります。どちらかのサーバで暗号化接続がサポートされていない場合、暗号化接続を介してレプリケーションを行うことはできません。
レプリケーション用に暗号化接続を設定する手順は、クライアント/サーバ接続のために行ったプロセスとほぼ同じです。マスタで使用できる適切なセキュリティ証明書を作成または取得するか、各スレーブ上の同じ認証局から類似した証明書を適切なキー ファイルと共に作成または取得します。
Gateway はマスタ/マスタ レプリケーションを使用するため、両方の MySQL ノードで以下の手順に従います。
1)以下のコマンドを実行して、クライアントの SSL キーと証明書を作成します。
openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout client-key.pem > client-req.pem openssl x509 -sha1 -req -in client-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem openssl rsa -in client-key.pem -out client-key.pem
2)[client]セクションの下にクライアント証明書を含めるように、MySQL の設定ファイル /etc/my.cnf を更新します。
[client] ssl-ca = /etc/mysql/ca-cert.pem ssl-cert = /etc/mysql/client-cert.pem ssl-key = /etc/mysql/client-key.pem
3) mysql サービス/サーバを再起動します。
service mysqld restart
4) SSL を必要とするように Gateway レプリケーション ユーザを更新します。
以下のコマンドを実行すると、レプリケーションの設定内容に関係なく、すべての接続で SSL が強制的に使用されるようになります。これは、ここでの設定内容(レプリケーション ユーザに対して SSL が有効か無効か)と一致する必要があります。
mysql> UPDATE mysql.user SET ssl_type = 'ANY' WHERE user = 'repluser'; mysql> FLUSH PRIVILEGES;
5)以下のコマンドを使用して、スレーブを再起動します。
mysql> STOP SLAVE; mysql> CHANGE MASTER TO MASTER_HOST=<hostname>,MASTER_PORT=<portnumber>,MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_SSL=1; mysql> START SLAVE;
6)以下のコマンドを使用して、ステータスを確認します。
mysql>SHOW SLAVE STATUS \G
7)マスタへの接続エラーが発生した場合は、レプリケーションをやり直します。
TLS v1.2 が必要な MySQL データベースへの接続
セキュリティ要件の一環として、Gateway などのクライアントが接続されている場合にのみ TLS v.1.2 を許可するように、SSL/TLS 対応の特定の MySQL データベースが制限される場合があります。Gateway によって使用されるデータベース ドライバは、接続している外部データベースを想定し、TLS バージョンを TLS v1.1 に制限する場合があります。これは、Gateway に含まれていない MySQL データベース(たとえば、AWS Aurora などのクラウドベースの MySQL データベース)に対して特に発生します。
Gateway クライアントと MySQL データベースの間で受け入れる TLS バージョンが一致しないため、データベース接続に失敗する可能性があります。
Gateway 内には、接続タイプに応じて、TLS バージョンを設定および適用できる 2 つの主要な場所があります: node.properties および Policy Manager の Manage JDBC Connection ツール。
node.properties での TLS v1.2 の適用
node.properties ファイルは、
/opt/SecureSpan/Gateway/node/default/etc/conf/
にあります。
Gateway が起動すると、MySQL データベースへの接続を開始するために、node.properties が部分的に使用されます。すべてのデータベース接続で TLS v1.2 が使用されるようにするには、node.properties ファイルに以下の行を追加します。
l7.mysql.url.parameters.extra=&useSSL=true&verifyServerCertificate=false&enabledTLSProtocols=TLSv1.2
Manage JDBC Connections での TLS v1.2 の適用(Policy Manager)
現在、ポリシーまたは Web サービスが Perform JDBC Query アサーションを使用しており、TLS v1.2 を必要とする MySQL データベースへの接続の試行中に Gateway が TLS v1.2 を提供しない場合は、以下のプロパティおよび値が JDBC URL が追加されていることを確認します。
&enabledTLSProtocols=TLSv1.2
詳細については、「Manage JDBC Connections」を参照してください。