前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >技术分享 | OceanBase 安全审计之身份鉴别

技术分享 | OceanBase 安全审计之身份鉴别

作者头像
爱可生开源社区
发布2023-08-18 19:45:39
3060
发布2023-08-18 19:45:39
举报

作者:金长龙

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

本文来源:原创投稿

* 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


本文以 MySQL 作为参考,介绍了 OceanBase(MySQL 模式)安全体系中关于身份鉴别的相关功能,包括身份鉴别机制、用户名组成、密码复杂度、密码过期策略等。

1用户鉴权

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

2用户命名

用户命名规则

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

下面我们看两个命名规则的例子。

使用举例

用户名的组成

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

代码语言:javascript
复制
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

注意:这里的提示语部分有误,后续版本修复。

3密码强度评定

为了防止恶意的密码攻击,OceanBase 和 MySQL 都提供设置密码复杂度的相关功能,以此来提升数据库的安全性。OceanBase 和 MySQL 分别通过如下的一系列变量限制密码的复杂度规则。

代码语言:javascript
复制
# 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 策略的基础上增加了字典文件的检查。

两种数据库的参数默认值大部分都不同,使用中需要注意。

4密码过期策略

主要包括手动设置密码过期和设置全局的密码过期策略。

MySQL

支持手动设置用户密码过期。

代码语言:javascript
复制
# 手动设置密码过期
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

目前暂不支持。

5登录失败处理

对于多次登录失败的用户,数据库会锁定该用户,以便防止恶意的密码攻击,从而保护数据库,提升数据库的安全性。

OceanBase

OceanBase 设计了几个租户级的参数,用来控制用户连续错误登录的次数以及账户的锁定时间。主要是以下三个参数,可以通过命令查询(SHOW PARAMETERS LIKE "connection_control_%";)。

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

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

代码语言:javascript
复制
[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)

另外也截了一段登录成功时的日志。

代码语言:javascript
复制
[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 可以通过安装插件 connection_control.so 来实现用户连续错误登录的控制,具体有如下三个变量:

代码语言:javascript
复制
mysql [localhost:8031] {msandbox} ((none)) > SHOW VARIABLES LIKE "connection_control_%";
+-------------------------------------------------+------------+
| Variable_name                                   | Value      |
+-------------------------------------------------+------------+
| connection_control_failed_connections_threshold | 3          |
| connection_control_max_connection_delay         | 2147483647 |
| connection_control_min_connection_delay         | 1000       |
+-------------------------------------------------+------------+
3 rows in set (0.05 sec)

另外,从 MySQL 8.0.19 开始,可以在 create useralter user 语句中使用 FAILED_LOGIN_ATTEMPTSPASSWORD_LOCK_TIME 选项为每个帐户配置所需的登录失败次数和锁定时间。

  • FAILED_LOGIN_ATTEMPTS:指定连续错误密码的次数
  • PASSWORD_LOCK_TIME:达到错误登录次数之后的锁定时长(单位天)

使用举例

代码语言:javascript
复制
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;

6小结

OceanBase (MySQL 模式)在安全审计的身份鉴别方面与 MySQL 功能基本一致。

下期预告

安全审计之访问控制。

本文关键字:#OceanBase# #MySQL# #安全审计#

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爱可生开源社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1用户鉴权
    • OceanBase 的身份鉴别机制
    • 2用户命名
      • 用户命名规则
        • 使用举例
          • 用户名的组成
          • 长度限制
      • 3密码强度评定
        • 差异对比
        • 4密码过期策略
          • MySQL
            • OceanBase
            • 5登录失败处理
              • OceanBase
                • MySQL
                  • 使用举例
              • 6小结
                • 下期预告
                相关产品与服务
                云数据库 MySQL
                腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档