课程名称:3.8.2 TLS and TDE(TLS 和 TDE)
学习时长:30min
课程收获:
TiDB 的数据加密功能及其使用,包括传输层加密(TLS)和静态数据加密(TDE)。通过这两个功能使用者可以防范数据泄漏,满足安全和合规性的要求。
课程内容:
数据风险:
a.中间人攻击,假装自己是TiDB服务器从而获取数据。
b.数据中心机房拆走硬盘
TLS(传输层加密)
安全传输层协议TLS(Transport Layer Security)用于在两个通信应用程序之间提供保密性和数据完整性。
- 完善客户端与服务端,组件与组件之间的加密通信,确保连接安全性,保护接收与发送的任何数据不会被网络犯罪分子读取和修改。主要支持基于证书的登录认证、在线更新证书、校验 TLS 证书的
CommonName
属性等功能。详情参阅:开启加密传输。 - 透明数据加密 (Transparent Data Encryption),简称 TDE,是 TiDB 推出的一个新特性,用来对整个数据库提供保护。数据库开启 TDE 加密功能后,对于连接到数据库的应用程序来说是完全透明的,它不需要对现有应用程序做任何改变。因为 TDE 的加密特性是基本于文件级别的,系统会在将数据写到磁盘之前加密,在读取到内存之前解密,确保数据的安全性。目前主要支持 AES128-CTR、AES192-CTR、AES256-CTR 三种加密算法,支持通过 AWS KMS 管理密钥等功能。详情参阅静态加密。
为 TiDB 客户端服务端间通信开启加密传输
TiDB 服务端与客户端之间默认采用非加密连接,因而具备监视信道流量能力的第三方可以知悉 TiDB 服务端与客户端之间发送和接受的数据,包括但不限于查询语句内容、查询结果等。若信道是不可信的,例如客户端是通过公网连接到 TiDB 服务端的,则非加密连接容易造成信息泄露,建议使用加密连接确保安全性。
TiDB 服务端支持启用基于 TLS(传输层安全)协议的加密连接,协议与 MySQL 加密连接一致,现有 MySQL 客户端如 MySQL 运维工具和 MySQL 驱动等能直接支持。TLS 的前身是 SSL,因而 TLS 有时也被称为 SSL,但由于 SSL 协议有已知安全漏洞,TiDB 实际上并未支持。TiDB 支持的 TLS/SSL 协议版本为 TLS 1.0、TLS 1.1、TLS 1.2、TLS 1.3。
使用加密连接后,连接将具有以下安全性质:
- 保密性:流量明文无法被窃听;
- 完整性:流量明文无法被篡改;
- 身份验证(可选):客户端和服务端能验证双方身份,避免中间人攻击。
TiDB 的加密连接支持默认是关闭的,必须在 TiDB 服务端通过配置开启加密连接的支持后,才能在客户端中使用加密连接,要使用加密连接必须同时满足以下两个条件:
- TiDB 服务端配置开启加密连接的支持
- 客户端指定使用加密连接
另外,与 MySQL 一致,TiDB 加密连接是以单个连接为单位的,默认情况下是可选的。因而对于开启了加密连接支持的 TiDB 服务端,客户端既可以选择通过加密连接安全地连接到该 TiDB 服务端,也可以选择使用普通的非加密连接。如需强制要求客户端使用加密连接可以通过以下两种方式进行配置:
- 通过在启动参数中配置
--require-secure-transport
要求所有用户必须使用加密连接来连接到 TiDB。 - 通过在创建用户 (
create user
),赋予权限 (grant
) 或修改已有用户 (alter user
) 时指定require ssl
要求指定用户必须使用加密连接来连接 TiDB。以创建用户为例:
create user 'u1'@'%' require ssl;
认证TiDB服务器
TiDB客户端认证
TiDB客户端 & TiDB服务器双向认证
为 TiDB 组件间通信开启加密传输
本部分介绍如何为 TiDB 集群内各部组件间开启加密传输,一旦开启以下组件间均将使用加密传输:
- TiDB 与 TiKV、PD
- TiKV 与 PD
- TiDB Control 与 TiDB,TiKV Control 与 TiKV,PD Control 与 PD
- TiKV、PD、TiDB 各自集群内内部通讯
目前暂不支持只开启其中部分组件的加密传输。
配置开启加密传输
- 准备证书。推荐为 TiDB、TiKV、PD 分别准备一个 Server 证书,并保证可以相互验证,而它们的 Control 工具则可选择共用 Client 证书。有多种工具可以生成自签名证书,如
openssl
,easy-rsa
,cfssl
。这里提供一个使用openssl
生成证书的示例:生成自签名证书。 - 配置证书。
- TiDB在
config
文件或命令行参数中设置:
[security]
# Path of file that contains list of trusted SSL CAs for connection with cluster components.
cluster-ssl-ca = "/path/to/ca.pem"
# Path of file that contains X509 certificate in PEM format for connection with cluster components.
cluster-ssl-cert = "/path/to/tidb-server.pem"
# Path of file that contains X509 key in PEM format for connection with cluster components.
cluster-ssl-key = "/path/to/tidb-server-key.pem"
- TiKV在
config
文件或命令行参数中设置,并设置相应的 URL 为 https:
[security]
# set the path for certificates. Empty string means disabling secure connectoins.
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]
# Path of file that contains list of trusted SSL CAs. if set, following four settings shouldn't be empty
cacert-path = "/path/to/ca.pem"
# Path of file that contains X509 certificate in PEM format.
cert-path = "/path/to/pd-server.pem"
# Path of file that contains X509 key in PEM format.
key-path = "/path/to/pd-server-key.pem"
- TiFlash(从 v4.0.5 版本开始引入)在
tiflash.toml
文件中设置,将http_port
项改为https_port
:
[security]
# Path of file that contains list of trusted SSL CAs. if set, following four settings shouldn't be empty
ca_path = "/path/to/ca.pem"
# Path of file that contains X509 certificate in PEM format.
cert_path = "/path/to/tiflash-server.pem"
# Path of file that contains X509 key in PEM format.
key_path = "/path/to/tiflash-server-key.pem"
在 tiflash-learner.toml
文件中设置,
[security]
# Sets the path for certificates. The empty string means that secure connections are disabled.
ca-path = "/path/to/ca.pem"
cert-path = "/path/to/tiflash-server.pem"
key-path = "/path/to/tiflash-server-key.pem"
- TiCDC在启动命令行中设置,并设置相应的 URL 为?
https
:
cdc server --pd=https://127.0.0.1:2379 --log-file=ticdc.log --addr=0.0.0.0:8301 --advertise-addr=127.0.0.1:8301 --ca=/path/to/ca.pem --cert=/path/to/ticdc-cert.pem --key=/path/to/ticdc-key.pem
此时 TiDB 集群各个组件间已开启加密传输。
注意:
若 TiDB 集群各个组件间开启加密传输后,在使用 tidb-ctl、tikv-ctl 或 pd-ctl 工具连接集群时,需要指定 client 证书,示例:
./tidb-ctl -u https://127.0.0.1:10080 --ca /path/to/ca.pem --ssl-cert /path/to/client.pem --ssl-key /path/to/client-key.pem
./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"
认证组件调用者身份
通常被调用者除了校验调用者提供的密钥、证书和 CA 有效性外,还需要校验调用方身份以防止拥有有效证书的非法访问者进行访问(例如:TiKV 只能被 TiDB 访问,需阻止拥有合法证书但非 TiDB 的其他访问者访问 TiKV)。
如希望进行组件调用者身份认证,需要在生证书时通过? Common Name
?标识证书使用者身份,并在被调用者配置检查证书? Common Name
?列表来检查调用者身份。
- TiDB在?
config
?文件或命令行参数中设置:
[security]
cluster-verify-cn = [
"TiDB-Server",
"TiKV-Control",
]
- TiKV在?
config
?文件或命令行参数中设置:
[security]
cert-allowed-cn = [
"TiDB-Server", "PD-Server", "TiKV-Control", "RawKvClient1",
]
- PD在?
config
?文件或命令行参数中设置:
[security]
cert-allowed-cn = ["TiKV-Server", "TiDB-Server", "PD-Control"]
- TiCDC在启动命令行中设置:
cdc server --pd=https://127.0.0.1:2379 --log-file=ticdc.log --addr=0.0.0.0:8301 --advertise-addr=127.0.0.1:8301 --ca=/path/to/ca.pem --cert=/path/to/ticdc-cert.pem --key=/path/to/ticdc-key.pem --cert-allowed-cn="client1,client2"
- TiFlash(从 v4.0.5 版本开始引入)在?
tiflash.toml
?文件中设置:
[security]
cert_allowed_cn = ["TiKV-Server", "TiDB-Server"]
在? tiflash-learner.toml
?文件中设置:
[security]
cert-allowed-cn = ["PD-Server", "TiKV-Server", "TiFlash-Server"]
证书重加载
TiDB、PD 和 TiKV 和各种 Client 都会在每次新建相互通讯的连接时重新读取当前的证书和密钥文件内容,实现证书和密钥的重加载。目前暂不支持 CA 的重加载。
CN
磁盘数据保密(静态加密Encryption At Rest)
静态加密 (encryption at rest) 即在存储数据时进行数据加密。对于数据库,静态加密功能也叫透明数据加密 (TDE),区别于传输数据加密 (TLS) 或使用数据加密(很少使用)。SSD 驱动器、文件系统、云供应商等都可进行静态加密。但区别于这些加密方式,若 TiKV 在存储数据前就进行数据加密,攻击者则必须通过数据库的身份验证才能访问数据。例如,即使攻击者获得物理机的访问权限时,也无法通过复制磁盘上的文件来访问数据。
TiKV 从 v4.0.0 起支持静态加密,即在?CTR?模式下使用?AES?对数据文件进行透明加密。要启用静态加密,用户须提供一个加密密钥,即主密钥。可以通过 AWS Key Management Service(推荐),即 KMS,提供主密钥 (master key),也可以指定将密钥以明文形式存储在文件中。TiKV 自动轮换 (rotate) 用于加密实际数据文件的密钥,主密钥则可以由用户手动轮换。请注意,静态加密仅加密静态数据(即磁盘上的数据),而不加密网络传输中的数据。建议 TLS 与静态加密一起使用。
同样,从 v4.0.0 起,Backup & Restore (BR) 支持对备份到 S3 的数据进行 S3 服务端加密 (SSE)。BR S3 服务端加密也支持使用用户自行创建的 AWS KMS 密钥进行加密。
功能概述
TiKV 当前支持的加密算法包括 AES128-CTR、AES192-CTR 和 AES256-CTR。TiKV 使用信封加密 (envelop encryption),所以启用加密后,TiKV 使用以下两种类型的密钥:
- 主密钥 (master key):主密钥由用户提供,用于加密 TiKV 生成的数据密钥。用户在 TiKV 外部进行主密钥的管理。
- 数据密钥 (data key):数据密钥由 TiKV 生成,是实际用于加密的密钥。TiKV 会自动轮换数据密钥。
多个 TiKV 实例可共用一个主密钥。在生产环境中,推荐通过 AWS KMS 提供主密钥。
配置加密
要启用加密,你可以在 TiKV 的配置文件中添加加密部分:
[security.encryption]
data-encryption-method = aes128-ctr
data-key-rotation-period = 7d
轮换主密钥
要轮换主密钥,你必须在配置中同时指定新的主密钥和旧的主密钥,然后重启 TiKV。用 security.encryption.master-key
指定新的主密钥,用 security.encryption.previous-master-key
指定旧的主密钥。 security.encryption.previous-master-key
配置的格式与 encryption.master-key
相同。重启时,TiKV 必须能同时访问旧主密钥和新主密钥,但一旦 TiKV 启动并运行,就只需访问新密钥。此后,可以将 encryption.previous-master-key
项保留在配置文件中。即使重启时,TiKV 也只会在无法使用新的主密钥解密现有数据时尝试使用旧密钥。
TiKV 当前不支持在线轮换主密钥,因此你需要重启 TiKV 进行主密钥轮换。建议对运行中的、提供在线查询的 TiKV 集群进行滚动重启。
轮换 KMS CMK 的配置示例如下:
[security.encryption.master-key]
type = "kms"
key-id = "50a0c603-1c6f-11e6-bb9e-3fadde80ce75"
region = "us-west-2"
[security.encryption.previous-master-key]
type = "kms"
key-id = "0987dcba-09fe-87dc-65ba-ab0987654321"
region = "us-west-2"
注意事项及使用限制
当前版本 (v4.0.0) 的 TiKV 加密功能还有待改善,需要在启用加密前注意以下事项:
- TiDB 集群部署后,大部分用户数据都存储在 TiKV 节点上。这部分数据可使用加密功能进行加密。但有少量元数据存储在 PD 节点上(例如用作 TiKV Region 边界的二级索引键)。截至 v4.0.0,PD 尚未支持静态加密功能。建议使用存储级加密(例如文件系统加密)来保护存储在 PD 中的敏感数据。
- TiFlash 从 v4.0.5 开始支持静态加密功能,详情参阅 TiFlash 静态加密。TiKV 与 v4.0.5 之前版本的 TiFlash 一起部署时,存储在 TiFlash 中的数据不会被加密。
- TiKV 当前不从核心转储 (core dumps) 中排除加密密钥和用户数据。建议在使用静态加密时禁用 TiKV 进程的核心转储。
- TiKV 使用文件的绝对路径跟踪已加密的数据文件。一旦 TiKV 节点开启了加密功能,用户就不应更改数据文件的路径配置,例如
storage.data-dir
、raftstore.raftdb-path
、rocksdb.wal-dir
和raftdb.wal-dir
。 - TiKV 信息日志包含用于调试的用户数据。信息日志不会被加密。