账号和权限

1. 账号和权限

1.1. 身份鉴别(和mysql一样)

身份标识与鉴别功能用于对登录数据库访问数据的用户进行身份验证,确认该用户是否能够与某一个数据库用户进行关联,并根据关联的数据库用户的权限,对该用户在数据库中的数据访问活动进行安全控制。本文主要介绍 MySQL 模式的身份鉴别功能。

MySQL 模式中,一个 user 由 user_name 和 host 共同体组成。使用下列语句创建 3 个具有相同用户名的用户。(和mysql完全一样)

create user 'u1'@'%' identified by '*******';
create user 'u1'@'10.xxx.xxx.1' identified by '*******';
create user 'u1'@'10.xxx.xxx.2' identified by '*******';

% :表示允许任何客户端 IP 连接该租户。
10.xxx.xxx.1 :表示只允许 10.xxx.xxx.1 这个 IP 连接该租户。
10.xxx.xxx.2 :表示只允许 10.xxx.xxx.2 这个 IP 连接该租户。


eg:
CREATE USER test@'%' IDENTIFIED BY 'test';
grant all PRIVILEGES on test.* to test@'%';
--- flush PRIVILEGES;  ob中不用刷新权限

1.2. 密码复杂度(和mysql一样)

为了防止恶意的密码攻击,OceanBase 数据库用户可以根据需要设置密码的复杂度函数,验证用户登录身份,来提升数据库的安全性。本文介绍如何设置 OceanBase 数据库登录用户的密码复杂度。

1.2.1. 相关变量介绍

OceanBase 数据库 MySQL 模式下,用户可以通过设置一系列系统变量规定密码复杂度规则,这些配置是租户级的。创建用户或修改用户的密码时会根据系统变量的配置对密码进行校验,未通过校验则会报错。涉及的系统变量如下表所示:
账号密码

1.2.2. 设置密码的复杂度

生产环境建议设置密码长度为 20 位,包括数字、大写字母、小写字母以及特殊字符。密码的复杂度越低,其被破解的可能性就越大,比如包含用户名、使用重复字符等。出于安全性考虑,需确保用户的密码具有较高的复杂度。

本节以设置密码复杂度规则为最小长度为 8 个字符,至少包含 3 个大写字母、3 个小写字母和 1 个特殊字符、用户密码不可以与用户名相同并且检查策略为 medium 为例,提供设置密码复杂度的操作指导。
1.使用 root 用户登录集群的 MySQL 租户。

obclient -uroot@mysql -P2881 -h10.xxx.xxx.1 -p*******

2.通过系统变量设置密码的复杂度。

obclient> SET GLOBAL validate_password_check_user_name=on;
obclient> SET GLOBAL validate_password_length=8;
obclient> SET GLOBAL validate_password_mixed_case_count=3;
obclient> SET GLOBAL validate_password_special_char_count=1;
obclient> SET GLOBAL validate_password_policy='medium';

3.退出后重新登录,确认变量是否生效。

obclient> SHOW VARIABLES LIKE 'validate%';
+--------------------------------------+--------+
+--------------------------------------+--------+
| VARIABLE_NAME                        | VALUE  |
+--------------------------------------+--------+
| validate_password_check_user_name    | off     |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 3      |
| validate_password_number_count       | 0      |
| validate_password_policy             | medium |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+
6 rows in set (0.00 sec)

4.验证密码复杂度。

创建两个用户,分别设置为符合要求的密码和不符合要求的密码。

obclient> CREATE USER sectest1 IDENTIFIED BY '******';
ERROR 1819 (HY000): Your password does not satisfy the current policy
requirements

obclient> CREATE USER sectest1 IDENTIFIED BY '***1_%';
Query OK, 0 rows affected

如果设置的密码复杂度不符合要求,则用户创建失败。

1.3. 登录失败处理

对于多次登录失败的用户,OceanBase 数据库会锁定该用户,以便防止恶意的密码攻击,从而保护数据库,提升数据库的安全性
OceanBase 数据库的 MySQL 模式通过租户级配置项 connection_control_failed_connections_threshold 来控制用户错误登录尝试的阈值,当用户连续错误登录次数超过该配置项定义的值之后,系统会对账户进行锁定。

connection_control_failed_connections_threshold 配置项用于指定用户错误登录尝试的阈值,默认值为 0,取值范围为 [0,2147483647]。 其中:

配置示例
1.使用 root 用户登录到集群的 MySQL 租户。

obclient -uroot@mysql -h127.1 -P2881 -p********

2.执行以下语句,设置用户的错误登录次数为 5 次。指定了超过错误登录次数之后,错误登录锁定的最小时长为 60000 毫秒,错误登录锁定的最大时长为 360000 毫秒。

示例如下:

obclient> ALTER SYSTEM SET connection_control_failed_connections_threshold=5;
obclient> ALTER SYSTEM SET connection_control_min_connection_delay=60000;
obclient> ALTER SYSTEM SET connection_control_max_connection_delay=360000;

配置项相关的详细设置及说明请参见 修改集群参数。

3.创建登录用户。

obclient> CREATE USER 'test' IDENTIFIED BY '*******';
Query OK, 0 rows affected (0.04 sec)

验证登录失败处理策略是否生效。 当连续输入 5 次错误密码时,用户会被锁定。

obclient -h127.1 -P2881 -utest@mysql -p*******;
obclient: [Warning] Using a password on the command line interface can be insecure.
ERROR 5039 (01007): User locked

4.使用 root 用户登录到数据库的 MySQL 租户,查看失败登录信息。

obclient> SELECT * FROM information_schema.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
+-------------+-----------------+
| USERHOST    | FAILED_ATTEMPTS |
+-------------+-----------------+
| 'test'@'%' |               5 |
+-------------+-----------------+
1 row in set (0.005 sec)

5.执行以下 SQL 语句,解锁用户。

注意
解锁用户的操作一般由管理员完成,普通用户如果需要执行锁定和解锁操作,必须具备全局的 ALTER USER 权限。关于查看用户权限和授权的相关操作,参见 查看用户权限 和 修改用户权限。(语法和mysql 一致)

   obclient> ALTER USER test ACCOUNT UNLOCK;
   Query OK, 0 rows affected (0.03 sec)

1.4. 网络安全访问控制(白名单)

OceanBase 数据库提供白名单策略,实现网络安全访问控制。您可以通过租户白名单功能来设置允许哪些客户端访问当前租户。

租户白名单通过系统变量 ob_tcp_invited_nodes 控制,是租户全局的白名单限制参数。默认值为 127.0.0.1,::1,表示仅允许本机的 IP 连接该租户。 该变量支持列表形式取值,列表值之间使用英文逗号(,)分隔,例如:A,B,C,D。用户登录时,OBServer 会将用户的 IP 地址依次和 A、B、C、D 进行匹配校验。如果全部不匹配,则拒绝访问。只要有任意一个匹配成功,则表示通过白名单。

列表值支持以下赋值:
  -- IP 地址,例如:192.168.1.1。匹配时采用等值匹配,即用户 Client IP 等于该 IP 值时,才算匹配。
  -- 包含百分号(%)或下划线(_)的 IP 地址,例如:192.168.1.% 或 192.168.1._。匹配时采用模糊匹配,即类似 LIKE 语法。
  -- IP/NETMASK 地址,例如:192.168.1.0/24 或者 192.168.1.0/255.255.255.0。匹配时采用掩码匹配,只有满足 Client_IP & NetMask == IP 才算匹配成功,类似于 MySQL 的掩码匹配。

说明:
修改租户白名单不会影响已创建的 session。

1.4.1. 查看和设置租户白名单(租户级)

使用 root 用户登录集群的 sys 租户。

obclient -uroot@sys -P2881 -h10.xxx.xxx.1 -p*******

执行以下语句,查看租户的白名单。

obclient> SHOW VARIABLES LIKE 'ob_tcp_invited_nodes';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| ob_tcp_invited_nodes | %     |
+----------------------+-------+

其中,值为 % 表示允许任何客户端 IP 连接该租户。
如果需要更改白名单设置,可以执行以下语句,重新设置租户的白名单。

示例如下:

obclient> SET GLOBAL ob_tcp_invited_nodes='%';
obclient> SET GLOBAL ob_tcp_invited_nodes='10.10.10.%';
SET GLOBAL ob_tcp_invited_nodes='192.168.%,172.0.0.1';

如果租户的白名单设置中不包含使用的ip ,报错如下:
1227- Access denied
不会告知详细的错误原因:

1.5. 行级访问权限控制

OceanBase 数据库兼容了 Oracle 的 Label Security 功能,可以在行级别对访问进行控制,保证读写数据的安全。
基于 Label Security 可以构建对行级数据细粒度访问控制的安全策略。在创建策略后,将该策略应用于需要保护的表,并将标签授予用户。

Label Security 是强制访问控制的一种方式,通过在表中添加一个 Label 列来记录每行的 Label 值,在访问时通过比较用户的 Label 和数据的 Label,达到约束主体(用户)对客体(表中的数据)访问的目的。

OceanBase 数据库提供了内置的安全管理员 LBACSYS 来管理和使用该功能,安全管理员可以通过创建安全策略、定义策略中的 Label、设置用户的 Label,来定制自己的安全策略。一个安全策略可以应用到多张表上,一张表也可以应用多个安全策略。每当一个安全策略被应用,这张表上自动会添加一列,用于该安全策略的访问控制。

使用限制
目前仅 Oracle 模式支持 Label Security。
详情见官网:https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000507849

1.6. RPC 连接认证

功能简介
该功能旨在提升 RPC 通信的安全性。开启 RPC 连接认证后,只有通过认证的客户端才能与 OBServer 节点建立 RPC 连接,这一措施能够有效拦截攻击者的恶意 RPC 报文,防止其被 OBServer 节点执行,从而增强了 OceanBase 数据库的安全防护能力。

在升级兼容性方面,本方案支持灰度升级流程,可以分段平滑升级,不影响业务进程。在升级过程中,高版本与低版本的 OBServer 节点是相互兼容的。即高版本作为客户端能够连接低版本服务端,同时低版本作为客户端也能够连接高版本服务端。升级后,默认情况下不开启 RPC 连接认证,需要手动开启。

限制条件
OceanBase 数据库 V4.2.0 版本的 RPC 连接认证的功能,只有在启用 pkt-nio 网络框架后才能使用,即在开启 RPC 连接认证之前需要保证 _enable_pkt_nio 配置项设置为 True。

  • _enable_pkt_nio 用于控制 RPC 网络框架 pkt-nio 的启用和关闭,默认值为 True。

1.6.1. 使用示例

1.6.1.1. 开启认证

目前 OBServer 节点提供基于 SSL 握手的 RPC 连接认证,开启方式如下。

1.6.1.2. 准备 SSL 证书

需要在安装目录下创建 wallet 文件夹并将证书和私钥文件放入该文件夹。证书和私钥文件包括根证书(ca.pem)、证书(server-cert.pem)、私钥(server-key.pem)三个文件

默认安装目录路径:/home/admin/oceanbase。
wallet 文件夹及文件夹下的文件名不能更改。
若拥有多台服务器,则每台服务器的安装目录下都需创建 wallet 文件夹,并在该文件夹中放入证书和私钥。
请确保所需的证书文件就绪后再开启认证,否则,会导致认证失败,进而服务不可用。

1.6.2. 执行开启命令

以 sys 租户身份登录 OceanBase 数据库,依次执行如下命令。
1.选择 SSL 协议的版本号。目前支持的 SSL 协议的版本号包括 TLSv1、TLSv1.1、TLSv1.2 和 TLSv1.3,当指定版本号后,支持指定的版本号及其以上的版本协议。有关开启 SSL 连接的更多信息,请参见 sql_protocol_min_tls_version。

ALTER SYSTEM SET sql_protocol_min_tls_version = 'TLSv1.1';


属性	        描述
参数类型	    STRING
默认值	    none
取值范围	
             none:不对连接使用的 SSL/TLS 版本号进行限制
             TLSv1 / TLSv1.1 / TLSv1.2 / TLSv1.3:当指定 TLSv1 / TLSv1.1 / TLSv1.2 / TLSv1.3 中的任意一个版本号时,如果连接选择使用 SSL 加密,则会使用指定的版本号及其以上的版本协议
是否重启 OBServer 节点生效	否

2.开启 SSL 连接。有关开启 SSL 连接的更多信息,请参见 ssl_client_authentication。

ALTER SYSTEM SET ssl_client_authentication=True;

3.将客户端的认证方式设置为 SSL_NO_ENCRYPT。有关客户端认证的详细信息,请参见 rpc_client_authentication_method。

ALTER SYSTEM SET rpc_client_authentication_method = 'SSL_NO_ENCRYPT';

4.将服务端的认证方式设置为 SSL_NO_ENCRYPT。有关服务端认证的详细信息,请参见 rpc_server_authentication_method。

ALTER SYSTEM SET rpc_server_authentication_method = 'SSL_NO_ENCRYPT';

注意:
虽然将服务端认证方式设置为 ALL(即 ALTER SYSTEM SET rpc_server_authentication_method = 'ALL'; )也可以开启认证,但这也意味着服务端允许客户端不进行认证直接连接,存在较大的安全风险。因此,在生产环境下不建议采用这种方式。

1.6.3. 关闭认证

将客户端的认证方式设置为 NONE。
1.将客户端的认证方式设置为 NONE。

ALTER SYSTEM SET rpc_client_authentication_method = 'NONE';

2.将服务端的认证方式设置为 NONE 或 ALL。

ALTER SYSTEM SET rpc_server_authentication_method = 'NONE';
--或者
ALTER SYSTEM SET rpc_server_authentication_method = 'ALL';

1.6.4. 注意事项

如果后续需要更改认证方式,只需重新修改设置。
开启认证后,只对新建的 RPC 连接起作用,已有的连接不受影响。若想要对已连接的客户端进行认证,需要分批重启节点。

posted @ 2026-05-11 14:50  数据库小白(专注)  阅读(14)  评论(0)    收藏  举报