在 Databend 中,我们致力于保护用户的数据安全。除了身份认证之外,我们还提供了多种访问策略,包括网络策略(Network Policy)、密码策略(Password Policy)和数据脱敏策略(Masking Policy)。让我们来了解一下 Databend 中的用户类型以及这些安全策略的应用。
用户类型
Databend 中的用户主要分为两类:
- 配置用户(Configured User)
- 自建用户(Created User)
配置用户
配置用户是在 Databend 配置文件(databend-query.toml)中定义的用户,通常具有管理员权限。这类用户适合用作管理员账号。
[[query.users]]
name = "default"
auth_type = "no_password"
自建用户
Created User 是通过 SQL 的 CREATE USER 命令创建的用户,对数据库对象的访问受到权限模型的限制。
CREATE [OR REPLACE] USER [IF NOT EXISTS] '<username>' IDENTIFIED [WITH <auth_type>] [BY <password>] [WITH <user_option>, ...]
用户认证
在用户认证阶段,Databend 会根据用户名获取相应的用户信息。
对于配置用户,认证阶段会授予其所有权限,并将默认角色设置为 account_admin。
对于自建用户,Databend 会从元数据中获取相应的用户信息。
Credential 分为两类:
JWT(JSON Web Token)
Password
Password Credential 支持 Sha256 和 DoubleSha1 两种加密方式,默认使用 Sha256。
注意:在 JWT Credential 下,如果用户不存在,Databend 会自动创建该用户。
网络策略
网络策略是一种配置机制,用于控制用户在系统内的网络访问。它允许用户定义一组规则,以控制特定用户允许和阻止的 IP 地址范围,从而有效地控制网络级别的访问权限。
如何使用网络策略
可以使用 ALTER USER 命令将网络策略与特定用户关联起来。一个网络策略可以与多个用户关联,只要它们符合相同的策略标准。有关在 Databend 中管理网络策略的介绍,请参阅网络策略文档。
以下示例展示了如何创建一个网络策略,并将其与用户关联以控制网络访问。
-- 创建网络策略
CREATE NETWORK POLICY sample_policy
ALLOWED_IP_LIST=('192.168.1.0/24')
BLOCKED_IP_LIST=('192.168.1.99')
COMMENT='Sample';
-- 将网络策略与用户关联
ALTER USER sample_user WITH SET NETWORK POLICY='sample_policy';
以下示例演示了创建一个指定允许和阻止的IP地址的网络策略,并将此策略与用户关联起来以控制网络访问。网络策略允许所有从192.168.1.0到192.168.1.255的IP地址,仅拒绝 192.168.1.99。
-- Create a network policy
CREATE NETWORK POLICY sample_policy
ALLOWED_IP_LIST=('192.168.1.0/24')
BLOCKED_IP_LIST=('192.168.1.99')
COMMENT='Sample';
SHOW NETWORK POLICIES;
Name |Allowed Ip List |Blocked Ip List|Comment |
-------------+-------------------------+---------------+-----------+
sample_policy|192.168.1.0/24 |192.168.1.99 |Sample |
-- Create a user
CREATE USER sample_user IDENTIFIED BY 'databend';
-- Associate the network policy with the user
ALTER USER sample_user WITH SET NETWORK POLICY='sample_policy';
密码策略
密码策略可以增强系统安全性并使账户管理更加顺畅。该策略定义了创建或更改密码时的规则,包括长度、字符类型、年龄限制、重试限制、锁定时间和密码历史等方面。有关在 Databend 中管理密码策略的介绍,请参阅密码策略文档。
此示例建立以下 Password Policy 并为应用到数据库用户中:
- DBA: 用于管理员用户,严格自定义每个 Password Policy 属性。
- ReadOnlyUser: 用于普通用户,使用所有属性的默认值。
-- 使用自定义属性值创建 'DBA' Password Policy
CREATE PASSWORD POLICY DBA
PASSWORD_MIN_LENGTH = 12
PASSWORD_MAX_LENGTH = 18
PASSWORD_MIN_UPPER_CASE_CHARS = 2
PASSWORD_MIN_LOWER_CASE_CHARS = 2
PASSWORD_MIN_NUMERIC_CHARS = 2
PASSWORD_MIN_SPECIAL_CHARS = 1
PASSWORD_MIN_AGE_DAYS = 1
PASSWORD_MAX_AGE_DAYS = 30
PASSWORD_MAX_RETRIES = 3
PASSWORD_LOCKOUT_TIME_MINS = 30
PASSWORD_HISTORY = 5;
-- 使用所有属性的默认值创建 'ReadOnlyUser' Password Policy
CREATE PASSWORD POLICY ReadOnlyUser;
SHOW PASSWORD POLICIES;
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ name │ comment │ options │
├──────────────┼─────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ DBA │ │ MIN_LENGTH=12, MAX_LENGTH=18, MIN_UPPER_CASE_CHARS=2, MIN_LOWER_CASE_CHARS=2, MIN_NUMERIC_CHARS=2, MIN_SPECIAL_CHARS=1, MIN_AGE_DAYS=1, MAX_AGE_DAYS=30, MAX_RETRIES=3, LOCKOUT_TIME_MINS=30, HISTORY=5 │
│ ReadOnlyUser │ │ MIN_LENGTH=8, MAX_LENGTH=256, MIN_UPPER_CASE_CHARS=1, MIN_LOWER_CASE_CHARS=1, MIN_NUMERIC_CHARS=1, MIN_SPECIAL_CHARS=0, MIN_AGE_DAYS=0, MAX_AGE_DAYS=90, MAX_RETRIES=5, LOCKOUT_TIME_MINS=15, HISTORY=0 │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
假设已经有一个名为 'eric' 的 DBA 用户,使用 ALTER USER 命令将 DBA Password Policy 应用于该用户:
-- 将 'DBA' Password Policy 应用于用户 'eric'
ALTER USER eric WITH SET PASSWORD POLICY = 'DBA';
创建一个名为 'frank' 的新用户,并使用 CREATE USER 命令应用 'ReadOnlyUser' Password Policy :
-- 注意:为用户 'frank' 设置的密码必须遵守关联的 'ReadOnlyUser' Password Policy 定义的约束。
CREATE USER frank IDENTIFIED BY 'Abc12345'
WITH SET PASSWORD POLICY = 'ReadOnlyUser';
数据脱敏策略
数据脱敏策略用于控制对敏感数据的显示或访问规则和设置,从而保护数据的机密性。通过定义数据脱敏策略,用户可以在保护敏感数据的同时允许授权用户与数据进行交互。
考虑以下场景,我们希望只向经理展示表中的电子邮件地址:
id | |
---|---|
2 | eric@example.com |
1 | sue@example.com |
对于非经理用户,电子邮件地址将被数据脱敏显示:
|id|email |
|--+---------+
| 2|*********|
| 1|*********|
如何使用数据脱敏策略
在创建数据脱敏策略之前,请确保已正确定义或规划了角色及其相应的访问权限,因为策略的实施依赖于这些角色以确保数据数据脱敏的安全有效性。要管理 Databend 的用户和角色,请参阅用户与角色文档。
数据脱敏策略应用于列。因此,要为特定列应用数据脱敏,用户必须首先创建一个数据脱敏策略,然后使用 ALTER TABLE COLUMN 将该策略与预期列关联起来。建立关联后,数据脱敏策略将更贴合重要的数据隐私环境。
以下示例演示了如何通过角色选择性地显示或数据脱敏敏感数据的数据脱敏策略设置过程:
注意:数据脱敏策略是企业版功能。 如果希望体验该功能,需要获取许可证,请联系 Databend 支持团队。
-- 创建一个表并插入示例数据
CREATE TABLE user_info (
id INT,
email STRING
);
INSERT INTO user_info (id, email) VALUES (1, 'sue@example.com');
INSERT INTO user_info (id, email) VALUES (2, 'eric@example.com');
-- 创建一个角色
CREATE ROLE 'MANAGERS';
GRANT ALL ON *.* TO ROLE 'MANAGERS';
-- 创建一个用户并将角色授予该用户
CREATE USER manager_user IDENTIFIED BY 'databend';
GRANT ROLE 'MANAGERS' TO 'manager_user';
-- 创建一个数据脱敏策略
CREATE MASKING POLICY email_mask
AS
(val string)
RETURNS string ->
CASE
WHEN current_role() IN ('MANAGERS') THEN
val
ELSE
'*********'
END
COMMENT = 'hide_email';
-- 将数据脱敏策略与'email'列关联
ALTER TABLE user_info MODIFY COLUMN email SET MASKING POLICY email_mask;
-- 以Root用户查询
SELECT * FROM user_info;
id|email |
--+---------+
2|*********|
1|*********|
结语
通过合理配置网络策略、密码策略和数据脱敏策略,Databend 提供了强大的数据安全保护机制,确保用户的数据得到妥善保护,并提高了系统的安全性和可靠性。