openldap

综述

使用openldap的目录功能实现一套账号关联登录多个应用,避免每个系统单独管理各自账号。测试已可实现的应用有grafana(10.2.3有bug,不要用20140116) .openvpn

基本概念

dc 域, uid 用户ID , cn 通用名称(通常 cn或uid可作为第三方系统的登录账号), sn 姓(一般可设置与cn相同) , ou 组织单元(可配置为部门),dn (全路径名称,如 cn=wjy,ou=users,dc=example,dc.org)

对象属性: 最终用户可以是 objectclass: inetOrgPerson , objectclass: posixAccount objectclass: top ,然后加上 cn ,sn , uid(非必须) ,uidnumber, gidnumber, userpassword , homedirectory ,homephone,mail
组用户 :objectclass: posixGroup , objectclass: top , 加上必须的cn , gidnumber , 组成员 memberuid:

搭建

用docker-compose 最简单,少了编译、配置,可以快速部署用于测试使用。当然生产还是要详细了解相关配置项
https://github.com/osixia/docker-openldap/blob/master/example/docker-compose.yml
此模板使用了openldap + phpadmin .可以快速建立web管理界面的ldap

我这里的搭建架构示例如上图。根目录是公司层,cn=java-dev 是组(也是部门),下面uid是用户,readonly是第三方应用接入的只读查询账号,这样可以最小化权限给到第三方

grafana 接入

首先在 grafana.ini 配置文件的

[auth.ldap]
enabled = true

再在ldap.toml中配置

[[servers]]
host = "192.168.0.14"
port = 389
bind_dn = "cn=readonly,dc=ywsco,dc=cn"
bind_password = '***'
search_filter = "(uid=%s)"   #这里也可以用cn
search_base_dns = ["dc=ywsco,dc=cn"]
group_search_filter = "(&(objectClass=posixGroup)(memberUid=%s))"
group_search_base_dns = ["dc=ywsco,dc=cn"]
group_search_filter_user_attribute = "uid"
[servers.attributes]
name = "givenName"
surname = "sn"
username = "uid"
member_of = "memberOf"
email = "mail"
[[servers.group_mappings]]
group_dn = "cn=tech-support,dc=ywsco,dc=cn"
org_role = "Admin"
grafana_admin = true
org_id = 1 
[[servers.group_mappings]]
group_dn = "cn=java-dev,dc=ywsco,dc=cn"
org_role = "Editor"
[[servers.group_mappings]]
group_dn = "*"
org_role = "Viewer"