*: add column-level masking policy feature document#21454
Conversation
|
@tiancaiamao Please involve a tech reviewer for this PR. Thanks. |
| END | ||
| ENABLE; | ||
|
|
||
| -- 即使用户看到脱敏数据,过滤仍然有效 |
There was a problem hiding this comment.
| -- 即使用户看到脱敏数据,过滤仍然有效 | |
| -- 即使用户在 Where 条件输入未脱敏数据,过滤仍然有效 |
|
Please address the comments~ |
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
|
@tiancaiamao: The following test failed, say
Full PR test history. Your PR dashboard. DetailsInstructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here. |
| --- | ||
| title: 列级脱敏策略 | ||
| summary: 本文介绍如何使用列级脱敏策略来保护 TiDB 中的敏感数据。 | ||
| aliases: ['/docs/dev/column-level-masking-policy/'] |
There was a problem hiding this comment.
| aliases: ['/docs/dev/column-level-masking-policy/'] |
There was a problem hiding this comment.
reason: aliases are only needed for docs that replace existing docs
|
|
||
| # 列级脱敏策略 | ||
|
|
||
| 列级脱敏策略是一项安全功能,允许你在列级别应用脱敏规则来保护敏感数据。当对列应用脱敏策略时,TiDB 会根据定义的规则自动对返回给用户的数据进行脱敏,而原始数据在存储中保持不变。 |
There was a problem hiding this comment.
| 列级脱敏策略是一项安全功能,允许你在列级别应用脱敏规则来保护敏感数据。当对列应用脱敏策略时,TiDB 会根据定义的规则自动对返回给用户的数据进行脱敏,而原始数据在存储中保持不变。 | |
| 列级脱敏策略是 TiDB 中的一项安全功能,允许你为表中的指定列创建脱敏规则来保护敏感数据。当对列应用脱敏策略时,TiDB 会按照定义的规则自动对返回给用户的查询结果数据进行脱敏,而原始数据在存储中保持不变。 |
|
|
||
| 列级脱敏策略是一项安全功能,允许你在列级别应用脱敏规则来保护敏感数据。当对列应用脱敏策略时,TiDB 会根据定义的规则自动对返回给用户的数据进行脱敏,而原始数据在存储中保持不变。 | ||
|
|
||
| 此功能对于满足 PCI-DSS(支付卡行业数据安全标准)等合规要求以及数据隐私法规(如 GDPR - 通用数据保护条例、CCPA - 加州消费者隐私法案)特别有用,这些法规要求严格控制谁可以查看信用卡号、个人标识符和其他机密信息等敏感信息。 |
There was a problem hiding this comment.
| 此功能对于满足 PCI-DSS(支付卡行业数据安全标准)等合规要求以及数据隐私法规(如 GDPR - 通用数据保护条例、CCPA - 加州消费者隐私法案)特别有用,这些法规要求严格控制谁可以查看信用卡号、个人标识符和其他机密信息等敏感信息。 | |
| 列级脱敏策略适用于需要限制敏感数据可见性的场景,例如控制信用卡号、身份证号、电话号码、电子邮件地址、出生日期等敏感信息的访问范围。 |
|
|
||
| ## 概述 | ||
|
|
||
| 脱敏策略绑定到表列,并在查询结果时进行评估。策略使用 SQL 表达式根据当前用户身份或角色来确定如何对数据进行脱敏。 |
There was a problem hiding this comment.
| 脱敏策略绑定到表列,并在查询结果时进行评估。策略使用 SQL 表达式根据当前用户身份或角色来确定如何对数据进行脱敏。 | |
| 脱敏策略绑定到表中的单个列。每个列最多只能绑定一个脱敏策略。策略表达式通常使用 SQL `CASE WHEN` 表达式,并结合 `CURRENT_USER()` 或 `CURRENT_ROLE()` 判断当前会话是否可以查看原始值。 |
| - **结果时脱敏**:数据在返回给客户端时进行脱敏,而不是以脱敏形式存储 | ||
| - **支持用户/角色**:不同用户可以根据其权限看到不同级别的数据 | ||
| - **灵活的表达式**:使用 SQL `CASE WHEN` 表达式定义复杂的脱敏逻辑 | ||
| - **内置函数**:用于常见脱敏模式的预定义函数 | ||
| - **可选限制**:控制脱敏数据是否可用于某些操作 |
There was a problem hiding this comment.
| - **结果时脱敏**:数据在返回给客户端时进行脱敏,而不是以脱敏形式存储 | |
| - **支持用户/角色**:不同用户可以根据其权限看到不同级别的数据 | |
| - **灵活的表达式**:使用 SQL `CASE WHEN` 表达式定义复杂的脱敏逻辑 | |
| - **内置函数**:用于常见脱敏模式的预定义函数 | |
| - **可选限制**:控制脱敏数据是否可用于某些操作 | |
| - **结果阶段脱敏**:TiDB 在返回查询结果到客户端时应用脱敏逻辑,而不修改原始数据 | |
| - **基于用户或角色控制可见性**:不同用户或不同角色可以根据其权限看到不同级别的数据。 | |
| - **支持表达式脱敏**:可以使用 SQL `CASE WHEN` 表达式定义灵活的脱敏逻辑。 | |
| - **提供内置脱敏函数**:支持完整脱敏、部分脱敏、返回 `NULL`、日期替换等常见脱敏方式。 | |
| - **支持操作限制**:可以使用 `RESTRICT ON` 阻止某些语句将脱敏数据复制或写入其他表。 |
| {{< copyable "sql" >}} | ||
|
|
There was a problem hiding this comment.
| {{< copyable "sql" >}} |
There was a problem hiding this comment.
reason: not needed anymore because the copy button is added automitacally for all code blocks on the docs website.
Please remove all "{{< copyable "sql" >}}" from this doc.
| -- 1. 将脱敏数据复制到另一个表 | ||
| INSERT INTO other_table SELECT value FROM sensitive_data; -- 错误 | ||
|
|
||
| -- 2. 使用脱敏数据进行更新 | ||
| UPDATE some_table SET x = (SELECT value FROM sensitive_data); -- 错误 | ||
|
|
||
| -- 3. 使用脱敏数据进行删除 | ||
| DELETE FROM some_table WHERE x IN (SELECT value FROM sensitive_data); -- 错误 |
There was a problem hiding this comment.
| -- 1. 将脱敏数据复制到另一个表 | |
| INSERT INTO other_table SELECT value FROM sensitive_data; -- 错误 | |
| -- 2. 使用脱敏数据进行更新 | |
| UPDATE some_table SET x = (SELECT value FROM sensitive_data); -- 错误 | |
| -- 3. 使用脱敏数据进行删除 | |
| DELETE FROM some_table WHERE x IN (SELECT value FROM sensitive_data); -- 错误 | |
| -- 1. 将受保护列的数据复制到另一个表 | |
| INSERT INTO other_table SELECT value FROM sensitive_data; -- 错误 | |
| -- 2. 使用受保护列的数据更新另一个表 | |
| UPDATE some_table SET x = (SELECT value FROM sensitive_data); -- 错误 | |
| -- 3. 使用受保护列的数据作为删除条件 | |
| DELETE FROM some_table WHERE x IN (SELECT value FROM sensitive_data); -- 错误 |
| RESTRICT ON (INSERT_INTO_SELECT, UPDATE_SELECT, DELETE_SELECT) | ||
| ENABLE; | ||
|
|
||
| -- 普通用户在尝试以下操作时会收到错误: |
There was a problem hiding this comment.
| -- 普通用户在尝试以下操作时会收到错误: | |
| -- 普通用户在尝试以下操作时,TiDB 会返回错误: |
|
|
||
| ### 使用 current_user() | ||
|
|
||
| 你可以在脱敏表达式中使用 `current_user()` 来检查登录用户: |
There was a problem hiding this comment.
| 你可以在脱敏表达式中使用 `current_user()` 来检查登录用户: | |
| 你可以在脱敏表达式中使用 `CURRENT_USER()` 判断当前会话对应的用户账号。 |
There was a problem hiding this comment.
建议统一写成 CURRENT_USER(),和其他文档一致
| -- 将角色授予授权用户 | ||
| GRANT data_viewer TO 'analyst'@'%'; | ||
|
|
||
| -- 用户必须激活角色才能查看未脱敏的数据 |
There was a problem hiding this comment.
| -- 用户必须激活角色才能查看未脱敏的数据 | |
| -- 用户需要先激活角色,才能按照角色条件查看未脱敏数据: |
| 注意:`current_role()` 和 `current_user()` 的数据格式是不一样的,前者类似 '\`data_viewer\`@\`%\`' 而后者类似于 'data_view@%',区别是有无 \` 包裹。 | ||
| 这个行为不是 bug,而是 MySQL 就是这样的行为。见 https://github.com/pingcap/tidb/issues/67227 |
There was a problem hiding this comment.
| 注意:`current_role()` 和 `current_user()` 的数据格式是不一样的,前者类似 '\`data_viewer\`@\`%\`' 而后者类似于 'data_view@%',区别是有无 \` 包裹。 | |
| 这个行为不是 bug,而是 MySQL 就是这样的行为。见 https://github.com/pingcap/tidb/issues/67227 | |
| > **注意:** | |
| > | |
| > `CURRENT_USER()` 和 `CURRENT_ROLE()` 的返回格式不同。该行为并非 bug,与 MySQL 一致,详见 [#67227](https://github.com/pingcap/tidb/issues/67227)。 | |
| > | |
| > - `CURRENT_USER()` 通常返回 `'user_name@host_name'`,例如 `'analyst@%'`。 | |
| > - `CURRENT_ROLE()` 返回当前激活的角色,格式通常包含反引号,例如 ``'`data_viewer`@`%`'``。如果没有激活任何角色,返回 `'NONE'`。 | |
| > | |
| > 如果一个会话可能同时激活多个角色,建议先确认 `CURRENT_ROLE()` 的实际返回值,再编写精确的匹配条件。 |
First-time contributors' checklist
What is changed, added or deleted? (Required)
Which TiDB version(s) do your changes apply to? (Required)
Tips for choosing the affected version(s):
By default, CHOOSE MASTER ONLY so your changes will be applied to the next TiDB major or minor releases. If your PR involves a product feature behavior change or a compatibility change, CHOOSE THE AFFECTED RELEASE BRANCH(ES) AND MASTER.
For details, see tips for choosing the affected versions (in Chinese).
What is the related PR or file link(s)?
Do your changes match any of the following descriptions?