OceanBase 安全审计之身份鉴别

本文主要以 MySQL 和 OceanBase 对比的方式,来介绍 OceanBase(MySQL 模式)安全体系中关于身份鉴别的相关内容,包括身份鉴别机制、用户名组成、密码复杂度、密码过期策略等。

作者:金长龙

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

用户鉴权

MySQL 常见的身份鉴别方式

鉴别方式说明
密码验证
Password Authentication
这是最常用的身份鉴别方式。用户在登录时提供用户名和密码,MySQL 将密码与数据库中存储的加密密码进行比对。
插件鉴别
Plugin Authentication
MySQL 还支持使用插件进行身份鉴别。这些插件可以实现不同的鉴别机制,如基于 SSL 证书的鉴别、Kerberos 鉴别等。
数据库鉴别
Native Authentication
在 MySQL 8.0 之后引入了基于插件的本地身份鉴别方式。用户的密码信息存储在 MySQL 的系统表中,而不再是之前的存储在 mysql.user 表中。
外部鉴别
External Authentication
MySQL 还支持通过外部身份鉴别机制进行登录,如基于操作系统账户的鉴别、LDAP 鉴别。

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)

差异对比

对比项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 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 5.7 的逻辑一致,支持密码复杂度设置、登录失败处理等功能,暂不支持密码过期策略。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux环境变量配合权限维持手法

前言: 权限维持的时候有其中有两种,一种是alias别名、第二种是prompt_command,这里我们可以将其添加到环境变量中,每次运行的时候都可以使用,从而达到权限控制的效果,而不是临时执行的效果。 环境变量&am…

(一)初识 Kafka

文章目录 1.发布与订阅消息系统(1)什么是发布与订阅消息系统(2)为什么 Kafka 是数据驱动型应用程序的关键组件 2. Kafka 介绍(1)消息和批次(2)消息模式(3)主题…

【Python】Python进阶系列教程--Python AI 绘画(二十)

文章目录 前言Windows 环境安装Civitai 介绍 前言 往期回顾: Python进阶系列教程-- Python3 正则表达式(一)Python进阶系列教程-- Python3 CGI编程(二)Python进阶系列教程-- Python3 MySQL - mysql-connector 驱动&a…

Java程序员面试1000问,让你开挂的面试宝典,花点耐心看完offer拿到手软

前言: 本文收集整理了各大厂常见面试题N道,你想要的这里都有内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈,希望大家都能找到适…

全量程真空压力综合测量系统的高精度控制解决方案

摘要:针对工作范围在5~1.3Pa,控制精度在0.1%~0.5%读数的全量程真空压力综合测量系统技术要求,本文提出了稳压室真空压力精密控制的技术方案。为保证控制精度,基于动态平衡法,技术方案在高真空、低真空和正压三个区间内…

分布式Profinet IO模块

PROFINET IO模块是一种用于工业自动化控制系统中的设备控制模块。它使用以太网技术,在现场设备和处理器/控制器之间提供快速、精确和可靠的数据交换。PROFINET IO模块通常是面向过程的,可以用于监测和控制工业过程中的各种设备和参数,如传感器…

MiniConda、CUDA、CUDnn以及pytorch环境的配置以及坑

文章目录 一、MiniConda安装、介绍1.1 Conda是什么?1.2 MiniConda是什么?1.3 安装方法1.4 Conda常用命令1.4.1 如何导出库列表1.5 杂项 二、CUDA 以及 CUDnn三、Pytorch安装总结 首先需要说明一下,我想安装的是Pytorch GPU版,所以…

C#编写VBScript的Com组件

背景 前段时间学习了一下vbsript,做了马踏棋盘的广度搜索算法题,线性回归的深度学习算法题,虽然是做出来了,但是总感觉不太方便,很多细节都需要自己去实现,这样很不方便,不容易让大家更简单上手…

ASEMI代理艾赛斯IXFA14N85XHV功率MOSFET综合指南

编辑-Z 在当今世界,电力电子在各种应用中发挥着至关重要的作用,从电源和电机驱动到电动汽车和可再生能源系统。这些应用中的关键部件之一是功率MOSFET(金属氧化物半导体场效应晶体管)。IXFA14N85XHV是一款先进的功率MOSFET&#…

Layui项目实战

使用语言&#xff1a;C#&#xff0c;Js&#xff0c;Html 使用框架&#xff1a;MVC&#xff0c;Layui 使用插件&#xff1a;JQuery&#xff0c;Layui 一.Layui父窗体前端代码&#xff1a; 1.Html代码&#xff1a; <div class"layui-col-md12" style"paddin…

gismo调试-组总刚

文章目录 前言一、1 组总刚main文件的断点2 跳转到gsElasticityAssembler.hpp3 gsElasticityAssembler.hpp的177行进入gsVisitorLinearElasticity.h4 进入gsAssembler.h重新进入gsVisitorLinearElasticity.h进入gsSparseSystem.h1.14 进入gsAssembler.h1.21.31.4 二、2.12.22.3…

AntDB 事务机制

全局一致性 AntDB 的集群架构包括&#xff0c;一个 GTM&#xff08;Global Transaction Manager&#xff09;、多个Coordinator&#xff08;CN&#xff09;、多个 Datanode&#xff08;DN&#xff09;。其中 GTM 负责给其他的 DN 和CN 分发集群全局唯一的事务号和集群当前判断…

你知道微信的转账是可以退回的吗

微信作为当今最受欢迎的即时通讯软件之一&#xff0c;其转账功能得到了广泛的应用。在使用微信转账时&#xff0c;我们可能会遇到一些问题&#xff0c;例如误操作、支付失败或者需要退款等等。 首先需要注意的是&#xff0c;微信转账退回的操作只能在“一天内未确认”时进行。如…

2023年天猫618淘宝大赢家每日1猜:哪系列是NB夏日潮流必备?今日答案是什么?淘宝天猫618红包口令怎么领取?

2023年6月13日天猫618淘宝大赢家今日答案 问题&#xff1a;哪系列是NB夏日潮流必备 答案&#xff1a;2002R &#xff08;注&#xff1a;R必须为大写&#xff09; 2023年淘宝天猫618超级红包怎么领取&#xff1f; 从2023年5月29日开始持续到6月20日&#xff0c;每天都可以打…

UniApp全局弹窗

一、设计思路 1、创建一个弹窗页面组件 2、配置page.json&#xff0c;使页面跳转是在当前界面展示 3、定义uni全局全局属性 4、解决多个弹窗同时使用的冲突问题 注意&#xff1a;此方案不支持多个弹窗并存&#xff0c;有且仅有一个会展示&#xff0c;当前弹窗展示并关闭上一个弹…

1740_使用Python+ImageMagick实现图像的批量压缩

全部学习汇总&#xff1a; GreyZhang/python_basic: My learning notes about python. (github.com) 前些年使用Linux的时候为了能够方便地往网络上上传照片&#xff0c;使用shell ImageMagick的组合进行照片的批量压缩一直觉得比较方便。不过&#xff0c;那时候即使这么简单的…

SQL注入总结

Sql注入定义&#xff1a; 就是通过把sql命令插入到web表单提交或输入域名或页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行的sql命令的目的。 sql注入分类&#xff1a; 基于联合查询 基于错误回显 基于盲注&#xff0c;分时间盲注和布尔型的盲注 基于user-agen…

汽车仪表中控开发中视频相关的一些知识点

前言: 做汽车仪表/IVI中控,尤其是IVI信息娱乐部分,都要涉及到视频这个知识点,各种概念很多,首先需要明确一条主线,那就是SDTV标清电视->HDTV高清电视->UHDTV超高清电视的一个发展脉络,BT601/656是SDTV标清电视接口,BT1120则对应HDTV高清电视接口。ITU-R BT.601/6…

用Python将《青花瓷》的歌词生成词云图

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 因为上次有小伙伴问我&#xff0c;歌曲的歌词和评论怎么生成词云图&#xff0c;想买代码… 当时我就拒绝了&#xff0c;直接免费送给了他。 所以今天来分享给大家 我们以周董的《青花瓷》为例&#xff0c;要对《青花瓷》歌词…

DDP分布式训练中遇到的一些问题

1&#xff1a;所有forward的输出必须参与到loss计算并回传 2&#xff1a;类似于layer_norm这样的操作是无需进行分布式通信的&#xff0c;也无法进行分布式通信&#xff0c;所以在DDP的时候必须把find_unused_parameters设置为True 3&#xff1a;当报错形式为如下时&#xff…