Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

encryption at rest: update docs (#7223) #7282

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 65 additions & 27 deletions encryption-at-rest.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,47 +3,89 @@ title: 静态加密
summary: 了解如何启用静态加密功能保护敏感数据。
---

# 静态加密 <span class="version-mark">从 v4.0.0 版本开始引入</span>
# 静态加密

> **注意:**
>
> 如果集群部署在 AWS 上并在使用 EBS (Elastic Block Store) 存储数据,建议使用 EBS 加密,详细信息请参考 [AWS 文档 - EBS 加密](https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/EBSEncryption.html)。如果集群部署在 AWS 上,但未使用 EBS 存储(例如使用本地 NVMe 存储),则建议使用本文中介绍的静态加密方式。

静态加密 (encryption at rest) 即在存储数据时进行数据加密。对于数据库,静态加密功能也叫透明数据加密 (TDE),区别于传输数据加密 (TLS) 或使用数据加密(很少使用)。SSD 驱动器、文件系统、云供应商等都可进行静态加密。但区别于这些加密方式,若 TiKV 在存储数据前就进行数据加密,攻击者则必须通过数据库的身份验证才能访问数据。例如,即使攻击者获得物理机的访问权限时,也无法通过复制磁盘上的文件来访问数据。

TiKV 从 v4.0.0 起支持静态加密,即在 [CTR](https://zh.wikipedia.org/wiki/%E5%88%86%E7%BB%84%E5%AF%86%E7%A0%81%E5%B7%A5%E4%BD%9C%E6%A8%A1%E5%BC%8F) 模式下使用 [AES](https://zh.wikipedia.org/wiki/%E9%AB%98%E7%BA%A7%E5%8A%A0%E5%AF%86%E6%A0%87%E5%87%86) 对数据文件进行透明加密。要启用静态加密,用户须提供一个加密密钥,即主密钥。可以通过 AWS Key Management Service(推荐),即 KMS,提供主密钥 (master key),也可以指定将密钥以明文形式存储在文件中。TiKV 自动轮换 (rotate) 用于加密实际数据文件的密钥,主密钥则可以由用户手动轮换。请注意,静态加密仅加密静态数据(即磁盘上的数据),而不加密网络传输中的数据。建议 TLS 与静态加密一起使用。
## 各 TiDB 组件支持的加密方式

在一个 TiDB 集群中,不同的组件使用不同的加密方式。本节介绍 TiKV、 TiFlash、PD 和 Backup & Restore (BR) 等不同 TiDB 组件支持的加密方式。

部署好一个 TiDB 集群后,大部分用户数据会存储在 TiKV 和 TiFlash 节点上。此外,一些元数据会存储在 PD 节点上,例如用作为 TiKV Region 边界的二级索引密钥。为了能够充分发挥静态加密的优势,所有组件都需要启用加密功能。此外,进行加密时,也需要对备份、日志文件和通过网络传输的数据进行加密。

### TiKV

TiKV 支持静态加密,即在 [CTR](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation) 模式下使用 [AES](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) 对数据文件进行透明加密。要启用静态加密,用户需提供一个加密密钥,即主密钥。TiKV 自动轮换 (rotate) 用于加密实际数据文件的密钥,主密钥则可以由用户手动轮换。请注意,静态加密仅加密静态数据(即磁盘上的数据),而不加密网络传输中的数据。建议 TLS 与静态加密一起使用。

可以选择将 AWS KMS (Key Management Service) 用于云上部署或本地部署,也可以指定将密钥以明文形式存储在文件中。

TiKV 当前不从核心转储 (core dumps) 中排除加密密钥和用户数据。建议在使用静态加密时禁用 TiKV 进程的核心转储,该功能目前无法由 TiKV 独立处理。

TiKV 使用文件的绝对路径来跟踪已加密的数据文件。一旦 TiKV 节点开启了加密功能,用户就不应更改数据文件的路径配置,例如 `storage.data-dir`,`raftstore.raftdb-path`,`rocksdb.wal-dir` 和 `raftdb.wal-dir`。

### TiFlash

TiFlash 支持静态加密。数据密钥由 TiFlash 生成。TiFlash(包括 TiFlash Proxy)写入的所有文件,包括数据文件、Schema 文件、临时文件等,均由当前数据密钥加密。TiFlash 支持的加密算法、加密配置方法(配置项在 `tiflash-learner.toml` 中)和监控项含义等均与 TiKV 一致。

如果 TiFlash 中部署了 Grafana 组件,可以查看 **TiFlash-Proxy-Details** -> **Encryption**。

### PD

PD 的静态加密为实验特性,其配置方式与 TiKV 相同。

同样,从 v4.0.0 起,Backup & Restore (BR) 支持对备份到 S3 的数据进行 S3 服务端加密 (SSE)。BR S3 服务端加密也支持使用用户自行创建的 AWS KMS 密钥进行加密。
### BR 备份

## 注意事项及使用限制
BR 支持对备份到 S3 的数据进行 S3 服务端加密 (SSE)。BR S3 服务端加密也支持使用用户自行创建的 AWS KMS 密钥进行加密,详细信息请参考 [BR S3 服务端加密](/encryption-at-rest.md#br-s3-服务端加密)。

当前版本 (v4.0.0) 的 TiKV 加密功能还有待改善,需要在启用加密前注意以下事项:
### 日志

* TiDB 集群部署后,大部分用户数据都存储在 TiKV 节点上。这部分数据可使用加密功能进行加密。但有少量元数据存储在 PD 节点上(例如用作 TiKV Region 边界的二级索引键)。截至 v4.0.0,PD 尚未支持静态加密功能。建议使用存储级加密(例如文件系统加密)来保护存储在 PD 中的敏感数据。
* TiFlash 从 v4.0.5 开始支持静态加密功能,详情参阅 [TiFlash 静态加密](/encryption-at-rest.md#tiflash-静态加密-从-v405-版本开始引入)。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 信息日志包含用于调试的用户数据。信息日志不会被加密。
TiKV, TiDB 和 PD 信息日志中可能包含用于调试的用户数据。信息日志不会被加密,建议开启[日志脱敏](/log-redaction.md)功能。

## 功能概述
## TiKV 静态加密

TiKV 当前支持的加密算法包括 AES128-CTR、AES192-CTR 和 AES256-CTR。TiKV 使用信封加密 (envelop encryption),所以启用加密后,TiKV 使用以下两种类型的密钥:

* 主密钥 (master key):主密钥由用户提供,用于加密 TiKV 生成的数据密钥。用户在 TiKV 外部进行主密钥的管理。
* 数据密钥 (data key):数据密钥由 TiKV 生成,是实际用于加密的密钥。TiKV 会自动轮换数据密钥。
* 数据密钥 (data key):数据密钥由 TiKV 生成,是实际用于加密的密钥。

多个 TiKV 实例可共用一个主密钥。在生产环境中,推荐通过 AWS KMS 提供主密钥。首先通过 AWS KMS 创建用户主密钥 (CMK),然后在配置文件中将 CMK 密钥的 ID 提供给 TiKV。TiKV 进程在运行时可以通过 [IAM 角色](https://aws.amazon.com/iam/)访问 KMS CMK。如果 TiKV 无法访问 KMS CMK,TiKV 就无法启动或重新启动。详情参阅 AWS 文档中的 [KMS](https://docs.aws.amazon.com/zh_cn/kms/index.html) and [IAM](https://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/introduction.html)。

用户也可以通过文件形式提供主密钥。该文件须包含一个用十六进制字符串编码的 256 位(32 字节)密钥,并以换行符结尾(即 `\n`),且不包含其他任何内容。将密钥存储在磁盘上会泄漏密钥,因此密钥文件仅适合存储在 RAM 内存的 `tempfs` 中。

数据密钥由 TiKV 生成并传递给底层存储引擎(即 RocksDB)。RocksDB 写入的所有文件,包括 SST 文件,WAL 文件和 MANIFEST 文件,均由当前数据密钥加密。TiKV 使用的其他临时文件(可能包括用户数据)也由相同的数据密钥加密。默认情况下,TiKV 每周自动轮换数据密钥,但是该时间段是可配置的。密钥轮换时,TiKV 不会重写全部现有文件来替换密钥,但如果集群的写入量恒定,则 RocksDB compaction 会将使用最新的数据密钥对数据重新加密。TiKV 跟踪密钥和加密方法,并使用密钥信息对读取的内容进行解密。
数据密钥由 TiKV 传递给底层存储引擎(即 RocksDB)。RocksDB 写入的所有文件,包括 SST 文件,WAL 文件和 MANIFEST 文件,均由当前数据密钥加密。TiKV 使用的其他临时文件(可能包括用户数据)也由相同的数据密钥加密。默认情况下,TiKV 每周自动轮换数据密钥,但是该时间段是可配置的。密钥轮换时,TiKV 不会重写全部现有文件来替换密钥,但如果集群的写入量恒定,则 RocksDB compaction 会将使用最新的数据密钥对数据重新加密。TiKV 跟踪密钥和加密方法,并使用密钥信息对读取的内容进行解密。

无论用户配置了哪种数据加密方法,数据密钥都使用 AES256-GCM 算法进行加密,以方便对主密钥进行验证。所以当使用文件而不是 KMS 方式指定主密钥时,主密钥必须为 256位(32字节)。

## 配置加密
### 创建密钥

要启用加密,你可以在 TiKV 的配置文件中添加加密部分:
如需在 AWS 上创建一个密钥,请执行以下步骤:

1. 进入 AWS 控制台的 [AWS KMS](https://console.aws.amazon.com/kms)。
2. 确保在控制台的右上角选择正确的区域。
3. 点击**创建密钥**,选择**对称** (Symmetric) 作为密钥类型。
4. 为钥匙设置一个别名。

你也可以使用 AWS CLI 执行该操作:

```shell
aws --region us-west-2 kms create-key
aws --region us-west-2 kms create-alias --alias-name "alias/tidb-tde" --target-key-id 0987dcba-09fe-87dc-65ba-ab0987654321
```

需要在第二条命令中输入的 `--target-key-id` 是第一条命令的结果。

### 配置加密

要启用加密,你可以在 TiKV 和 PD 的配置文件中添加加密部分:

```
[security.encryption]
data-encryption-method = aes128-ctr
data-key-rotation-period = 7d
data-encryption-method = "aes128-ctr"
data-key-rotation-period = "168h" # 7 days
```

`data-encryption-method` 的可选值为 `"aes128-ctr"`、`"aes192-ctr"`、`"aes256-ctr"` 和 `"plaintext"`。默认值为 `"plaintext"`,即默认不开启加密功能。`data-key-rotation-period` 指定 TiKV 轮换密钥的频率。可以为新 TiKV 群集或现有 TiKV 群集开启加密,但只有启用后写入的数据才保证被加密。要禁用加密,请在配置文件中删除 `data-encryption-method`,或将该参数值为 `"plaintext"`,然后重启 TiKV。
Expand All @@ -58,7 +100,9 @@ region = "us-west-2"
endpoint = "https://kms.us-west-2.amazonaws.com"
```

`key-id` 指定 KMS CMK 的密钥 ID。`region` 为 KMS CMK 的 AWS 区域名。除非你使用非 AWS 提供的 AWS KMS 兼容服务,`endpoint` 通常无需指定。
`key-id` 指定 KMS CMK 的密钥 ID。`region` 为 KMS CMK 的 AWS 区域名。`endpoint` 通常无需指定,除非你在使用非 AWS 提供的 AWS KMS 兼容服务或需要使用 [KMS VPC endpoint](https://docs.aws.amazon.com/kms/latest/developerguide/kms-vpc-endpoint.html)。

你也可以使用 AWS [多区域键](https://docs.aws.amazon.com/zh_cn/kms/latest/developerguide/multi-region-keys-overview.html)。为此,你需要在一个特定的区域设置一个主键,并在需要的区域中添加副本密钥。

若要使用文件方式指定主密钥,主密钥配置应如下所示:

Expand All @@ -74,7 +118,7 @@ path = "/path/to/key/file"
3b5896b5be691006e0f71c3040a29495ddcad20b14aff61806940ebd780d3c62
```

## 轮换主密钥
### 轮换主密钥

要轮换主密钥,你必须在配置中同时指定新的主密钥和旧的主密钥,然后重启 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 也只会在无法使用新的主密钥解密现有数据时尝试使用旧密钥。

Expand All @@ -94,7 +138,7 @@ key-id = "0987dcba-09fe-87dc-65ba-ab0987654321"
region = "us-west-2"
```

## 监控和调试
### 监控和调试

要监控静态加密(如果 TiKV 中部署了 Grafana 组件),可以查看 **TiKV-Details** -> **Encryption** 面板中的监控项:

Expand Down Expand Up @@ -137,10 +181,4 @@ region = "us-west-2"

```
./br restore full --pd <pd-address> --storage "s3://<bucket>/<prefix> --s3.region <region>"
```

## TiFlash 静态加密 <span class="version-mark">从 v4.0.5 版本开始引入</span>

TiFlash 从 v4.0.5 起支持静态加密。数据密钥由 TiFlash 生成。TiFlash(包括 TiFlash Proxy)写入的所有文件,包括数据文件、Schema 文件、临时文件等,均由当前数据密钥加密。TiFlash 支持的加密算法、加密配置方法(配置项在 `tiflash-learner.toml` 中)和监控项含义等均与 TiKV 一致。

如果 TiFlash 中部署了 Grafana 组件,可以查看 **TiFlash-Proxy-Details** -> **Encryption**。
```