Doris:联邦认证

LDAP​

接入第三方 LDAP 服务为 Doris 提供验证登录和组授权服务。

LDAP 验证登录​

LDAP 验证登录指的是接入 LDAP 服务的密码验证来补充 Doris 的验证登录。Doris 优先使用 LDAP 验证用户密码,如果 LDAP 服务中不存在该用户则继续使用 Doris 验证密码,如果 LDAP 密码正确但是 Doris 中没有对应账户则创建临时用户登录 Doris。

开启 LDAP 后,用户在 Doris 和 LDAP 中存在以下几种情况:

LDAP 用户Doris 用户密码登录情况登录 Doris 的用户
存在存在LDAP 密码登录成功Doris 用户
存在存在Doris 密码登录失败
不存在存在Doris 密码登录成功Doris 用户
存在不存在LDAP 密码登录成功Ldap 临时用户

开启 LDAP 后,用户使用 mysql client 登录时,Doris 会先通过 LDAP 服务验证用户密码,如果 LDAP 存在用户且密码正确,Doris 则使用该用户登录;此时 Doris 若存在对应账户则直接登录该账户,如果不存在对应账户则为用户创建临时账户并登录该账户。临时账户具有具有相应对权限(参见 LDAP 组授权),仅对当前连接有效,doris 不会创建该用户,也不会产生创建用户对元数据。 如果 LDAP 服务中不存在登录用户,则使用 Doris 进行密码认证。

以下假设已开启 LDAP 认证,配置 ldap_user_filter = (&(uid={login})),且其他配置项都正确,客户端设置环境变量 LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN=1

例如:

  1. Doris 和 LDAP 中都存在账户:

    存在 Doris 账户:jack@'172.10.1.10',密码:123456

    LDAP 用户节点存在属性:uid: jack 用户密码:abcdef

    使用以下命令登录 Doris 可以登录 jack@'172.10.1.10' 账户:

    mysql -hDoris_HOST -PDoris_PORT -ujack -p abcdef
    

    使用以下命令将登录失败:

    mysql -hDoris_HOST -PDoris_PORT -ujack -p 123456
    

  2. LDAP 中存在用户,Doris 中不存在对应账户:

    LDAP 用户节点存在属性:uid: jack 用户密码:abcdef

    使用以下命令创建临时用户并登录 jack@'%',临时用户具有基本权限 DatabasePrivs:Select_priv,用户退出登录后 Doris 将删除该临时用户:

    mysql -hDoris_HOST -PDoris_PORT -ujack -p abcdef
    

  3. LDAP 不存在用户:

    存在 Doris 账户:jack@'172.10.1.10',密码:123456

    使用 Doris 密码登录账户,成功:

    mysql -hDoris_HOST -PDoris_PORT -ujack -p 123456
    

LDAP 组授权​

DLAP 用户 dn 是 LDAP 组节点的“member”属性则 Doris 认为用户属于该组。LDAP 组授权是将 LDAP 中的 group 映射到 Doris 中的 role,并将所有对应的 role 权限授予登录用户,用户退出登录后 Doris 会撤销对应的 role 权限。在使用 LDAP 组授权前应该在 Doris 中创建相应的 role,并为 role 授权。

登录用户权限跟 Doris 用户和组权限有关,见下表:

LDAP 用户Doris 用户登录用户的权限
存在存在LDAP 组权限 + Doris 用户权限
不存在存在Doris 用户权限
存在不存在LDAP 组权限

如果登录的用户为临时用户,且不存在组权限,则该用户默认具有 information_schema 的 select_priv 权限

举例:

LDAP 用户 dn 是 LDAP 组节点的 member 属性则认为用户属于该组,Doris 会截取组 dn 的第一个 Rdn 作为组名。

例如用户 dn 为 uid=jack,ou=aidp,dc=domain,dc=com,组信息如下:

dn: cn=doris_rd,ou=group,dc=domain,dc=com  
objectClass: groupOfNames  
member: uid=jack,ou=aidp,dc=domain,dc=com  

则组名为 doris_rd

假如 jack 还属于 LDAP 组 doris_qadoris_pm;Doris 存在 role:doris_rddoris_qadoris_pm,在使用 LDAP 验证登录后,用户不但具有该账户原有的权限,还将获得 role doris_rddoris_qa 和 doris_pm 的权限。

注意:

user 属于哪个 group 和 LDAP 树的组织结构无关,示例部分的 user2 并不一定属于 group2 若想让 user2 属于 group2,需要在 group2 的 member 属性中添加 user2

LDAP 示例​

更改 Doris 配置​
  1. 在 fe/conf/fe.conf 文件中配置认证方式为 ldap authentication_type=ldap。
  2. 在 fe/conf/ldap.conf 文件中配置 LDAP 基本信息,
  3. 设置 LDAP 管理员密码:配置好 ldap.conf 文件后启动 fe,使用 root 或 admin 账号登录 Doris,执行 sql
set ldap_admin_password = password('ldap_admin_password');

使用 mysql 客户端登录​
mysql -hDORIS_HOST -PDORIS_PORT -u user -p --enable-cleartext-plugin
输入 ldap 密码

注:使用其它客户端登录可以参考下文中 客户端如何使用明文登录

LDAP 信息缓存​

为了避免频繁访问 LDAP 服务,Doris 会将 LDAP 信息缓存到内存中,可以通过 ldap.conf 中的 ldap_user_cache_timeout_s 配置项指定 LDAP 用户的缓存时间,默认为 12 小时;在修改了 LDAP 服务中的信息或者修改了 Doris 中 LDAP 用户组对应的 Role 权限后,可能因为缓存而没有及时生效,可以通过 refresh ldap 语句刷新缓存,详细查看REFRESH-LDAP。

LDAP 验证的局限​

  • 目前 Doris 的 LDAP 功能只支持明文密码验证,即用户登录时,密码在 client 与 fe 之间、fe 与 LDAP 服务之间以明文的形式传输。

常见问题​

  • 怎么判断 LDAP 用户在 doris 中有哪些角色?

    使用 LDAP 用户在 doris 中登录,show grants;能查看当前用户有哪些角色。其中 ldapDefaultRole 是每个 ldap 用户在 doris 中都有的默认角色。

  • LDAP 用户在 doris 中的角色比预期少怎么排查?

    1. 通过show roles;查看预期的角色在 doris 中是否存在,如果不存在,需要通过 CREATE ROLE rol_name;创建角色。
    2. 检查预期的 group 是否在ldap_group_basedn对应的组织结构下。
    3. 检查预期 group 是否包含 member 属性。
    4. 检查预期 group 的 member 属性是否包含当前用户。

LDAP 相关概念​

在 LDAP 中,数据是按照树型结构组织的。

示例(下文的介绍都将根据这个例子进行展开)​
- dc=example,dc=com- ou = ou1- cn = group1- cn = user1- ou = ou2- cn = group2- cn = user2- cn = user3

LDAP 名词解释​
  • dc(Domain Component): 可以理解为一个组织的域名,作为树的根结点
  • dn(Distinguished Name): 相当于唯一名称,例如 user1 的 dn 为 cn=user1,ou=ou1,dc=example,dc=com user2 的 dn 为 cn=user2,cn=group2,ou=ou2,dc=example,dc=com
  • rdn(Relative Distinguished Name): dn 的一部分,user1 的四个 rdn 为 cn=user1 ou=ou1 dc=example 和 dc=com
  • ou(Organization Unit): 可以理解为子组织,user 可以放在 ou 中,也可以直接放在 example.com 域中
  • cn(common name):名字
  • group: 组,可以理解为 doris 的角色
  • user: 用户,和 doris 的用户等价
  • objectClass:可以理解为每行数据的类型,比如怎么区分 group1 是 group 还是 user,每种类型的数据下面要求有不同的属性,比如 group 要求有 cn 和 member(user 列表),user 要求有 cn,password,uid 等

客户端如何使用明文登录​

MySql Client​

客户端使用 LDAP 验证需要启用 mysql 客户端明文验证插件,使用命令行登录 Doris 可以使用下面两种方式之一启用 mysql 明文验证插件:

  • 设置环境变量 LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN 值 1

    例如在 linux 或者 mac 环境中可以使用:

    echo "export LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN=1" >> ~/.bash_profile && source ~/.bash_profile
    

  • 每次登录 Doris 时添加参数 --enable-cleartext-plugin

    mysql -hDORIS_HOST -PDORIS_PORT -u user -p --enable-cleartext-plugin输入 ldap 密码
    

Jdbc Client​

使用 Jdbc Client 登录 Doris 时,需要自定义 plugin。

首先,创建一个名为 MysqlClearPasswordPluginWithoutSSL 的类,继承自 MysqlClearPasswordPlugin。在该类中,重写 requiresConfidentiality() 方法,并返回 false。

public class MysqlClearPasswordPluginWithoutSSL extends MysqlClearPasswordPlugin {
@Override  
public boolean requiresConfidentiality() {return false;}
}

在获取数据库连接时,需要将自定义的 plugin 配置到属性中

即(xxx 为自定义类的包名)

  • authenticationPlugins=xxx.xxx.xxx.MysqlClearPasswordPluginWithoutSSL
  • defaultAuthenticationPlugin=xxx.xxx.xxx.MysqlClearPasswordPluginWithoutSSL
  • disabledAuthenticationPlugins=com.mysql.jdbc.authentication.MysqlClearPasswordPlugin

eg:

 jdbcUrl = "jdbc:mysql://localhost:9030/mydatabase?authenticationPlugins=xxx.xxx.xxx.MysqlClearPasswordPluginWithoutSSL&defaultAuthenticationPlugin=xxx.xxx.xxx.MysqlClearPasswordPluginWithoutSSL&disabledAuthenticationPlugins=com.mysql.jdbc.authentication.MysqlClearPasswordPlugin";

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

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

相关文章

stm32第六天继电器

一:继电器 1.继电器的工作原理 继电器是一个电控开关,工作原理基于电磁感应,继电器包括一个电磁线圈和一组触点。常用于控制高电流或高电压的电路,例如自动控制原理,电力系统和自动化设备中,由于可靠性和电…

Vue渲染函数 - render 函数

文章目录 Vue渲染函数 - render 函数1. 什么是 render 函数2、页面展示过程3、render 函数的参数4. 如何使用(1)基本渲染(2)传递属性和事件(3)条件渲染 5. render 函数的实际使用6.View Design 组件中的使用…

单片机自学总结

自从工作以来,一直努力耕耘单片机,至今,颇有收获。从51单片机,PIC单片机,直到STM32,以及RTOS和Linux,几乎天天在搞:51单片机,STM8S207单片机,PY32F003单片机,…

go回调函数的使用

在Go语言中,回调函数可以有参数,也可以没有参数。它们的定义和使用方式略有不同,但本质上都是将函数作为参数传递给另一个函数,并在适当的时候调用它。以下是带参数和不带参数的回调函数的示例和说明。 1. 不带参数的回调函数 不…

在 Ubuntu 中配置 NFS 共享服务的完整指南

前言 网络文件系统(NFS)作为 Linux 系统间实现文件共享的标准协议,在分布式计算和容器化部署场景中具有重要作用。本文将详细演示如何在 Ubuntu 系统上配置 NFS 服务端与客户端,并实现可靠的持久化挂载。 一、环境准备 系统要求…

TypeScript Symbols 深度解析:在 Vue3 中的高级应用实践

一、Symbols 核心特性解析 1.1 什么是 Symbol? Symbol 是 ES6 引入的原始数据类型,表示唯一且不可变的值,主要解决对象属性名冲突问题。在 TypeScript 中,我们通过 symbol 类型获得完整的类型支持: const SERIAL_KE…

无需刷机、root,畅享原生安卓的丝滑体验。

Apex Launcher 是一款历史悠久的 Android 桌面启动器,诞生于 Android 系统早期(Android 4.0 时代)。当时,Android 系统的默认界面被认为较为简陋,无法满足一些追求个性化和高效操作的用户需求。因此,许多开…

Visual Studio Code安装配置优化全攻略:打造高效开发环境

目录 一、背景与意义 二、安装与配置基础 2.1 下载与安装 2.2 核心配置目录 三、深度优化配置指南 3.1 主题与界面优化 3.2 必装效率插件(精选TOP10) 3.3 性能优化设置 四、实战案例:前端开发环境配置 4.1 项目初始化 4.2 调试配置…

味觉传送器E-Taste:开启虚拟世界的味觉之门

味觉传送器E-Taste:开启虚拟世界的味觉之门 一、发明背景与动机 随着虚拟现实(VR)和增强现实(AR)技术的飞速发展,人们在虚拟世界中的沉浸感不断提升,视觉和听觉体验已经取得了显著的突破。然而…

判断质数与合数

判断质数与合数的逻辑很相似,都是判断一个属除了1和它本身,能不能被其他数整除。 其他数包括质数与合数,合数能表示能质数的乘积,因此问题就转化为:一个数能不能被除了1和它本身之外的其他质数整除。 质数2&#xff…

在Spring Boot项目中接入DeepSeek深度求索,感觉笨笨的呢

文章目录 引言1. 什么是DeepSeek?2. 准备工作2.1 注册DeepSeek账号 3.实战演示3.1 application增加DS配置3.2 编写service3.3 编写controller3.4 编写前端界面chat.html3.5 测试 总结 引言 在当今快速发展的数据驱动时代,企业越来越重视数据的价值。为了…

Cursor在内网环境配置自定义DeepSeek API

关键字 Cursor、DeepSeek、API配置、内网代理、HTTP/2 背景环境 使用Cursor集成环境开发程序。但是我使用公司的内网并不能使用cursor自带的模型,于是我就想使用DeepSeek官方的API服务。 环境:Windows 11系统 解决过程 网络检测 首先进行环境检测&am…

RabbitMQ 集群降配

这里写自定义目录标题 摘要检查状态1. 检查 RabbitMQ 服务状态2. 检查 RabbitMQ 端口监听3. 检查 RabbitMQ 管理插件是否启用4. 检查开机自启状态5. 确认集群高可用性6. 检查使用该集群的服务是否做了断开重连 实操1. 负载均衡配置2. 逐个节点降配(滚动操作&#xf…

设计模式之外观模式:原理、实现与应用

引言 外观模式(Facade Pattern)是一种结构型设计模式,它通过提供一个统一的接口来简化复杂系统的使用。外观模式隐藏了系统的复杂性,使得客户端可以通过一个简单的接口与系统交互。本文将深入探讨外观模式的原理、实现方式以及实…

进行交通流预测,使用KAN+Transformer模型

理论基础 KAN(Knowledge Augmented Network) KAN 是一种知识增强网络,其核心思想是将先验知识融入到神经网络中,以此提升模型的性能与泛化能力。在交通流预测领域,先验知识可以是交通规则、历史交通模式等。通过把这…

TF中 Arg 节点

TF中 Arg 节点 在 TensorFlow 的计算图中,_Arg 节点(Argument Node)表示函数的输入参数,是计算图中负责接收外部输入数据的节点。它的名字来源于“Argument”(参数),直接对应函数调用时传入的张…

Educational Codeforces Round 176 (Rated for Div. 2)

A.To Zero 签到题 void solve() { int n,k;cin>>n>>k;int k2k/2*2;int k1(k2<k)?k:k-1;int cnt0;if(n%21){n-k1;cnt;cnt(n/k2)(n%k2!0);}else {cnt(n/k2)(n%k2!0);}cout<<cnt<<endl;}B.Array Recoloring 手推一下可以发现&#xff0c;答案其实就…

Kubernetes的Service详解

一、Service介绍 在 kubernetes 中&#xff0c; pod 是应用程序的载体&#xff0c;我们可以通过 pod 的 ip 来访问应用程序&#xff0c;但是 pod 的 ip 地址不是固定的&#xff0c;这也就意味着不方便直接采用pod 的 ip 对服务进行访问。 为了解决这个问题&#xff0c;kuberne…

基于Nvidia Jetson Nano边缘计算设备使用TensorRT部署YOLOv8模型实现目标检测推理

0、背景 最近拿到一台边缘计算设备&#xff0c;在部署YOLO模型的过程中遇到一些问题&#xff0c;特此记录。 设备介绍信息&#xff1a;NVIDIA Jetson Orin Nano T201Developer Kit 开发套件 开发者套件&#xff1a;Jetson Orin Nano T201 8GB开发套件 使用指南文档&#x…

让人感到疑惑的const

const 关键字在不同的编程语言中有着不同的含义和限制&#xff0c;但通常它被用来声明一个常量或只读变量。然而&#xff0c;在 JavaScript 中&#xff0c;const 的行为有时可能会让人感到困惑&#xff0c;因为它并不总是意味着“不可变”&#xff08;immutable&#xff09;。让…