keystone对接ldap

一、 为什么使用LDAP

随着公司内部各种开源平台越来越多(例如:gitlab、Jenkins、Yapi等等),账号维护变成一个繁琐麻烦的事情,急需有一个统一的账号维护平台,一个人只需一个账号,在公司内部平台通用,而大多数开源平台都支持LDAP;因此只要搭建好LDAP服务,并跟钉钉之类的平台实现账号同步,即可实现统一账号管理;

二、LDAP介绍

1. 目录服务(Directory Service)
目录是专门为搜索和浏览而设计的专用数据库,支持基本的查找和更新功能。

2.LDAP(Lightweight Directory Access Protocol)
LDAP代表轻型目录访问协议(Lightweight Directory Access Protocol)。顾名思义,它是用于访问目录服务的轻量级协议,特别是基于X.500协议的目录服务。LDAP运行于TCP/IP连接上或其他面向传输服务的连接上。

3.目录中可以存储哪些信息?
LDAP信息模型基于条目(entries)。一个条目是属性集合(包含很多属性),并且有一个全局唯一的专有名称(Distinguished Name)。DN用于明确地引用条目。条目的每一个属性都有一个类型和一个或多个值。这些类型通常是便于记忆的字符串,例如“ cn ”表示通用名称(common name),或“ mail ”表示电子邮件地址(email address)。值的语法取决于类型。例如,cn属性可能包含值Babs Jensen。一个邮件属性可能包含值“ [email protected] ”。一个jpegPhoto属性将包含在一张照片JPEG格式 (二进制)格式。

4.信息如何排布?
在LDAP中,目录条目以树状分层结构排列。传统上,此结构反映了地理和组织边界。代表国家的条目显示在树的顶部。它们下面是代表省和国家机构的条目。再下一层可能是代表组织单位,人员,打印机,文档或您想到的几乎所有其他内容的条目。

在这里插入图片描述
该树还可以基于网络域名进行排列。这种命名方法变得越来越流行,因为它允许使用DNS定位目录服务。图1.2显示了基于域名的LDAP目录树示例。
在这里插入图片描述
此外,LDAP允许您通过使用名为objectClass的特殊属性来控制条目中需要和允许哪些属性。objectClass属性的值确定条目必须遵循的结构规则。

5.如何获取信息?
LDAP定义用于查询和更新目录的操作,提供了用于在目录中添加和删除条目、更改现有条目以及更改条目名称的操作。但是,在大多数情况下,LDAP用于搜索目录中的信息。

例如,可能想在dc = example,dc = com及以下的整个目录子树中搜索名称为Barbara Jensen的人员。LDAP可以轻松地执行此操作。或者可能想直接在st = California,c = US条目下面搜索条目,以查找名称中包含字符串Acme且具有传真号码的组织。LDAP也可以支持。

三、lecp-id 对接ldap配置文件说明

一、LDAP的objectClass

LDAP通过属性objectClass来控制哪一个属性必须出现或允许出现在一个条目中,它的值决定了该条目必须遵守的模式
规则。可以理解为关系数据库的表结构。接下来会用到的objectClass有
在这里插入图片描述
二、LDAP常用关键字列表
ldap的entry是由各种字段构成,可以理解为关系数据库的字段。
在这里插入图片描述
这里,我们把dn当做用户唯一主键, cn是common name,应该等同于用户名,因为用户名必须唯一,通常为邮箱前缀
,比如ryan.miao. sn作为姓氏, uid作为用户id。通常用户id也是唯一的。所以在使用ldap做认证的时候,

大概逻辑如下:

  • 配置ldap host, admin, admin pass
  • 用户登录时传递username
  • 读取配置的ldap信息,查询cn或者uid等于username的数据
  • 取出第一个记录, 获得dn, 根据dn和password再次去ldap服务器认证。即我们必须保证cn或uid是全局唯一的,
  • 认证通常需要进行两次。原因就在于dn没办法根据用户名计算出来。

一个ldap用户组织可能是这样的:
在这里插入图片描述

4.安装部署ldap

一、创建目录

mkdir /home/openldap/database -p,镜像运行用于映射;

二、运行镜像

docker run -p 389:389 -p 636:636 \
--env LDAP_ORGANISATION="lenovoedu" \
--env LDAP_DOMAIN="lenovoedu.cn" \
--env LDAP_ADMIN_PASSWORD="password" \
-v /home/openldap/database:/var/lib/ldap --privileged=true \
--name ldap -d osixia/openldap

查看安装是否成功

可使用ldapAdmin,进行连接,下载地址:http://www.ldapadmin.org/download/ldapadmin.html,下载后解压运行,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
输入连接名称,ip地址,点击Fetch DNs获取Base值,不勾选Anonymous connection,输入用户名密码,用户名默认为admin,密码为docker run时设置密码,点击Test connection,测试是否能连接成功;
在这里插入图片描述
三、Docker安装LDAP Account Manager

OpenLDAP安装完成后,用命令操作不方便,需要一个可视化管理工具随时访问,LDAP Account Manager为web版的管理工具;

官网:https://www.ldap-account-manager.org/lamcms/
官网Demo:https://www.ldap-account-manager.org/lam/templates/login.php,密码lam
官方docker镜像:https://registry.hub.docker.com/r/ldapaccountmanager/lam

docker 安装运行
docker run -p 8080:80 -it -d ldapaccountmanager/lam:stable

配置
浏览器输入IP:8080端口,访问
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击保存,其他部分配置,根据需要自行修改,使用OpenLDAP配置账号密码登录即可(与ldapAdmin登录的账号密码一致)
在这里插入图片描述
在这里插入图片描述

5.使用

配置
开启keystone多域支持
编辑/etc/keystone/keystone.conf配置文件,设置如下两项:

[identity]
domain_specific_drivers_enabled = True
domain_config_dir = /etc/keystone/domains

创建多域支持配置文件目录与配置文件

mkdir /etc/keystone/domains
chown -R keystone:keystone /etc/keystone/domains

配置AD对应的配置文件
在/etc/keystone/domains下创建AD对应的配置文件:keystone.{DOMAIN_NAME}.conf。{DOMAIN_NAME}需要和真正的domain name保持一致,比如我们实验环境中的test.com,那么配置文件应该为keystone.test.conf

vim /etc/keystone/domains/keystone.test.conf

添加如下配置:

[identity]
#认证使用ldap
driver = ldap
[assignment]
#鉴权使用sql
driver = sql
[ldap]
url = ldap://10.121.118.15:389
#这里绑定管理员信息(理论上其他用户也应该性)
user = cn=admin,dc=admin,dc=cn
password = 123456
suffix = dc=admin,dc=cn
#use_dumb_member和allow_subtree_delete在新版配置中不存在
use_dumb_member = False
allow_subtree_delete = False

query_scope = sub
#让openstack从keystone的组织单位中同步用户
user_tree_dn = ou=keystone,dc=admin,dc=cn
#user_objectclass = organizationalPerson
user_objectclass = inetOrgPerson
user_id_attribute = cn
#user_name_attribute = sAMAccountName
#user_mail_attribute = mail
#user_filter = (&(objectClass=user)(cn=*))

user_enabled_attribute = userAccountControl
user_enabled_default = 512
#openstack的用户中有一个用户激活的属性,在AD中并没有对应的feild与之对应,需要使用user_enabled_mask = 2来支持,并配置user_enabled_emulation。user_enabled_emulation是一个work round,当用户的LDAP system没有提供 enabled这个属性的时候,可以用这个做为work round,方法就是创建一个cn,专门用来放那些user是enabled。
user_enabled_mask = 2
user_enabled_emulation = False

group_tree_dn =ou=keystone,dc=admin,dc=cn
group_objectclass = groupOfNames
#group_filter = (&(objectClass=group)(cn=*))
group_id_attribute = cn
group_member_attribute = member

#open all debug log for ldap driver
debug_level = -1

创建domain
使用原有的admin账号创建名为test的域:

openstack domain create test

重启keystone
这个时候再重启keystone,其实也是重启httpd:

systemctl restart httpd

为domain添加project与user
然使用openstack default域下的admin账号为test域创建一个项目:

openstack project create --domain test test_project

由于我们在ad上已经为keystone组织创建了一个名为kevin的用户,正常情况下,应该已经同步到了keystone:

openstack user list --domain test
+------------------------------------------------------------------+-------------+
| ID                                                               | Name        |
+------------------------------------------------------------------+-------------+
| 48b3304d4be445373d486a2dd35f8075843f8bef3f7bd2364db003a6a91ac372 | kevin       |
+------------------------------------------------------------------+-------------+
————————————————

为admin 这个用户授权项目:

openstack role add --project test_project --user 48b3304d4be445373d486a2dd35f8075843f8bef3f7bd2364db003a6a91ac372 admin

配置dashboard
我们需要在horizon中,开启多域支持,编辑/etc/openstack-dashboard/local_settings,配置如下两项:

OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = 'default'

重启http

systemctl restart httpd

猜你喜欢

转载自blog.csdn.net/weixin_49319422/article/details/122843477
今日推荐