身份认证与鉴别
概述
身份认证与鉴别是 KaiwuDB 安全体系的关键组件之一,用于验证客户端的身份,并基于认证结果决定是否允许访问数据库。KaiwuDB 采用基于主机的身份认证(Host-Based Authentication, 简称 HBA)机制,支持灵活的认证策略配置,能够满足不同网络环境与安全等级的需求。
认证规则匹配机制
KaiwuDB 通过集群参数 server.host_based_authentication.configuration
定义一条或多条主机认证规则,每条规则指定连接的访问控制条件。系统收到客户端连接请求后,从上到下依序匹配规则,一旦匹配成功,即按该规则进行身份验证和访问控制。
规则格式及字段说明
每条 HBA 规则由以下六个字段组成,字段之间以空格分隔:
<type> <database> <user> <period> <address> <method>
字段位置 | 字段名称 | 描述 |
---|---|---|
1 | type | 指定连接类型。支持以下参数设置: - local :Unix 域套接字连接- host :TCP/IP 连接(含 SSL/非 SSL)- hostssl :仅 SSL 加密的 TCP/IP 连接- hostnossl :仅非 SSL 的 TCP/IP 连接 |
2 | database | 目前只支持设置为 all 以匹配所有数据库。 |
3 | user | 用户名,可设置为 all 匹配所有用户。 |
4 | period | 允许或拒绝连接的时间范围,支持精细化的周期表达式,详见时间段匹配规则。设置为 all 时表示不限时间。 |
5 | address | 指定规则允许或阻止的 IP 地址范围,支持以下格式: - all :表示所有 IP 地址 - 单个 IP 地址:如 192.168.1.100 - 包含掩码的 IP 地址:如 192.168.1.0/24 - 不带掩码的 IP 地址 + IP 掩码:如 192.168.1.0 255.255.255.0 |
6 | method | 身份认证方式,控制用户如何通过认证。详见支持的认证方式。 |
时间段匹配规则
KaiwuDB 支持按周期定义的时间段控制,即仅在指定时间范围内允许或拒绝客户端连接。该机制支持以下周期粒度:
yearly
:按年周期,如每年 3 月 1 日至 11 月 30 日monthly
:按月周期,如每月 1 日至 15 日weekly
:按周周期,如每周一中午到周三傍晚daily
:按日周期,如每天中午至下午或跨天时间段
跨周期时间段支持
所有周期粒度均支持跨周期时间段定义,例如 yearly 11-30 23:00:00 - 03-01 12:00:00
表示每年 11 月 30 日 23:00 至次年 3 月 1 日 12:00。
多时间段定义
系统支持在单条规则中指定多个时间段,时间段之间使用逗号分隔,例如 daily 09:00:00 - 12:00:00,daily 14:00:00 - 18:00:00
。系统会根据当前时间匹配时间段,满足任一时间段即视为匹配成功。
时间段格式示例
示例 | 含义 |
---|---|
yearly 03-01 12:00:00 - 11-30 23:00:00 | 每年 3 月 1 日 12:00 至 11 月 30 日 23:00 |
weekly Monday 12:00:00 - Wednesday 18:00:00 | 每周一中午至周三晚上 |
monthly 01 12:00:00 - 15 18:00:00 | 每月 1 日中午至 15 日 18:00 |
daily 12:00:00 - 18:00:00 | 每日中午至 18:00 |
daily 18:00:00 - 02:00:00 | 每日 18:00 至次日凌晨 2:00 |
支持的认证方式
方法名称 | 描述 | 特性 | 是否需要 SSL |
---|---|---|---|
cert | 基于客户端证书进行身份验证 | 高安全性、不可伪造 | 是 |
cert+password | 同时要求证书和密码验证(双因子) | 最高安全级别 | 是 |
cert-password | (默认设置)可选择使用证书或密码验证 | 灵活、兼顾迁移场景 | 是 |
password | 基于用户名密码验证 | 常见方式、便于管理 | 是 |
trust | 允许满足匹配规则的连接 | 开发测试方便,安全性低 | 否 |
reject | 拒绝满足匹配规则的连接 | 精确控制访问黑名单 | 否 |
说明
使用密码认证时,由于密码以明文形式从客户端发送到服务器端,为确保密码安全,需要使用 SSL 加密连接。客户端工具提示输入用户密码时不会回显输入的密码。
配置示例
本节提供 KaiwuDB 常见身份认证方式的配置示例,展示如何配置不同的认证方式并使用 kwbase
CLI 工具连接数据库。
说明
以下示例假设已采用 TLS 安全模式部署并启动 KaiwuDB 数据库。
基于密码的身份认证
非三权分立模式
root
用户登录数据库。root
用户创建用户并为用户设置密码。以下示例创建
user1
用户,并为user1
用户设置密码。CREATE USER user1 WITH PASSWORD '11aa!!AA';
root
用户配置基于密码的认证参数。以下示例允许
user1
用户在任意时间段使用密码登录数据库。SET CLUSTER SETTING server.host_based_authentication.configuration = "host all user1 all all password";
user1
用户连接数据库。./kwbase sql --url "postgresql://user1:KaiwuDB_u1@localhost:26257/defaultdb" -u user1; -- 按照提示 Enter password: ,输入正确的密码,回车即可连接成功。
三权分立模式
secroot
用户登录数据库。secroot
用户授予sysroot
用户创建角色的权限。ALTER USER sysroot WITH CREATEROLE;
secroot
用户配置基于密码的认证参数。以下示例允许
user1
用户在每年 3 月 1 日 09:00 至 3 月 31 日 18:00 期间使用密码登录数据库。SET CLUSTER SETTING server.host_based_authentication.configuration = "host all user1 'yearly 03-01 09:00:00 - 03-31 18:00:00' all password";
secroot
用户退出数据库。sysroot
用户登录数据库。sysroot
用户创建用户并为用户设置密码。以下示例创建
user1
用户,并为user1
用户设置密码。CREATE USER user1 WITH PASSWORD '11aa!!AA';
user1
用户在允许的时间段内连接数据库。./kwbase sql --url "postgresql://user1:KaiwuDB_u1@localhost:26257/defaultdb" -u user1; -- 按照提示 Enter password: ,输入正确的密码,回车即可连接成功。
基于证书的身份认证
非三权分立模式
root
用户登录数据库。root
用户创建用户。以下示例创建
user2
用户。CREATE USER user2;
root
用户配置认证参数。以下示例允许
user2
用户在每周周一 09:00 至周五 18:00 期间使用证书登录数据库。SET CLUSTER SETTING server.host_based_authentication.configuration = "host all user2 'weekly Monday 09:00:00 - Friday 18:00:00' all cert";
root
用户为用户生成证书。./kwbase cert create-client user2 --certs-dir=certs --ca-key=certs/ca.key
user2
用户在允许的时间段内连接数据库。./kwbase sql --url "postgresql://user2:KaiwuDB_u2@localhost:26257/defaultdb?sslmode=require&sslrootcert=certs/ca.crt&sslcert=certs/client.user2.crt&sslkey=certs/client.user2.key"
三权分立模式
secroot
用户登录数据库。secroot
用户授予sysroot
用户创建角色的权限。ALTER USER sysroot WITH CREATEROLE;
secroot
用户配置认证参数。以下示例允许
user2
用户每天 09:00 至 18:00 期间使用证书登录数据库。SET CLUSTER SETTING server.host_based_authentication.configuration = "host all user2 'daily 09:00:00 - 18:00:00' all cert";
secroot
用户退出数据库。sysroot
用户登录数据库。sysroot
用户创建用户。以下示例创建
user2
用户。CREATE USER user2;
sysroot
用户为用户生成证书。./kwbase cert create-client user2 --certs-dir=certs --ca-key=certs/ca.key
user2
用户在允许的时间段内连接数据库。./kwbase sql --url "postgresql://user2:KaiwuDB_u2@localhost:26257/defaultdb?sslmode=require&sslrootcert=certs/ca.crt&sslcert=certs/client.user2.crt&sslkey=certs/client.user2.key"
双因子身份认证
非三权分立模式
root
用户登录数据库。root
用户创建用户并为用户设置密码。以下示例创建
user3
用户并为user3
用户设置密码。CREATE USER user3 WITH PASSWORD '22bb!!BB';
root
用户配置认证参数。以下示例允许
user3
用户每天 18:00 至次日 2:00 期间使用密码和证书登录数据库。SET CLUSTER SETTING server.host_based_authentication.configuration = "host all user3 'daily 18:00:00 - 02:00:00' all cert+password";
root
用户为用户生成证书。./kwbase cert create-client user3 --certs-dir=certs --ca-key=certs/ca.key;
user3
用户在允许的时间段内连接数据库。./kwbase sql --url "postgresql://user3:KaiwuDB_u3@localhost:26257/defaultdb?sslmode=require&sslrootcert=certs/ca.crt&sslcert=certs/client.user3.crt&sslkey=certs/client.user3.key"; -- 按照提示 Enter password: ,输入正确的密码,回车即可连接成功。
三权分立模式
secroot
用户登录数据库。secroot
用户授予sysroot
用户创建角色的权限。ALTER USER sysroot WITH CREATEROLE;
secroot
用户配置认证参数。以下示例允许
user3
用户每天 18:00 至次日 2:00 期间使用密码和证书登录数据库。SET CLUSTER SETTING server.host_based_authentication.configuration = "host all user3 'daily 18:00:00 - 02:00:00' all cert+password";
secroot
用户退出数据库。sysroot
用户登录数据库。sysroot
用户创建用户并为用户设置密码。以下示例创建
user3
用户并为user3
用户设置密码。CREATE USER user3 WITH PASSWORD '22bb!!BB';
sysroot
用户为用户生成证书。./kwbase cert create-client user3 --certs-dir=certs --ca-key=certs/ca.key;
user3
用户在允许的时间段内连接数据库。./kwbase sql --url "postgresql://user3:KaiwuDB_u3@localhost:26257/defaultdb?sslmode=require&sslrootcert=certs/ca.crt&sslcert=certs/client.user3.crt&sslkey=certs/client.user3.key"; -- 按照提示 Enter password: ,输入正确的密码,回车即可连接成功。