关于数据库:OceanBase-安全审计之身份鉴别

1次阅读

共计 4954 个字符,预计需要花费 13 分钟才能阅读完成。

本文次要以 MySQL 和 OceanBase 比照的形式,来介绍 OceanBase(MySQL 模式)平安体系中对于身份甄别的相干内容,包含身份甄别机制、用户名组成、明码复杂度、明码过期策略等。

作者:金长龙

爱可生测试工程师,负责 DMP 产品的测试工作。

用户鉴权

OceanBase 下的身份甄别机制

OceanBase 数据库目前只反对明码验证形式,应用的是 MySQL Authentication Protocol(MAPI)协定 进行用户鉴权。该协定基于客户端机器上的 MySQL 客户端帐户实现身份验证,要求客户端具备正确的用户名和明码能力连贯到 OceanBase 服务器。上面是身份鉴权的具体过程:

  1. 客户端发动连贯申请到 OceanBase 服务器
  2. OceanBase 服务器发送随机字符串 (Nonce) 给客户端
  3. 客户端应用发送来的随机字符串以及正确的用户名和明码,进行哈希加密计算
  4. 客户端将加密后的 Token 发送回 OceanBase 服务器
  5. OceanBase 服务器验证客户端发送的解码后果是否正确
  6. 如果解码后果正确,OceanBase 服务器容许客户端连贯服务器;否则回绝连贯申请

留神:
OceanBase 数据库以后反对的 MySQL 客户端版本为 5.5、5.6 和 5.7。当应用 MySQL 8.0 客户端连贯 OceanBase 时,须要在连贯命令上加 –default_auth=mysql_native_pasowrd。起因是 MySQL 5.6、MySQL 5.7 的默认加密算法是 mysql_native_password,而 MySQL 8.0 的默认加密算法是 caching_sha2_password

用户命名

用户命名规定

  1. 一个 useruser_namehost 独特组成,这点 MySQL 和 OceanBase 是统一的;
  2. MySQL 用户名不能超过 32 个字符,OceanBase 用户名不能超过 64 个字符。

上面咱们看两个命名规定的例子。

应用举例

用户名的组成

用户名都是 u1host 不同,代表着三个不同用户。

create user 'u1'@'%' identified by '123456';
create user 'u1'@'localhost' identified by '123456';
create user 'u1'@'127.0.0.1' identified by '123456';

通过 current_user() 函数查问以后登录用户,能够看到用户标识为 user_name@host

长度限度

创立用户时,用户名长度超出限度,MySQL 和 OceanBase 的报错统一,提醒 too long for user name

MySQL

OceanBase

留神:这里的提醒语局部有误,后续版本修复。

明码强度评定

为了避免歹意的明码攻打,OceanBase 和 MySQL 都提供设置明码复杂度的相干性能,以此来晋升数据库的安全性。OceanBase 和 MySQL 别离通过如下的一系列变量限度明码的复杂度规定。

# OceanBase 4.1
obclient [oceanbase]> SHOW VARIABLES LIKE "validate_password%";
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password_check_user_name    | on    |
| validate_password_length             | 0     |
| validate_password_mixed_case_count   | 0     |
| validate_password_number_count       | 0     |
| validate_password_policy             | low   |
| validate_password_special_char_count | 0     |
+--------------------------------------+-------+
6 rows in set (0.003 sec)
  
# MySQL 8.x
mysql [localhost:8031] {msandbox} ((none)) > SHOW VARIABLES LIKE "validate_password%";
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.00 sec)

差别比照

比照项 OceanBase MySQL
装置形式 自带零碎变量,能够间接配置。 须要先装置 validate_password 组件(INSTALL COMPONENT ‘file://component_validate_password’;),而后才能够应用相干变量做明码限度 >
参数个数 6 个零碎变量,没有变量 validate_password.dictionary_file 7 个零碎变量。其中的 validate_password.dictionary_file 变量仅在 validate_password.policy=STRONG 时才会失效(目前 oceanbase 不反对 STRONG 策略)。
validate_password.policy 变量值 反对配置 LOW、MEDIUM 两种明码查看策略 反对配置 LOW, MEDIUM, STRONG 三种明码查看策略;其中 STRONG 就是在 MEDIUM 策略的根底上减少了字典文件的查看。

两种数据库的参数默认值大部分都不同,应用中须要留神。

明码过期策略

次要包含手动设置明码过期和设置全局的明码过期策略。

MySQL

反对手动设置用户明码过期。

# 手动设置明码过期
mysql [localhost:8031] {msandbox} ((none)) > alter user 'jeffrey'@'%' PASSWORD EXPIRE;
Query OK, 0 rows affected (0.04 sec)

# 明码过期后执行语句受限
mysql [localhost:8031] {jeffrey} ((none)) > show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

反对设置全局的明码过期策略:能够应用 default_password_lifetime 零碎变量。

OceanBase

目前暂不反对。

登录失败解决

对于屡次登录失败的用户,数据库会锁定该用户,以便避免歹意的明码攻打,从而爱护数据库,晋升数据库的安全性。

OceanBase

OceanBase 设计了几个租户级的参数,用来管制用户间断谬误登录的次数以及账户的锁定工夫。这是 OceanBase 特有而 MySQL 没有的。次要是以下三个参数,能够通过命令查问(SHOW PARAMETERS LIKE "connection_control_%";)。

  • connection_control_failed_connections_threshold:指定用户间断谬误登录的次数
  • connection_control_min_connection_delay:达到谬误登录次数之后锁定用户的最小时长
  • connection_control_max_connection_delay:达到谬误登录次数之后锁定用户的最大时长

在每次登录失败时,OBServer 日志都会有相应的记录。

[root@31aa8013555f log]# grep "denied" observer.log
[2023-05-04 09:32:18.689329] WDIAG [SERVER] load_privilege_info (obmp_connect.cpp:553) [782][MysqlQueueTh5][T1][Y0-0005FA34D4B800AC-0-0] [lt=11][errcode=-4043] User access denied(login_info={tenant_name:"sys", user_name:"root", client_ip:"127.0.0.1", db:"oceanbase", scramble_str:"?sE@PP"WqS*v7KUJQ8cj"}, ret=-4043)

另外也截了一段登录胜利时的日志。

[2023-05-23 09:07:52.658015] INFO [SERVER] process (obmp_connect.cpp:369) [12383][MysqlQueueTh1][T1][Y0-0005FBC67C77F146-0-0] [lt=9] MySQL LOGIN(direct_client_ip="127.0.0.1", client_ip=127.0.0.1, tenant_name=sys, tenant_id=1, user_name=u1, host_name=%, sessid=3221576719, proxy_sessid=0, sess_create_time=0, from_proxy=false, from_java_client=false, from_oci_client=true, from_jdbc_client=false, capability=150974085, proxy_capability=49408, use_ssl=true, c/s protocol="OB_2_0_CS_TYPE", autocommit=true, proc_ret=0, ret=0)

MySQL

从 MySQL 8.0.19 开始,能够在 create useralter user 语句中应用 FAILED_LOGIN_ATTEMPTSPASSWORD_LOCK_TIME 选项为每个帐户配置所需的登录失败次数和锁定工夫。

  • FAILED_LOGIN_ATTEMPTS:指定间断谬误明码的次数
  • PASSWORD_LOCK_TIME:达到谬误登录次数之后的锁定时长(单位天)

应用举例

CREATE USER 'u1'@'localhost' IDENTIFIED BY 'password'
  FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 3;
 
ALTER USER 'u2'@'localhost'
  FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME UNBOUNDED;

小结

OceanBase(MySQL 模式)在平安审计的身份甄别方面与 MySQL 性能基本一致。

对于 SQLE

爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,反对多场景审核,反对标准化上线流程,原生反对 MySQL 审核且数据库类型可扩大的 SQL 审核工具。

SQLE 获取

类型 地址
版本库 https://github.com/actiontech/sqle
文档 https://actiontech.github.io/sqle-docs/
公布信息 https://github.com/actiontech/sqle/releases
数据审核插件开发文档 https://actiontech.github.io/sqle-docs-cn/3.modules/3.7_audit…
正文完
 0