LDAP
LDAP 的全称是 Lightweight Directory Access Protocol,「轻量目录访问协议」。
具体可以参考:
https://www.openldap.org/doc/admin24/intro.html
环境
Linux版本:centos 7.9.2009
Ldap版本:openldap 2.4
安装和配置
安装openldap及相关包
yum install openldap openldap-servers openldap-clients
拷贝数据库配置文件
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap:ldap /var/lib/ldap/DB_CONFIG
DB_CONIFG
中主要是关于Berkeley DB的相关的一些配置
启动OpenLDAP Server
systemctl start slapd
systemctl enable slapd
systemctl status slapd
slapd即standard alone ldap daemon,该进程默认监听389端口
如下图所示:
设置root用户密码
先用一个命令生成一个LDAP管理用户root密码:
slappasswd
New password:
Re-enter new password:
{SSHA}CfZVRdbczsjDA8xDSCcp2GmfitlRge7f # 记住这个生成的加密密码,下面会用到 admin
新建一个rootpwd.ldif(名称是自定义的)的文件:
vi rootpwd.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}CfZVRdbczsjDA8xDSCcp2GmfitlRge7f
-
ldif
即LDAP Data Interchange Format
,是LDAP
中数据交换的一种文件格式。文件内容采用的是key-value
形式,注意value
后面不能有空格。 - 上面内容中
dn
即distingush name
-
olc
即Online Configuration
,表示写入LDAP
后不需要重启即可生效 -
changetype
:modify
表示修改一个entry
,changetype
的值可以是add
,delete
,modify
等。 -
add
:olcRootPW
表示对这个entry
新增了一个olcRootPW
的属性 -
olcRootPW
:{SSHA}CfZVRdbczsjDA8xDSCcp2GmfitlRge7f
指定了属性值
下面使用ldapadd命令将上面的rootpwd.ldif文件写入LDAP:
ldapadd -Y EXTERNAL -H ldapi:/// -f rootpwd.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"
导入schema
导入schema,schema包含为了支持特殊场景相关的属性,可根据选择导入,这里先全部导入:
ls /etc/openldap/schema/*.ldif | while read f; do ldapadd -Y EXTERNAL -H ldapi:/// -f $f; done
设定默认域
先使用slappasswd生成一个密码:
slappasswd
New password:
Re-enter new password:
{SSHA}koOW+gXaDu5tiGTg5W1ZI7dKZhXpwPFh
新建一个domain.ldif的文件:
vi domain.ldif
# 编辑内容如下
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
read by dn.base="cn=Manager,dc=zhidaoauto,dc=com" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=zhidaoauto,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=zhidaoauto,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}koOW+gXaDu5tiGTg5W1ZI7dKZhXpwPFh #替换上面生成的密码 admin1
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
dn="cn=Manager,dc=zhidaoauto,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=zhidaoauto,dc=com" write by * read
-
olcAccess
即access
,该key
用于指定目录的ACL
即谁有什么权限可以存取什么 -
olcRootDN
设定管理员root
用户的distingush name
- 注意替换上面文件内容中
cn
为具体的域信息 -
olcRootPW
用上面新生成的密码替换
写入
# shell执行
ldapmodify -Y EXTERNAL -H ldapi:/// -f domain.ldif
# 会有如下提示
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}monitor,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
添加基本目录
新建一个basedomain.ldif
的文件:
dn: dc=zhidaoauto,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: zhidaoauto com
dc: zhidaoauto
dn: cn=Manager,dc=zhidaoauto,dc=com
objectClass: organizationalRole
cn: Manager
description: Directory Manager
dn: ou=People,dc=zhidaoauto,dc=com
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=zhidaoauto,dc=com
objectClass: organizationalUnit
ou: Group
- 注意替换上面文件内容中dn为具体的域信息
- 理解
dn
,cn
,dc
-
DC
即Domain Component
,LDAP
目录类似文件系统目录dc=zhidaoauto,dc=com
相当于/com/zhidaoauto
-
CN
即Common Name
,CN
有可能代表一个用户名,例如cn=Manager,dc=zhidaoauto,dc=com
表示在/com/zhidaoauto
域下的管理员用户Manager
-
OU
即Organizational Unit
,例如ou=People,dc=zhidaoauto,dc=com
表示在/com/zhidaoauto
域下的一个组织单元People
写入
# 执行
ldapadd -x -D cn=Manager,dc=zhidaoauto,dc=com -W -f basedomain.ldif
# 输入密码
Enter LDAP Password:
# 会有如下提示
adding new entry "dc=zhidaoauto,dc=com"
adding new entry "cn=Manager,dc=zhidaoauto,dc=com"
adding new entry "ou=People,dc=zhidaoauto,dc=com"
adding new entry "ou=Group,dc=zhidaoauto,dc=com"
测试一下
ldapsearch -LLL -W -x -D "cn=Manager,dc=zhidaoauto,dc=com" -H ldap://localhost -b "dc=zhidaoauto,dc=com"
Enter LDAP Password:
dn: dc=zhidaoauto,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: zhidaoauto com
dc: zhidaoauto
dn: cn=Manager,dc=zhidaoauto,dc=com
objectClass: organizationalRole
cn: Manager
description: Directory Manager
dn: ou=People,dc=zhidaoauto,dc=com
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=zhidaoauto,dc=com
objectClass: organizationalUnit
ou: Group
管理工具
LDAP Account Manager
docker安装
镜像地址:https://hub.docker.com/r/ldapaccountmanager/lam
拉取镜像 Docker Pull Command
docker pull ldapaccountmanager/lam
运行此命令:
# 我这里已经有一个了,又做了一次,所以图片中端口中改为了8081
docker run -p 8080:80 -it -d ldapaccountmanager/lam:stable
然后通过http://localhost:8080/
访问 LAM Pro
如果需要,您可以更改端口 8080
。
配置文件存放在:
- /etc/ldap-account-manager
- /var/lib/ldap-account-manager
在此处查看可能的环境变量:https ://github.com/LDAPAccountManager/lam/blob/develop/lam-packaging/docker/.env
配置
- 通用配置中修改 ldap服务器地址
- 树状结构后缀,对应ldap设置的dc
- 合法用户列表,对应ldap设置的dc
- 账号类型中修改用户及组的LDAP后缀,对应ldap设置的dc
- 修改完毕之后进行保存,即可发现前台管理员用户已经变为ldap中设置的用户名,输入密码即可进入进行管理
LDAP Admin
类似上方设置,后续有机会补充
docker快速搭建LDAP
# 搭建openldap
docker run --env LDAP_ORGANISATION="demo" --env LDAP_DOMAIN="demo.com" --env LDAP_ADMIN_PASSWORD="admin" --detach osixia/openldap
# 搭建phpldapadmin. dreamy_turing是上面openldap容器的名字
docker run -p 8089:80 -p 6443:443 --link dreamy_turing --env PHPLDAPADMIN_LDAP_HOSTS=dreamy_turing --detach osixia/phpldapadmin
参考
https://blog.frognew.com/2017/05/openldap-install-notes.html#ldapadmin