1
1
0
0
专栏/.../

TiDB 集群组件间开启 TLS(双向认证

 aleibest2020  发表于  2024-10-30

7.1开启Tls 配置

本部分介绍 TiDB 集群如何开启 TLS 验证,TLS 验证支持:

  • TiDB 组件之间的双向验证,包括 TiDB、TiKV、PD 相互之间,TiKV Control 与 TiKV、PD Control 与 PD 的双向认证,以及 TiKV peer 之间、PD peer 之间。一旦开启,所有组件之间均使用验证,不支持只开启某一部分的验证。
  • MySQL Client 与 TiDB 之间的客户端对服务器身份的单向验证以及双向验证。

MySQL Client 与 TiDB 之间使用一套证书,TiDB 集群组件之间使用另外一套证书。

TiDB 集群组件间开启 TLS(双向认证)

  1. 准备证书。
  2. 推荐为 TiDB、TiKV、PD 分别准备一个 server 证书,并保证可以相互验证,而它们的各种客户端共用 client 证书。
  3. 有多种工具可以生成自签名证书,如 openssleasy-rsacfssl
  4. 这里提供一个使用 cfssl 生成证书的示例:

假设实例集群拓扑如下:

Name Host IP Services
node1 172.16.10.1 PD1, TiDB1
node2 172.16.10.2 PD2, TiDB2
node3 172.16.10.3 PD3
node4 172.16.10.4 TiKV1
node5 172.16.10.5 TiKV2
node6 172.16.10.6 TiKV3

下载 cfssl

假设使用 x86_64 Linux 主机:

mkdir ~/bin
curl -s -L -o ~/bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
curl -s -L -o ~/bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
chmod +x ~/bin/{cfssl,cfssljson}
export PATH=$PATH:~/bin

初始化证书颁发机构

生成 cfssl 的默认配置,以便于之后修改:

mkdir ~/cfssl
cd ~/cfssl
cfssl print-defaults config > ca-config.json
cfssl print-defaults csr > ca-csr.json

生成证书

证书介绍

  • tidb-server certificate 由 TiDB 使用,为其他组件和客户端验证 TiDB 身份。
  • tikv-server certificate 由 TiKV 使用,为其他组件和客户端验证 TiKV 身份。
  • pd-server certificate 由 PD 使用,为其他组件和客户端验证 PD 身份。
  • client certificate 用于通过 PD、TiKV、TiDB 验证客户端。例如 pd-ctltikv-ctlpd-recover

配置 CA 选项

根据实际需求修改 ca-config.json

{"signing": {"default": {"expiry": "43800h"},"profiles": {"server": {"expiry": "43800h","usages": ["signing","key encipherment","server auth","client auth"]},"client": {"expiry": "43800h","usages": ["signing","key encipherment","client auth"]}}}}

根据实际需求修改 ca-csr.json

{"CN": "My own CA","key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","L": "Beijing","O": "PingCAP","ST": "Beijing"}]}

生成 CA 证书

cfssl gencert -initca ca-csr.json | cfssljson -bare ca -

将会生成以下几个文件:

ca-key.pem
ca.csr
ca.pem

生成服务器端证书

hostname 中为各组件的 IP 地址,以及 127.0.0.1

  • echo '{"CN":"tidb-server","hosts":[""],"key":{"algo":"rsa","size":2048}}' | cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server -hostname="172.16.10.1,172.16.10.2,127.0.0.1"| cfssljson -bare tidb-server echo '{"CN":"tikv-server","hosts":[""],"key":{"algo":"rsa","size":2048}}' | cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server -hostname="172.16.10.4,172.16.10.5,172.16.10.6,127.0.0.1"| cfssljson -bare tikv-server echo '{"CN":"pd-server","hosts":[""],"key":{"algo":"rsa","size":2048}}' | cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server -hostname="172.16.10.1,172.16.10.2,172.16.10.3,127.0.0.1"| cfssljson -bare pd-server

将会生成以下几个文件:

tidb-server-key.pem     tikv-server-key.pem      pd-server-key.pem
tidb-server.csr         tikv-server.csr          pd-server.csr
tidb-server.pem         tikv-server.pem          pd-server.pem

生成客户端证书

  • echo '{"CN":"client","hosts":[""],"key":{"algo":"rsa","size":2048}}' | cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client -hostname=""| cfssljson -bare client

将会生成以下几个文件:

client-key.pem
client.csr
client.pem
  1. 配置证书。

    TiDB

    config 文件或命令行参数中设置:

    https://docs.pingcap.com/zh/search?type=tidb&version=v8.1&q=ca-path

    
    [security]
    cluster-ssl-ca = "path/to/ca-cert.pem"
    cluster-ssl-cert = "/path/to/tidb-server.pem.pem"
    cluster-ssl-key = "/path/to/tidb-server-key.pem"
    
    

    TiKV

    config 文件或命令行参数中设置,并设置相应的 URL 为 https:

    [security]
    ca-path = "/path/to/ca.pem"
    cert-path = "/path/to/tikv-server.pem"
    key-path = "/path/to/tikv-server-key.pem"
    

    PD

    config 文件或命令行参数中设置,并设置相应的 URL 为 https:

    [security] 
    ca-path= "/path/to/ca.pem"
    cert-path = "/path/to/pd-server.pem"
    key-path = "/path/to/pd-server-key.pem"
    
  2. 此时 TiDB 集群各个组件间已开启双向验证。

注意

若 TiDB 集群各个组件间已开启 TLS,在使用 tikv-ctl 或 pd-ctl 工具连接集群时,需要指定 client 证书,示例:

./pd-ctl -u https://127.0.0.1:2379 --cacert /path/to/ca.pem --cert /path/to/client.pem --key /path/to/client-key.pem
./tikv-ctl --host="127.0.0.1:20160" --ca-path="/path/to/ca.pem" --cert-path="/path/to/client.pem" --key-path="/path/to/clinet-key.pem"

MySQL 与 TiDB 间开启 TLS

请参考 使用加密连接

在启动 TiDB 时,至少需要在配置文件中同时指定 ssl-cert 和 ssl-key 参数,才能使 TiDB 服务端接受加密连接。还可以指定 ssl-ca 参数进行客户端身份验证(请参见配置启用身份验证章节)。

  • ssl-cert:指定 SSL 证书文件路径
  • ssl-key:指定证书文件对应的私钥
  • ssl-ca:可选,指定受信任的 CA 证书文件路径

参数指定的文件都为 PEM 格式。另外目前 TiDB 尚不支持加载有密码保护的私钥,因此必须提供一个没有密码的私钥文件。若提供的证书或私钥无效,则 TiDB 服务端将照常启动,但并不支持客户端加密连接到 TiDB 服务端。

上述证书及密钥可以使用 OpenSSL 签发和生成,也可以使用 MySQL 自带的工具 mysql_ssl_rsa_setup 快捷生成:

mysql_ssl_rsa_setup --datadir=./certs

以上命令将在 certs 目录下生成以下文件:

1. certs
2. ├── ca-key.pem
3. ├── ca.pem
4. ├── client-cert.pem
5. ├── client-key.pem
6. ├── private_key.pem
7. ├── public_key.pem
8. ├── server-cert.pem
9. └── server-key.pem

1
1
0
0

声明:本文转载于 https://zhuanlan.zhihu

评论
暂无评论