OceanBase 安全体系解析之身份鉴别

本文作者:金长龙爱可生测试工程师,负责 DMP 产品的测试工作。

本文以MySQL为参照,详细阐述了OceanBase 在MySQL模式下的安全体系中,身份鉴别的能力,涵盖了身份鉴别机制、用户名的构成规则、密码的复杂度,以及密码过期策略的等方面。

用户鉴权

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. 一个 user 由 user_name 和 host 共同组成,这点 MySQL 和 OceanBase 是一致的;
  2. MySQL 用户名最多包含 32 个字符,而 OceanBase 限制用户名不能超过 64 个字符。

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

使用举例

用户名的组成

用户名都是 u1 但 host 不同,代表着三个不同用户。

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)

差异对比

对比项OceanBaseMySQL
安装方式自带系统变量,可以直接配置。需要先安装 validate_password组件(INSTALL COMPONENT ‘file://component_validate_password’;),然后才可以使用相关变量做密码限制>
参数个数6 个系统变量,没有变量 validate_password.dictionary_file7 个系统变量。 其中的 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 user 和 alter user 语句中使用 FAILED_LOGIN_ATTEMPTS 和 PASSWORD_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 功能基本一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/458885.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Java中的动态绑定和静态绑定

动态绑定和静态绑定是两种方法调用的绑定机制静态绑定 静态绑定也称为早期绑定,是在编译时确定调用的方法。动态绑定 动态绑定也称为晚期绑定,是在运行时确定调用的方法。静态绑定用于编译时确定的方法调用,动态绑定是Java实现运行时多态的…

CISE|暴雨受邀出席第二十六届中国国际软件博览会

10月24日至26日,备受瞩目的第二十六届中国国际软件博览会(简称CISE)在国家会展中心(天津)圆满举办。CISE不仅汇聚了来自全国各地的顶尖软件企业和机构,还吸引了众多专家学者和行业精英共襄盛举,…

Cesium基础-(Entity)-(Box)

** 里边包含Vue、React框架代码详细步骤、以及代码详细解释 ** 3、Box 盒子 以下是 BoxGeometry 类的属性、方法和静态方法,以表格形式展示: 属性 属性名类型默认值描述minimumCartesian3盒子的最小 x, y, 和 z 坐标。maximumCartesian3盒子的最大 x, y, 和 z 坐标。vertex…

【PHP】PHP使用Modbus-Rut协议与RS485串口通信,向设备发送和接收数据

目录 一、前言 二、开发前说明 三、效果图 四、安装PHP扩展 五、安装phpModbus类库 六、通信逻辑 七、完整实例 一、前言 使用PHP语言与硬件设备通信交互,并向COM串口发送和接收数据。 前面写了三篇关于PHP与RS235和USB端口通信的文章,可以作为参…

现代数字信号处理I--最佳线性无偏估计 BLUE 学习笔记

目录 1. 最佳线性无偏估计的由来 2. 简单线性模型下一维参数的BLUE 3. 一般线性模型下一维参数的BLUE 4. 一般线性模型下多维参数的BLUE 4.1 以一维情况说明Rao论文中的结论 4.2 矢量参数是MVUE的本质是矢量参数中的每个一维参数都是MVUE 4.3 一般线性模型多维参数BLUE的…

视频剪辑哪个软件好用?推荐四款热门工具!!

在这个Vlog和短视频当道的互联网时代,掌握一款好用的视频剪辑软件就像拥有了打开创作世界的魔法钥匙。今天我们来聊聊视频剪辑软件,帮你成为剪辑达人哦!接下来,给大家详细介绍四款常用且各具特色的视频剪辑软件,助你轻…

算法:利用前序序列和中序序列构造二叉树

题目 链接:leetcode链接 思路分析 前序遍历的顺序是:根 左子树 右子树 中序遍历的顺序是: 左子树 根 右子树 所以,我们可以通过前序遍历获得二叉树的根 可以通过中序遍历去分割二叉树,将二叉树分割成 左子树 根…

偷懒总结篇|贪心算法|动态规划|单调栈|图论

由于这周来不及了,先过一遍后面的思路,具体实现等下周再开始详细写。 贪心算法 这个图非常好 122.买卖股票的最佳时机 II(妙,拆分利润) 把利润分解为每天为单位的维度,需要收集每天的正利润就可以,收集正利润的区间…

HarmonyOS ArkTS与C++数据类型转换

1. HarmonyOS ArkTS与C数据类型转换 本文介绍了C与TS各自数据类型与互相之间的数据类型转换,在需要使用C模块时可以快速上手对各种数据类型进行转换。 1.1. 概述 HarmonyOS的主力开发语言是ArkTS,也提供了C语言的支持,对于一些能力&#xff…

1.3 面向对象 C++面试问题

1.3.1 简述一下什么是面向对象,面向对象与面向过程的区别 什么是面向对象 面向对象(Object-Oriented Programming,OOP)是一种编程范式,它通过将现实世界中的实体抽象为“对象”来组织代码。面向对象编程关注对象及其交互&#x…

D51【python 接口自动化学习】- python基础之模块与标准库

day51 模块的导入 学习日期:20241027 学习目标:模块与标准库 -- 66 模块的导入:如何使用其他人编写好的代码功能? 学习笔记 模块的作用 导入模块的方法 # 导入模块 # 方式一 import os # 获取当前的位置 print(os.getcwd())# …

arduino uno R3更换328pb-au芯片,烧录bootloader

使用usbasp烧录器进行烧录,解压 【免费】usbsap驱动以及软件资源-CSDN文库 安装驱动 然后打开软件 界面如下 1按步骤选中芯片, ATmega328P(由于没有328PB,直接选这个也行) 2查看spi接线, 3读取芯片id&a…

【SpringCloud】07-分布式事务与Seata

1. 分布式事务 2. Seata 3. 安装seata 配置数据库 CREATE DATABASE IF NOT EXISTS seata /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTIONN */; USE seata;------------------------------- The script used when storeM…

加强版 第一节图像二值化定义

本节课介绍了图像又彩色图像转变为彩色图像转变为灰度图像转变为黑色图像的转化过程。 灰度图像-单通道-取值范围为0-255 二值图像-单通道-取值0(黑色)-255(白色) 二值分割 有五种分割方式 如图所示 第一种:大于…

RabbitMQ 高级特性——事务

文章目录 前言事务配置事务管理器加上Transactional注解 前言 前面我们学习了 RabbitMQ 的延迟队列,通过延迟队列可以实现生产者生产的消息不是立即被消费者消费。那么这篇文章我们将来学习 RabbitMQ 的事务。 事务 RabbitMQ 是基于 AMQP 协议实现的,…

「C/C++」C/C++标准库之#include <cmath>数学库

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

认识线程 — JavaEE

目录 认识线程(Thread) 1 线程是什么? 2 为什么要有线程 3 进程和线程的区别 区别一 区别二 区别三 区别四 4. Java的线程和操作系统线程的关系 认识线程(Thread) 1 线程是什么? 一个线程就是一个 "执行流"。…

Excel-多表数据查找匹配(VLOOKUP)

💖简介 Excel的VLOOKUP函数同样可以用来查找表格中的数据。VLOOKUP(垂直查找)是一个非常有用的函数,它可以在一个表格或数据表的一列中搜索特定的值,并返回与之在同一行上的另一列中的值。 📖环境 WPS …

R语言机器学习算法实战系列(十二)线性判别分析分类算法 (Linear Discriminant Analysis)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍LDA的原理LDA的步骤教程下载数据加载R包导入数据数据预处理数据描述数据切割构建模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve保存模型总结优点:缺…

【大数据学习 | kafka】producer的参数与结构

1. producer的结构 producer:生产者 它由三个部分组成 interceptor:拦截器,能拦截到数据,处理完毕以后发送给下游,它和过滤器不同并不是丢弃数据,而是将数据处理完毕再次发送出去,这个默认是不…