Doris权限认证-LDAP

作者: ApacheDoris

接入第三方LDAP服务为Doris提供验证登录和组授权服务。 LDAP验证登录指的是接入LDAP服务的密码验证来补充Doris的验证登录。Doris优先使用LDAP验证用户密码,如果LDAP服务中不存在该用户则继续使用Doris验证密码,如果LDAP密码正确但是Doris中没有对应账户则创建临时用户登录Doris。 LDAP组授权是将LDAP中的group映射到Doris中的Role,如果用户在LDAP中属于多个用户组,登录Doris后用户将获得所有组对应Role的权限,要求组名与Role名字相同。

名词解释

  • LDAP: 轻量级目录访问协议,能够实现账号密码的集中管理。
  • 权限 Privilege:权限作用的对象是节点、数据库或表。不同的权限代表不同的操作许可。
  • 角色 Role:Doris可以创建自定义命名的角色。角色可以被看做是一组权限的集合。

启用LDAP认证

server端配置

需要在fe/conf/ldap.conf文件中配置LDAP基本信息,另有LDAP管理员密码需要使用sql语句进行设置。

配置fe/conf/ldap.conf文件:

  • ldap_authentication_enabled = false 设置值为“true”启用LDAP验证;当值为“false”时,不启用LDAP验证,该配置文件的其他配置项都无效。
  • ldap_host = 127.0.0.1 LDAP服务ip。
  • ldap_port = 389 LDAP服务端口,默认明文传输端口为389,目前Doris的LDAP功能仅支持明文密码传输。
  • ldap_admin_name = cn=admin,dc=domain,dc=com LDAP管理员账户“Distinguished Name”。当用户使用LDAP验证登录Doris时,Doris会绑定该管理员账户在LDAP中搜索用户信息。
  • ldap_user_basedn = ou=people,dc=domain,dc=com Doris在LDAP中搜索用户信息时的base dn。
  • ldap_user_filter = (&(uid={login}))
  • Doris在LDAP中搜索用户信息时的过滤条件,占位符“{login}”会被替换为登录用户名。必须保证通过该过滤条件搜索的用户唯一,否则Doris无法通过LDAP验证密码,登录时会出现“ERROR 5081 (42000): user is not unique in LDAP server.”的错误信息。 例如使用LDAP用户节点uid属性作为登录Doris的用户名可以配置该项为: ldap_user_filter = (&(uid={login})); 使用LDAP用户邮箱前缀作为用户名可配置该项: ldap_user_filter = (&(mail={login}@baidu.com))。
  • ldap_group_basedn = ou=group,dc=domain,dc=com Doris在LDAP中搜索组信息时的base dn。如果不配置该项,将不启用LDAP组授权。

设置LDAP管理员密码:

配置好ldap.conf文件后启动fe,使用root或admin账号登录Doris,执行sql:

set ldap_admin_password = 'ldap_admin_password';

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密码
    

LDAP认证详解

LDAP密码验证和组授权是Doris密码验证和授权的补充,开启LDAP功能并不能完全替代Doris的密码验证和授权,而是与Doris密码验证和授权并存。

LDAP验证登录详解

开启LDAP后,用户在Doris和DLAP中存在以下几种情况: | 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_qa、doris_pm;Doris存在role:doris_rd、doris_qa、doris_pm,在使用LDAP验证登录后,用户不但具有该账户原有的权限,还将获得role doris_rd、doris_qa和doris_pm的权限。

LDAP验证的局限

  • 目前Doris的LDAP功能只支持明文密码验证,即用户登录时,密码在client与fe之间、fe与LDAP服务之间以明文的形式传输。
  • 当前的LDAP验证只支持在mysql协议下进行密码验证,如果使用Http接口则无法使用LDAP用户进行验证。
  • 临时用户不具有用户属性。

更多推荐

更多
  • Kubenetes CKA和CKAD认证-五、工作负载 在 specs 的下面,容器规格,Pod 控制器,复制集控制器,部署控制器,更新和回滚,部署策略,运行作业,CronJob 控制器,再造战略,滚动更新策略,作业控制器,运行一个 Pod 直到完成,运行几个 pod,直到一个完成,运行几个
    Apache CN

  • Kubenetes CKA和CKAD认证-一、使用 Kubernetes 创建集群 调配计算资源,在主机上安装 Docker,在主机上安装 kubeadm、kubelet 和 kubectl,初始化控制面板节点,加入工人队伍, 在本章中,您将在 Google Cloud 中的虚拟机上部署一个 Kubernetes 集群
    Apache CN

  • Kubenetes CKA和CKAD认证-四、Kubernetes 资源 命名空间,标签和选择器,释文,Kubernetes 以声明的方式工作:您在 Kubernetes API 的帮助下创建资源,这些对象存储在 etcd 存储中,控制器工作以确保您在这些对象中声明的内容正确地部署在您的基础设施中。
    Apache CN

  • Kubenetes CKA和CKAD认证-三、访问集群 在您的开发机器上安装 kubectl,从开发机器访问集群,Linux 操作系统,苹果,Windows 操作系统, 在前面的章节中,您已经在 Kubernetes 主机上安装了`kubectl`,并从这些主机上使用它。使用`kubectl
    Apache CN

  • Kubenetes CKA和CKAD认证-二、控制面板组件 探索控制面板服务,Kubernetes 控制面板由以下部分组成API 服务器`kube-apiserver`,Kubernetes 控制面板的前端键值存储`etcd`,所有集群数据的后备存储调度器`kube
    Apache CN

  • Kubenetes CKA和CKAD认证-十一、安全 证明,批准,API 服务器请求的剖析,请求授权属性,RBAC 模式,安全上下文,在容器层面,网络策略,在节点上预拉映像,给库伯莱颁发证书,普通用户认证,服务帐户身份验证,群集外的服务帐户,资源请求,非资源请求,角色和集群角色,RoleB
    Apache CN

  • Kubenetes CKA和CKAD认证-十三、多容器 Pod 设计模式 初始化容器,初始化存储器,等待其他服务的可用性,边车容器,适配器容器,大使容器,Pod 是 Kubernetes 集群中可部署的最小部分。一个 Pod 可以包含一个或多个容器。当一个 Pod 包含几个容器时,这些容器共享网络和存储资
    Apache CN

  • Kubenetes CKA和CKAD认证-十四、可观察性 Kubernetes 级别的调试,在容器内部调试,调试服务,记录,节点级别的日志记录,使用节点日志记录代理进行集群级日志记录,使用 Sidecar 将日志重定向到标准输出,监视,用 Prometheus 监控, 使用 Kubernete
    Apache CN

  • Kubenetes CKA和CKAD认证-九、调度 POD 使用标签选择器在特定节点上调度 pod,向节点添加标签,向窗格添加节点选择器,人工调度,DaemonSet,静态吊舱,资源请求,以命令的形式,以声明的形式,运行多个调度程序,检查调度程序事件, 当您希望将一个 Pod 运行到 Kuber
    Apache CN

  • Kubenetes CKA和CKAD认证-十、发现和负载均衡 服务,服务类型,进入,选择器,就绪探测,端点,ClusterIP(群集 IP),节点端口,LoadBalancer(负载均衡器),外部名,安装 nginx 入口控制器,访问应用,HTTPS 和入口, 当您部署一个 Pod 时,它不容易接
    Apache CN

  • 近期文章

    更多
    文章目录

      推荐作者

      更多