TiDB Cloud専用へのTLS接続
TiDB Cloudでは、TLS 接続を確立することが、 TiDB Cloud Dedicated クラスターに接続するための基本的なセキュリティ プラクティスの 1 つです。クライアント、アプリケーション、開発ツールからTiDB Cloud Dedicated クラスターへの複数の TLS 接続を構成して、データ転送のセキュリティを保護できます。セキュリティ上の理由から、 TiDB Cloud Dedicated は TLS 1.2 と TLS 1.3 のみをサポートし、TLS 1.0 と TLS 1.1 バージョンはサポートしていません。
データのセキュリティを確保するため、 TiDB Cloud Dedicated クラスターの TiDB クラスター CA はAWS 証明書マネージャー (ACM)でホストされ、TiDB クラスターの秘密キーはFIPS 140-2 レベル 3セキュリティ標準を満たす AWS 管理のハードウェアセキュリティモジュール (HSM) に保存されます。
前提条件
パスワード認証またはSSO認証 、次にTiDB Cloud専用クラスターを作成するでTiDB Cloudにログインします。
安全な設定でクラスターにアクセスするためのパスワードを設定します。
これを行うには、プロジェクトのクラスターページに移動し、 TiDB Cloud Dedicated クラスターの行で[...]をクリックして、 [パスワード設定]を選択します。パスワード設定で、[**パスワードの自動生成]**をクリックすると、数字、大文字と小文字、特殊文字を含む 16 文字の長さのルート パスワードが自動的に生成されます。
TiDB Cloud Dedicated クラスタへのセキュリティ接続
TiDB Cloudコンソールでは、さまざまな接続方法の例を取得し、次のようにTiDB Cloud Dedicated クラスターに接続できます。
プロジェクトのクラスターページに移動し、 TiDB Cloud Dedicated クラスターの名前をクリックして概要ページに移動します。
右上隅の「接続」をクリックします。ダイアログが表示されます。
接続ダイアログで、 「接続タイプ」ドロップダウンリストから「パブリック」を選択します。
IP アクセス リストを設定していない場合は、最初の接続の前に[IP アクセス リストの設定]をクリックして設定してください。詳細については、 IPアクセスリストを設定する参照してください。
CA 証明書をクリックして、TiDB クラスターへの TLS 接続用の CA 証明書をダウンロードします。CA 証明書は、デフォルトで TLS 1.2 バージョンをサポートします。
注記:
- ダウンロードした CA 証明書は、オペレーティング システムのデフォルトのstorageパスに保存することも、別のstorageパスを指定することもできます。後続の手順では、コード例の CA 証明書パスを独自の CA 証明書パスに置き換える必要があります。
- TiDB Cloud Dedicated では、クライアントに TLS 接続の使用を強制しません。また、
require_secure_transport
変数のユーザー定義構成は現在、 TiDB Cloud Dedicated ではサポートされていません。
希望する接続方法を選択し、タブの接続文字列とサンプル コードを参照してクラスターに接続します。
次の例は、MySQL、MyCLI、JDBC、Python、Go、Node.js の接続文字列を示しています。
- MySQL CLI
- MyCLI
- JDBC
- Python
- Go
- Node.js
MySQL CLI クライアントは、デフォルトで TLS 接続を確立しようとします。TiDB TiDB Cloud Dedicated クラスターに接続する場合は、 ssl-mode
とssl-ca
設定する必要があります。
mysql --connect-timeout 15 --ssl-mode=VERIFY_IDENTITY --ssl-ca=ca.pem --tls-version="TLSv1.2" -u root -h tidb.eqlfbdgthh8.clusters.staging.tidb-cloud.com -P 4000 -D test -p
パラメータの説明:
--ssl-mode=VERIFY_IDENTITY
では、MySQL CLI クライアントは TLS を有効にし、 TiDB Cloud Dedicated クラスターを検証することを強制します。--ssl-ca=<CA_path>
使用して、ダウンロードした TiDB クラスターca.pem
のローカル パスを指定します。- TLS プロトコルのバージョンを制限するには
--tls-version=TLSv1.2
使用します。TLS 1.3 を使用する場合は、バージョンをTLSv1.3
に設定できます。
マイクリ 、 TLS 関連のパラメータを使用するときに TLS を自動的に有効にします。TiDB TiDB Cloud Dedicated クラスターに接続する場合は、 ssl-ca
とssl-verify-server-cert
設定する必要があります。
mycli --ssl-ca=ca.pem --ssl-verify-server-cert -u root -h tidb.eqlfbdgthh8.clusters.staging.tidb-cloud.com -P 4000 -D test
パラメータの説明:
--ssl-ca=<CA_path>
使用して、ダウンロードした TiDB クラスターca.pem
のローカル パスを指定します。--ssl-verify-server-cert
でTiDB Cloud Dedicated クラスターを検証します。
ここでは例としてMySQL コネクタ/Jの TLS 接続構成を使用します。
TiDB クラスター CA をダウンロードした後、それをオペレーティング システムにインポートする場合は、 keytool -importcert -alias TiDBCACert -file ca.pem -keystore <your_custom_truststore_path> -storepass <your_truststore_password>
コマンドを使用できます。
/* Be sure to replace the parameters in the following connection string. */
/* version >= 8.0.28 */
jdbc:mysql://tidb.srgnqxji5bc.clusters.staging.tidb-cloud.com:4000/test?user=root&password=<your_password>&sslMode=VERIFY_IDENTITY&tlsVersions=TLSv1.2&trustCertificateKeyStoreUrl=file:<your_custom_truststore_path>&trustCertificateKeyStorePassword=<your_truststore_password>
詳細なコード例を表示するには、 「使用例を表示」をクリックします。
import com.mysql.jdbc.Driver;
import java.sql.*;
class Main {
public static void main(String args[]) throws SQLException, ClassNotFoundException {
Class.forName("com.mysql.cj.jdbc.Driver");
try {
Connection conn = DriverManager.getConnection("jdbc:mysql://tidb.srgnqxji5bc.clusters.staging.tidb-cloud.com:4000/test?user=root&password=<your_password>&sslMode=VERIFY_IDENTITY&tlsVersions=TLSv1.2&trustCertificateKeyStoreUrl=file:<your_custom_truststore_path>&trustCertificateKeyStorePassword=<your_truststore_password>");
Statement stmt = conn.createStatement();
try {
ResultSet rs = stmt.executeQuery("SELECT DATABASE();");
if (rs.next()) {
System.out.println("using db:" + rs.getString(1));
}
} catch (Exception e) {
System.out.println("exec error:" + e);
}
} catch (Exception e) {
System.out.println("connect error:" + e);
}
}
}
パラメータの説明:
- TLS を有効にしてTiDB Cloud Dedicated クラスターを検証するには、
sslMode=VERIFY_IDENTITY
設定します。 - TLS プロトコルのバージョンを制限するには
enabledTLSProtocols=TLSv1.2
設定します。TLS 1.3 を使用する場合は、バージョンをTLSv1.3
に設定できます。 - カスタム トラストストア パスに
trustCertificateKeyStoreUrl
設定します。 - トラストストアのパスワードを
trustCertificateKeyStorePassword
に設定します。
ここでは例としてmysqlクライアントの TLS 接続構成を使用します。
host="tidb.srgnqxji5bc.clusters.staging.tidb-cloud.com", user="root", password="<your_password>", port=4000, database="test", ssl_mode="VERIFY_IDENTITY", ssl={"ca": "ca.pem"}
詳細なコード例を表示するには、 「使用例を表示」をクリックします。
import MySQLdb
connection = MySQLdb.connect(host="tidb.srgnqxji5bc.clusters.staging.tidb-cloud.com", port=4000, user="root", password="<your_password>", database="test", ssl_mode="VERIFY_IDENTITY", ssl={"ca": "ca.pem"})
with connection:
with connection.cursor() as cursor:
cursor.execute("SELECT DATABASE();")
m = cursor.fetchone()
print(m[0])
パラメータの説明:
- TLS を有効にしてTiDB Cloud Dedicated クラスターを検証するには、
ssl_mode="VERIFY_IDENTITY"
設定します。 ssl={"ca": "<CA_path>"}
使用して、ダウンロードした TiDB クラスターca.pem
のローカル パスを指定します。
ここでは例としてGo-MySQL-ドライバーの TLS 接続構成を使用します。
rootCertPool := x509.NewCertPool()
pem, err := ioutil.ReadFile("ca.pem")
if err != nil {
log.Fatal(err)
}
if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
log.Fatal("Failed to append PEM.")
}
mysql.RegisterTLSConfig("tidb", &tls.Config{
RootCAs: rootCertPool,
MinVersion: tls.VersionTLS12,
ServerName: "tidb.srgnqxji5bc.clusters.staging.tidb-cloud.com",
})
db, err := sql.Open("mysql", "root:<your_password>@tcp(tidb.srgnqxji5bc.clusters.staging.tidb-cloud.com:4000)/test?tls=tidb")
詳細なコード例を表示するには、 「使用例を表示」をクリックします。
package main
import (
"crypto/tls"
"crypto/x509"
"database/sql"
"fmt"
"io/ioutil"
"log"
"github.com/go-sql-driver/mysql"
)
func main() {
rootCertPool := x509.NewCertPool()
pem, err := ioutil.ReadFile("ca.pem")
if err != nil {
log.Fatal(err)
}
if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
log.Fatal("Failed to append PEM.")
}
mysql.RegisterTLSConfig("tidb", &tls.Config{
RootCAs: rootCertPool,
MinVersion: tls.VersionTLS12,
ServerName: "tidb.srgnqxji5bc.clusters.staging.tidb-cloud.com",
})
db, err := sql.Open("mysql", "root:<your_password>@tcp(tidb.srgnqxji5bc.clusters.staging.tidb-cloud.com:4000)/test?tls=tidb")
if err != nil {
log.Fatal("failed to connect database", err)
}
defer db.Close()
var dbName string
err = db.QueryRow("SELECT DATABASE();").Scan(&dbName)
if err != nil {
log.Fatal("failed to execute query", err)
}
fmt.Println(dbName)
}
パラメータの説明:
- TLS を有効にしてTiDB Cloud Dedicated クラスターを検証するには、TLS 接続構成に
tls.Config
登録します。 - TLS プロトコルのバージョンを制限するには
MinVersion: tls.VersionTLS12
設定します。 - TiDB Cloud Dedicated のホスト名を確認するには
ServerName: "<host>"
設定します。 - 新しい TLS 構成を登録したくない場合は、接続文字列に
tls=true
設定するだけです。
ここでは例としてマイSQL2の TLS 接続構成を使用します。
var connection = mysql.createConnection({
host: 'tidb.srgnqxji5bc.clusters.staging.tidb-cloud.com',
port: 4000,
user: 'root',
password: '<your_password>',
database: 'test',
ssl: {
ca: fs.readFileSync('ca.pem'),
minVersion: 'TLSv1.2',
rejectUnauthorized: true
}
});
詳細なコード例を表示するには、 「使用例を表示」をクリックします。
var mysql = require('mysql2');
var fs = require('fs');
var connection = mysql.createConnection({
host: 'tidb.srgnqxji5bc.clusters.staging.tidb-cloud.com',
port: 4000,
user: 'root',
password: '<your_password>',
database: 'test',
ssl: {
ca: fs.readFileSync('ca.pem'),
minVersion: 'TLSv1.2',
rejectUnauthorized: true
}
});
connection.connect(function(err) {
if (err) {
throw err
}
connection.query('SELECT DATABASE();', function(err, rows) {
if (err) {
throw err
}
console.log(rows[0]['DATABASE()']);
connection.end()
});
});
パラメータの説明:
- TLS プロトコルのバージョンを制限するには
ssl: {minVersion: 'TLSv1.2'}
設定します。TLS 1.3 を使用する場合は、バージョンをTLSv1.3
に設定できます。 - ダウンロードした TiDB クラスター
ca.pem
のローカル CA パスを読み取るにはssl: {ca: fs.readFileSync('<CA_path>')}
設定します。
TiDB Cloud Dedicatedのルート証明書を管理する
TiDB Cloud Dedicated は、クライアントとTiDB Cloud Dedicated クラスター間の TLS 接続に、 AWS 証明書マネージャー (ACM)の証明書を認証局 (CA) として使用します。通常、ACM のルート証明書は、 FIPS 140-2 レベル 3セキュリティ標準を満たす AWS 管理のハードウェアセキュリティモジュール (HSM) に安全に保存されます。
よくある質問
TiDB Cloud Dedicated クラスターに接続するためにサポートされている TLS バージョンはどれですか?
セキュリティ上の理由から、 TiDB Cloud Dedicated は TLS 1.2 と TLS 1.3 のみをサポートし、TLS 1.0 と TLS 1.1 バージョンはサポートしていません。詳細については、IETF TLS 1.0 および TLS 1.1 の廃止を参照してください。
クライアントとTiDB Cloud Dedicated 間の双方向 TLS 認証はサポートされていますか?
いいえ。
TiDB Cloud Dedicated は片方向 TLS 認証のみをサポートしており、現在双方向 TLS 認証はサポートしていません。双方向 TLS 認証が必要な場合は、 TiDB Cloudサポートお問い合わせください。