在前几篇的 KWDB 数据运维文章中,我们和大家分享了日志系统、集群参数。今天我们主要分享 KWDB 的安全与审计。
为确保用户数据的保密性、完整性和可用性,KWDB 提供了如下的安全功能:
数据加密:
KWDB 支持使用 SSL/TLS 协议对客户端和服务器之间的数据传输进行加密,确保数据在传输过程中不被窃取或篡改,提高了数据传输的安全性。
身份鉴别:
KWDB 通过基于用户名和密码的身份鉴别及灵活的主机认证规则,确保数据库访问的安全性。
基于用户名和密码的身份鉴别:用户在登录时需提供正确的用户名和密码,系统将验证其凭证以允许访问。
基于主机的认证:KWDB 支持用户通过系统参数配置对指定用户和指定 IP 地址范围设置基于证书、密码认证,无条件允许或拒绝连接等认证规则,实现对主机的访问的精确管理。
权限管理:
KWDB 支持灵活的权限管理机制,为用户提供了多层次、多维度的权限管理功能,具体包括:
基于角色的权限管理:管理员可以创建不同的角色,并为每个角色分配特定的权限。通过将用户和角色分配到适当的角色中,实现对用户权限的管理,从而简化权限管理流程,确保安全性。
细粒度的对象级权限控制:KWDB 允许管理员对数据库中的对象,例如数据库、表,进行细粒度的权限控制。管理员可以精确地指定哪些用户或角色可以访问特定的数据库对象,以及可以执行的操作类型。
动态权限调整:管理员可以随时根据需要调整用户或角色的权限,包括增加、修改或撤销权限,及时响应业务需求或安全策略的变化,保障系统的灵活性和安全性。
审计管理:
审计管理是 KWDB 安全管理的核心组成部分,通过全面记录数据库活动和用户操作,KWDB 能够帮助用户实时监控数据库的安全状态,并生成详尽的审计日志。这些日志可以帮助用户追溯安全事件的发生原因,加强对数据库的监控和管理。
因内容篇幅较长,我们将分上下两个章节为大家详细介绍。本次重点为数据加密、身份鉴别和审计管理部分,权限管理将在下一章节单独介绍。
KWDB 默认在部署时采用安全模式,使用 TLS 加密技术来验证节点和客户端的身份,对节点与客户端、以及节点与节点之间的数据传输进行加密。这一机制有效地防范了未经授权的访问和数据篡改,保障了数据的安全性和完整性。
KWDB 通过 --certs-dir 参数配置安全证书,并以安全模式启动。
如果需要修改证书的存放目录,可以通过修改 --certs-dir 参数以指定新的存放目录。容器部署 docker-compose.yml 文件配置示例:
command: - /bin/bash - -c - |/KWDB/bin/kwbase start-single-node --certs-dir=/KWDB/certs --listen-addr=0.0.0.0:26257 --advertise-addr=192.168.123.128:26257 --store=/KWDB/deploy/KWDB-container
KWDB 通过基于用户名和密码的身份鉴别及灵活的主机认证规则,确保数据库访问的安全性。
基于用户名和密码的身份鉴别
基于用户名和密码的身份鉴别是 KWDB 最基本的身份验证方式。使用此方法时,数据库在用户登录时会验证其提供的用户名和密码是否匹配。这里主要介绍如何设置用户密码及用户密码修改。
用户可以使用 CREATE USER 语句创建新用户并设置密码。KWDB 支持为每个用户设置密码的有效期,以增强安全性。
前提条件:
用户拥有 CREATEROLE 权限或者是 admin 角色的成员。SQL 语法:
CREATE USER <name> WITH PASSWORD '<password>' [VALID UNTIL '<time>'];
(左滑查看完整代码)
参数说明:
name:要创建的用户名称。用户名称不区分大小写;以字母或下划线开头;必须仅包含字母,数字或下划线;且必须介于 1 到 63 个字符之间。
password:用户密码。用户使用此密码安全访问节点。密码必须采用字符串的形式,并使用单引号(')将密码括起来。
time:可选参数,用于设置密码有效期,支持 timestamp 格式。到达指定日期或时间后,密码失效。需使用单引号(')将密码有效期括起来。
示例:
创建用户 user1,并设置密码和密码有效期:
CREATE USER user1 WITH PASSWORD '11aa!!AA' VALID UNTIL '2025-01-01 00:00:00+00:00';
ALTER USER 语句可用于更改一个或多个用户选项,如更改登录密码等。每条语句只支持更改一个用户。
前提条件:
用户拥有 CREATEROLE 选项或是 admin 角色的成员。SQL 语法如下:
ALTER USER [IF EXISTS] <name> WITH [ PASSWORD '<password>' | VALID UNTIL '<time>'];
(左滑查看完整代码)
参数说明:
IF EXISTS:可选关键字。若用户存在则更改,若用户不存在则不报错。未设置 IF EXISTS 时,若用户不存在则系统报错。
name:要更改的用户名称。用户名称不区分大小写;必须以字母或下划线开头,仅包含字母、数字或下划线,且长度在 1 到 63 个字符之间。
password:设置用户密码。密码必须采用字符串形式,并用单引号(')括起来。
time:设置密码有效期,采用 timestamp 格式,并用单引号(')括起来。
示例1:修改用户密码:
ALTERUSER user1 WITHPASSWORD'PassWord4Deomo';
示例2:修改用户密码的有效期:
ALTER USER user1 WITH VALID UNTIL '2025-12-31';
KWDB 提供基于主机的认证配置,控制客户端的访问权限。认证规则格式与 PostgreSQL 的 pg_hba.conf 兼容,用户可通过 server.host_based_authentication.configuration 集群参数设置认证规则。
前提条件:
用户拥有 admin 权限。SQL 语句:
SET CLUSTER SETTING server.host_based_authentication.configuration = 'host all <user_name> <address> <method>';
(左滑查看完整代码)
参数说明:
user_name:用户名称,支持设置为 all,表示匹配所有用户。
address:设置允许或拒绝访问的 IP 地址范围,如果字段值包含了 IP 地址及其掩码,例如 192.168.1.0/24,则无需提供掩码值,如果字段值只包含了 IP 地址,例如 192.168.1.0,没有掩码,则接下来的字段就必须提供有效的 IP 掩码,例如 255.255.255.0。支持设置为 all,表示适用于所有 IP 地址。
method:认证规则,用户可以根据需求定制认证规则,具体包括
cert:基于证书的身份验证(需要 SSL 连接)。
cert-password:基于证书或密码的身份验证(需要 SSL 连接)。
password:基于密码的身份验证(需要 SSL 连接)。
trust:无条件地允许匹配的连接。
reject:无条件地拒绝匹配的连接。
示例1:禁用特定 IP 的用户连接:
SET CLUSTER SETTING server.host_based_authentication.configuration = 'host all all 10.110.10.153/32 reject';
(左滑查看完整代码)
示例2:允许 testuser 用户使用证书连接:
SET CLUSTER SETTING server.host_based_authentication.configuration = 'host all testuser 0.0.0.0/0 cert';
审计管理是 KWDB 安全管理的核心组成部分,KWDB 支持监控和记录包括管理员在内的用户操作,对系统级、语句级和对象级操作进行审计。
系统级审计会在审计功能开启后自动启动。下表为 KWDB 支持审计的系统级操作:
对象 | 操作 |
---|---|
NODE | 重启(RESTART) 退役(DECOMMISON) 复役(RECOMMISION) 退出(QUIT) 加入(JOIN) |
CONNECT | 登录(LOGIN) 登出(LOGOUT) |
CLUSTER SETTING | 设置(SET) 重置(RESET) |
语句级和对象级审计需要用户通过 SQL 语句创建和启用相应的审计策略。下表为 KWDB 支持审计的语句级操作:
对象 | 关系数据库 | 时序数据库 |
---|---|---|
USER |
|
|
ROLE |
|
|
DATABASE |
|
|
SCHEMA |
| - |
TABLE |
|
|
VIEW |
| - |
INDEX |
| - |
SEQUENCE |
| - |
PRIVILEGE |
|
|
AUDIT |
|
|
RANGE |
|
|
QUERY |
|
|
JOB |
|
|
SCHEDULE |
|
|
SESSION |
|
|
STATISTICS |
|
|
KWDB 支持审计的对象级操作包括:
对象 | 关系数据库 | 时序数据库 |
---|---|---|
TABLE |
|
其中update和delete只支持报错审计。 |
VIEW |
| - |
审计功能开启后,系统会默认将审计结果保存在审计日志文件。更多审计日志相关信息见文章最后的审计日志章节。
审计功能默认关闭,如需对用户操作进行审计,需要通过SQL语句开启审计功能。
前提条件:
用户为 admin 用户。SQL 语法:
set cluster setting audit.enabled = true;
语句级和对象级审计策略通过 SQL 语句进行创建、启用、修改和删除,系统级审计不需要创建审计策略。用户开启审计开关后,一旦发生支持审计的系统级操作,系统就会自动生成相应的审计日志。
前提条件:
用户为 admin 用户。SQL 语法:
CREATEAUDIT [IFNOTEXISTS] <audit_name>ON [ALL | <target_type> [<target_name>]]FOR [ALL | <operations>]TO [ALL | <operators>][WHENEVER [ALL]];
参数说明:
IF NOT EXISTS:可选关键字,如果设置了 IF NOT EXISTS,当要创建的审计策略不存在时,系统创建审计策略;如果已经存在,系统无法创建审计策略,但是不报错。
audit_name:审计策略名称,必须是唯一的。
target_type:对象类型,支持user、role、database、schema、table、view、index、sequence、privilege、audit、range、query、job、schedule、session和statistics,可使用“ALL”作为参数值,对所有对象类型进行审计。
target_name:数据库已存在的对象名称。格式为database_name.target_name;如果只提供了对象名称,则默认对当前数据库的对象进行审计。如果没有指定对象名称,KWDB会指定对象类型的操作进行审计。
operations:操作事件,支持指定一个或多个操作对象,使用逗号分隔,可使用‘“ALL”作为参数值对所有操作进行审计,支持审计的操作取决于对象可执行的操作。
operators:用户或角色名称,支持指定一个或多个用户或角色,使用逗号分隔,可使用“ALL”作为参数值对所有用户和角色进行审计。
WHENEVER:可选关键字,指定审计执行条件,默认为ALL,表示总是记录审计,且只支持设置为ALL;
示例1:创建语句级审计策略
> CREATE AUDIT atest ON DATABASE FOR create TO root;
示例2:创建对象级审计策略
> CREATE AUDIT atest ON TABLE t1 FOR select TO root;
修改设置审计策略支持启用、禁用审计策略以及对策略进行重命名。
前提条件:
用户为 admin 用户。SQL 语法:
ALTERAUDIT [IFEXISTS] <audit_name> [ENABLE | DISABLE | RENAMETO <new_name>];
(左滑查看完整代码)
参数说明:
IF EXISTS:可选关键字,设置了 IF EXISTS,如果审计策略存在,系统更改审计策略;如果审计策略不存在,系统无法更改审计策略,但不会报错。
audit_name:审计策略名称。
ENABLE:将审计策略状态修改为生效,默认为不生效。
DISABLE:将审计策略状态修改为暂不生效。
new_name:审计策略名称的新名称,必须是唯一的。
示例1:启动审计策略
> ALTER AUDIT atest ENABLE;
示例2:重命名审计策略
> ALTER AUDIT atest rename TO btest;
SHOW AUDITS [ON <target_type> [<target_name>] [FOR <operations>] [TO <operators>]];
(左滑查看完整代码)
参数说明:
target_type:可选参数,指定对象类型,支持user、role、database、schema、table、view、index、sequence、privilege、audit、range、query、job、schedule、session、statistics和all。
target_name:可选参数,指定数据库已存在的对象名称,格式为database_name.target_name;如果只提供了对象名称,则默认对当前数据库的对象进行审计。如果没有指定对象名称,KWDB 查看指定对象类型的审计策略。注:如果对象类型为database,无法指定对象名称。
operations:可选参数,指定操作事件,支持指定一个或多个操作对象,使用逗号分隔。支持审计的操作取决于对象可执行的操作。
operators:可选参数,指定用户或角色名称,支持指定一个或多个用户或角色,使用逗号分隔。
示例1:查看所有审计策略
> show audits; audit_name | target_type | target_name | target_id | operations | operators | condition | whenever | action | level | enable-------------+-------------+-------------+-----------+------------+-----------+-----------+----------+--------+-------+--------- b | ALL || 0 | ALL | rest_user |0| ALL |0| 0 |false c | DATABASE || 0 | ALL | rest_user |0| ALL |0| 0 |false d | ALL || 0 | ALL | rest_user |0| ALL |0| 0 |false(3 rows)
(左滑查看完整代码)
示例2:查看指定对象类型的审计策略
> show audits on database; audit_name | target_type | target_name | target_id | operations | operators | condition | whenever | action | level | enable-------------+-------------+-------------+-----------+------------+-----------+-----------+----------+--------+-------+--------- c | DATABASE || 0 | ALL | rest_user |0| ALL |0| 0 |false(1 row)
前提条件:
用户为 admin 用户。SQL 语法:
DROPAUDIT [IFEXISTS] <audit_name>;
参数说明:
IF EXISTS: 可选关键字,设置了 IF EXISTS,如果审计策略存在,系统删除审计策略;如果审计策略不存在,系统不会删除审计策略,但不会报错。没有设置 IF EXISTS,如果审计策略存在,系统删除审计策略;如果审计策略不存在,系统报错,提示审计策略不存在。
audit_name:审计策略名称,支持同时删除多个策略,用逗号隔开。
示例:
> DROP AUDIT btest;
审计功能开启后,系统会默认将审计结果保存在审计日志文件。审计日志文件包含以下信息:
字段 | 说明 | 示例 |
---|---|---|
日志级别和日期 | 审计日志的级别和记录日期,其中日志级别为I。 | I240415 |
时间 | UTC格式的时间戳 | 06:49:34.207014 |
goroutine id | 记录该审计的goroutine id | 538 |
审计源码文件路径 | 打印日志的源码文件及代码行 | security/audit/actions/record_to_log.go:45 |
节点 | 记录审计日志的节点ID | [n1] |
日志输入计数 | 历史累计审计消息数 | 3 |
事件发生时间 | 审计事件的发生时间 | "EventTime":"2024-04-15T06:49:34.206948441Z" |
事件执行时间 | 审计事件的执行时间间隔 | "Elapsed":2242701 |
用户信息 | 用户和角色信息,包括以下字段:
| "User":{"UserID":0,"Username":"root","Roles":[{"ID":0,"Name":"admin"}]} |
事件类型 | 在对象上的操作类型,例如创建、删除等 | "Event":"CREATE" |
操作对象 | 操作对象的信息,包括以下字段:
| "Target":{"Typ":"DATABASE","Targets":{"78":{"ID":78,"Name":"db1","Cascades":null}}} |
审计级别 | 系统级:0;语句级:1;对象级:2 | "Level":1 |
客户端信息 | 客户端信息,包括以下字段:
| Client":{"AppName":"$ kwbase sql","Address":"127.0.0.1:55564"} |
事件执行结果 | 事件执行结果,包括以下字段:
| "Result":{"Status":"OK","ErrMsg":"","RowsAffected":0} |
执行语句 | 执行语句信息,包括以下字段:
| "Command":{"Cmd":"CREATE DATABASE db1","Params":"{}"} |
审计事件记录节点 | 审计事件记录节点的信息,包括以下字段:
| "Reporter":{"ClusterID":"ae93118d-28bc-492f-bd4f-852cafab0ad9","NodeID":1,"HostIP":"localhost","HostPort":"26257","HostMac":"","LastUp":0}} |
日志示例:
I240415 06:49:34.207014538 security/audit/actions/record_to_log.go:45 [n1] 3 {"EventTime":"2024-04-15T06:49:34.206948441Z","Elapsed":2242701,"User":{"UserID":0,"Username":"root","Roles":[{"ID":0,"Name":"admin"}]},"Event":"CREATE","Target":{"Typ":"DATABASE","Targets":{"78":{"ID":78,"Name":"db1","Cascades":null}}},"Level":1,"Client":{"AppName":"$ kwbase sql","Address":"127.0.0.1:55564"},"Result":{"Status":"OK","ErrMsg":"","RowsAffected":0},"Command":{"Cmd":"CREATE DATABASE db1","Params":"{}"},"Reporter":{"ClusterID":"ae93118d-28bc-492f-bd4f-852cafab0ad9","NodeID":1,"HostIP":"localhost","HostPort":"26257","HostMac":"","LastUp":0}}
(左滑查看完整代码)
如需关闭审计日志,可通过以下 SQL 语句将 audit.log.enabled 设为 false。
set cluster setting audit.log.enabled=false;
以上就是 KWDB 数据库安全与审计的上半章,我们将在下期为大家介绍 KWDB 的权限管理。欢迎关注我们!