运维干货: OpenLDAP搭建和使用

网友投稿 1890 2022-09-29

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

运维干货: OpenLDAP搭建和使用

简介

由于公司没有统一用户认证这玩意,每套平台都有各自的用户体系,比如Jenkins一套用户体系,gitlab一套,SQL平台一套,每个平台都要各自认证,很麻烦,所以需要想办法统一用户认证。这时候就用到了LDAP,所以想基于ldap开发一套用户管理平台,在此之前, 花了两天熟悉了下openldap基本概念和使用.

OpenLDAP的objectClass

inetOrgPerson:用户节点类型,person类型, 叶子节点groupOfNames:分组的group类型,标记一个group节点organizationalUnit:一个目录节点,通常是group,或者部门这种含义

OpenLDAP关键字

dn: 一条记录的详细位置,惟一辨别名dc: 域名的部分,格式是将完整的域名分成几部分,如域名为baidu.com变成dc=baidu,dc=comou: 组织单位,类似Linux中的子目录cn: 一条记录的名称uid: 用户id

LDAP组织架构图

部署

关闭selinux和防火墙

sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config && setenforce 0&& systemctl disable firewalld.service && systemctl stop firewalld.service && shutdown -r now

安装openldap

yum -y install openldap compat-openldap openldap-clients \openldap-servers openldap-servers-sql openldap-devel migrationtools

查看openldap版本

# slapd -VV@(#) $OpenLDAP: slapd 2.4.44 (Aug 31 2021 14:48:49) $ mockbuild@x86-02.bsys.centos.org:/builddir/build/BUILD/openldap-2.4.44/openldap-2.4.44/servers/slapd

配置管理员密码,此处为加密后的密码

# slappasswd -s 1234567{SSHA}DQ1SQeAjtTNU+L3wUvdnNfUW8VKoSEQN

修改olcDatabase={2}hdb.ldif文件

vim /etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif末尾添加一行olcRootPW: {SSHA}DQ1SQeAjtTNU+L3wUvdnNfUW8VKoSEQN修改olcSuffix: dc=demo,dc=cnolcRootDN: cn=Manager,dc=demo,dc=cn

修改olcDatabase={1}monitor.ldif文件

#vim /etc/openldap/slapd.d/cn=config/olcDatabase\=\{1\}monitor.ldifolcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern al,cn=auth" read by dn.base="cn=Manager,dc=demo,dc=cn" read by * none

验证配置文件是否正确

slaptest -u

启动

systemctl enable slapdsystemctl start slapdsystemctl status slapd

查看端口

netstat -anpl|grep 389

开启SSL

生成 ca 证书

cd /etc/openldap/certs/openssl genrsa -out rootCA.key 2048openssl req -x509 -new -nodes -subj "/C=CN/ST=ShangHai/L=ShangHai/O=ldap/OU=lework/CN=ldap-ca" -key rootCA.key -sha256 -days 1024 -out rootCA.pem

生成 ldap 证书请求

openssl genrsa -out ldap.key 2048openssl req -new -subj "/C=CN/ST=ShangHai/L=ShangHai/O=ldap/OU=lework/CN=ldap-server.lework.com" -key ldap.key -out ldap.csr

签发 ldap 证书

openssl x509 -req -in ldap.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out ldap.crt -days 3650 -sha256chown -R ldap:ldap /etc/openldap/certs/

创建 certs.ldif 以配置 LDAP 使用自签名证书进行安全通信。

#cat >certs.ldif<

验证配置

#slaptest -uconfig file testing succeeded

重启

systemctl restart slapd

# ss -natup | grep slapd |grep 636tcp LISTEN 0 1024 *:636 *:* users:(("slapd",pid=50069,fd=10))tcp LISTEN 0 1024 [::]:636 [::]:* users:(("slapd",pid=50069,fd=11))

配置openldap数据库

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIGchown ldap:ldap -R /var/lib/ldapchmod 700 -R /var/lib/ldapll /var/lib/ldap/

注:/var/lib/ldap/就是BerkeleyDB数据库默认存储的路径。

导入基本Schema

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldifldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldifldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

修改migrate_common.ph文件

vim /usr/share/migrationtools/migrate_common.ph$DEFAULT_MAIL_DOMAIN = "demo.cn";$DEFAULT_BASE = "dc=demo,dc=cn";$EXTENDED_SCHEMA = 1;

禁止匿名登录

#cat /root/disable_anon.ldifdn: cn=configchangetype: modifyadd: olcDisallowsolcDisallows: bind_anondn: cn=configchangetype: modifyadd: olcRequiresolcRequires: authcdn: olcDatabase={-1}frontend,cn=configchangetype: modifyadd: olcRequiresolcRequires: authc

执行

ldapadd -Y EXTERNAL -H ldapi:/// -f /root/disable_anon.ldif

OpenLDAP配置

添加base组织架构

cat > /root/base.ldif << EOFdn: dc=demo,dc=cno: demo cndc: demoobjectClass: topobjectClass: dcObjectobjectclass: organizationdn: cn=Manager,dc=demo,dc=ccnomcn: ManagerobjectClass: organizationalRoledescription: Directory Managerdn: ou=People,dc=demo,dc=cnou: PeopleobjectClass: topobjectClass: organizationalUnitdn: ou=Group,dc=demo,dc=cnou: GroupobjectClass: topobjectClass: organizationalUnitEOF

ldapadd -x -w "12345678" -D "cn=Manager,dc=demo,dc=cn" -f /root/base1.ldif

添加企业组织架构

vim /root/group.ldifdn: ou=运维组,ou=People,dc=demo,dc=cnchangetype: addobjectClass: organizationalUnitou: 运维组dn: ou=后端研发组,ou=People,dc=demo,dc=cnchangetype: addobjectClass: organizationalUnitou: 后端研发组dn: ou=前端研发组,ou=People,dc=demo,dc=cnchangetype: addobjectClass: organizationalUnitou: 前端研发组dn: ou=测试组,ou=People,dc=demo,dc=cnchangetype: addobjectClass: organizationalUnitou: 测试组

执行

ldapadd -x -w "12345678" -D "cn=Manager,dc=demo,dc=cn" -f /root/group.ldif

检查内容

ldapsearch -x -D cn=Manager,dc=demo,dc=cn -w 12345678 -b "dc=demo,dc=cn"

参数说明:

-x 启用认证-D bind admin的dn-w admin的密码-b basedn, 查询的基础dn

添加用户

使用sha1存储密码,通过userPassword保存密码

#slappasswd -h {sha} -s 123456{SHA}fEqNCco3Yq9h5ZUglD3CZJT4lBs=

#vim /root/users.ldifdn: cn=lisi,ou=后端研发组,ou=People,dc=demo,dc=cnchangetype: addobjectClass: inetOrgPersoncn: lisiuserPassword: {SHA}fEqNCco3Yq9h5ZUglD3CZJT4lBs=sn: lisititle: Java工程师mail: lisi@demo.cnuid: lisidisplayName: 李四dn: cn=lixiao,ou=测试组,ou=People,dc=demo,dc=cnchangetype: addobjectClass: inetOrgPersoncn: lixiaouserPassword: {SHA}fEqNCco3Yq9h5ZUglD3CZJT4lBs=sn: lixiaotitle: 测试工程师mail: lixiao@demo.cnuid: lixiaodisplayName: 李晓dn: cn=linlin,ou=测试组,ou=People,dc=demo,dc=cnchangetype: addobjectClass: inetOrgPersoncn: linlinuserPassword: {SHA}fEqNCco3Yq9h5ZUglD3CZJT4lBs=sn: linlintitle: 测试工程师mail: linlin@demo.cnuid: linlindisplayName: 林琳

执行

ldapadd -x -w "12345678" -D "cn=Manager,dc=demo,dc=cn" -f /root/users.ldif

查询单个用户

#ldapsearch -x -D cn=Manager,dc=demo,dc=cn -w 12345678 -b "dc=demo,dc=cn" "cn=linlin"DIF## LDAPv3# base  with scope subtree# filter: cn=linlin# requesting: ALL## search resultsearch: 2result: 0 Success# numResponses: 1

在配置第三方认证的时候,就是通过这样userfilter来search用户的。

删除用户

ldapdelete -x -D "cn=Manager,dc=demo,dc=cn" -w 12345678 "uid=lisi,ou=People,dc=demo,dc=cn"

删除ou

ldapdelete -x -D "cn=Manager,dc=demo,dc=cn" -w 12345678 "ou=People,dc=demo,dc=cn"

管理员修改用户密码

add是增加属性,replace是修改已存在属性

ldapmodify是用来修改密码的,需要指定ldif 文件

dn: cn=lisi,ou=后端研发组,ou=People,dc=demo,dc=cnchangetype: modifyreplace: userPassworduserPassword: substring

执行

#ldapmodify -a -H ldap://192.168.253.235:389 -D "cn=Manager,dc=demo,dc=cn" -w 12345678 -f updatepass.ldif modifying entry "cn=lisi,ou=后端研发组,ou=People,dc=demo,dc=cn"

可以确认密码修改成功了,同时也暴露了一个问题,任意一个人都可以bind登录,然后查询所有用户的信息。后面我们将关注acl权限问题,让每个人只能查询自己的信息,让指定的group可以查询所有人的信息。

已知个人密码情况下修改密码

注: 默认没权限修改密码

#ldappasswd -h 192.168.253.235 -p 389 -x -D "cn=lisi,ou=后端研发组,ou=People,dc=demo,dc=cn" -w substring -a old_passwd -S

分组

添加memberof模块

创建add_module_group.sh

dn: cn=module,cn=configcn: moduleobjectClass: olcModuleListolcModulePath: /usr/lib64/openldapdn: cn=module{0},cn=configchangetype: modifyadd: olcModuleLoadolcModuleLoad: memberof.la

执行

ldapadd -Q -Y EXTERNAL -H ldapi:/// -f  add_module_group.sh

创建add_group_objectClass.sh

dn: olcOverlay=memberof,olcDatabase={2}hdb,cn=configobjectClass: olcConfigobjectClass: olcMemberOfobjectClass: olcOverlayConfigobjectClass: topolcOverlay: memberofolcMemberOfDangling: ignoreolcMemberOfRefInt: TRUEolcMemberOfGroupOC: groupOfNamesolcMemberOfMemberAD: member olcMemberOfMemberOfAD: memberOf

ldapadd -Q -Y EXTERNAL -H ldapi:/// -f  add_group_objectClass.sh

添加group

ou并不能当做分组,而仅仅是组织架构的一个单元。ldap的分组都是通过单独的group来实现的。

分组类型:

groupOfNames:适合大多数用途,这边用groupOfNamesposixGroup: 类型代表传统的unix组,由gidNUmber和列表memberUid标识

# vim addgroup.ldif dn: cn=测试组,ou=Group,dc=demo,dc=cnobjectClass: groupOfNamescn: 测试组member: cn=lixiao,ou=测试组,ou=People,dc=demo,dc=cnmember: cn=linlin,ou=测试组,ou=People,dc=demo,dc=cndn: cn=后端研发组,ou=Group,dc=demo,dc=cnobjectClass: groupOfNamescn: 后端研发组member: cn=lisi,ou=后端研发组,ou=People,dc=demo,dc=cndn: cn=前端研发组,ou=Group,dc=demo,dc=cnobjectClass: groupOfNamescn: 前端研发组member: cn=wangxiao,ou=前端研发组,ou=People,dc=demo,dc=cn

ldapmodify -a -H ldap://192.168.253.235:389 -D "cn=Manager,dc=demo,dc=cn" -w 12345678-f addgroup.ldif

添加其他同事到group中

# vim addgroup.ldif dn: cn=测试组,ou=Group,dc=demo,dc=cnchangetype: modifyadd: membermember: cn=lixiao,ou=测试组,ou=People,dc=demo,dc=cn

#ldapmodify -a -H ldap://192.168.253.235:389 -D "cn=Manager,dc=demo,dc=cn" -w 12345678 -f addgroup.ldifmodifying entry "cn=测试组,ou=Group,dc=demo,dc=cn"

从Group移除user

# vim removeUserFromGroup.sh dn: cn=测试组,ou=Group,dc=demo,dc=cnchangetype: modifydelete: membermember: cn=linlin,ou=测试组,ou=People,dc=demo,dc=cn

ldapmodify -H ldap:/// -x -D cn=Manager,dc=demo,dc=cn -w 12345678-f removeUserFromGroup.sh modifying entry "cn=测试组,ou=Group,dc=demo,dc=cn"

ACL权限控制

默认没开启, 任何人都可以连接查询和操作

查看配置文件

# ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config dnSASL/EXTERNAL authentication startedSASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=authSASL SSF: 0# extended LDIF## LDAPv3# base with scope subtree# filter: (objectclass=*)# requesting: dn ## configdn: cn=config# module{0}, configdn: cn=module{0},cn=config# schema, configdn: cn=schema,cn=config# {0}core, schema, configdn: cn={0}core,cn=schema,cn=config# {1}cosine, schema, configdn: cn={1}cosine,cn=schema,cn=config# {2}nis, schema, configdn: cn={2}nis,cn=schema,cn=config# {3}inetorgperson, schema, configdn: cn={3}inetorgperson,cn=schema,cn=config# {-1}frontend, configdn: olcDatabase={-1}frontend,cn=config# {0}config, configdn: olcDatabase={0}config,cn=config# {1}monitor, configdn: olcDatabase={1}monitor,cn=config# {2}hdb, configdn: olcDatabase={2}hdb,cn=config# {0}memberof, {2}hdb, configdn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config# search resultsearch: 2result: 0 Success# numResponses: 13# numEntries: 12

ACL在dn: olcDatabase={2}hdb,cn=config

# ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config 'olcDatabase={2}hdb'SASL/EXTERNAL authentication startedSASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=authSASL SSF: 0# extended LDIF## LDAPv3# base with scope subtree# filter: olcDatabase={2}hdb# requesting: ALL## {2}hdb, configdn: olcDatabase={2}hdb,cn=configobjectClass: olcDatabaseConfigobjectClass: olcHdbConfigolcDatabase: {2}hdbolcDbDirectory: /var/lib/ldapolcSuffix: dc=demo,dc=cnolcRootDN: cn=Manager,dc=demo,dc=cnolcRootPW: {SSHA}QqVxxUw9zQ/8+sdXDxwk/VoAwp6dssolcDbIndex: objectClass eq,presolcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub# search resultsearch: 2result: 0 Success# numResponses: 2# numEntries: 1

修改权限

# vim addacl.shdn: olcDatabase={2}hdb,cn=configchangetype: modify# 只能自己可以修改密码, 不允许匿名访问, 允许运维组修改add: olcAccessolcAccess: {0}to attrs=userPassword by self write by anonymous auth by group.exact="cn=运维组,ou=Group,dc=demo,dc=cn" write by * none-# 普通自己可以修改自己的信息,运维组可以修改任何信息add: olcAccessolcAccess: {1}to * by self write by group.exact="cn=运维组,ou=Group,dc=demo,dc=cn" write by * none

ldapmodify -H ldapi://  -Y EXTERNAL -f addacl.sh

权限比较

cn=linlin,ou=测试组,ou=People,dc=demo,dc=cn 是普通用户cn=zhangsan,ou=运维组,ou=People,dc=demo,dc=cn 是运维组用户

新增一用户到运维组

userPassword密码:为substring

dn: cn=zhangsan,ou=运维组,ou=People,dc=demo,dc=cnchangetype: addobjectClass: inetOrgPersoncn: zhangsanuserPassword: {SHA}fEqNCcogggs39h5ZUglD3CZJT4lBs=sn: zhangsantitle: 运维工程师mail: zhangsan@demo.cnuid: zhangsandisplayName: 张三

运维组用户查询

#ldapsearch -H ldap:/// -x -D cn=zhangsan,ou=运维组,ou=People,dc=demo,dc=cn -w substring -b dc=demo,dc=cn "cn=zhangsan" dn memberof# extended LDIF## LDAPv3# base with scope subtree# filter: cn=zhangsan# requesting: dn memberof ## zhangsan, \E8\BF\90\E7\BB\B4\E7\BB\84, People, demo.cndn:: Y249c3V3ZWl0b25nLG91Pei/kOe7tOe7hCxvdT1QZW9wbGUsZGM9aG15cC1maixkYz1jbg==memberOf:: Y2496L+Q57u057uELG91PUdyb3VwLGRjPWhteXAtZmosZGM9Y24=# search resultsearch: 2result: 0 Success# numResponses: 2# numEntries: 1

普通用户查询

# ldapsearch -H ldap:/// -x -D cn=linlin,ou=测试组,ou=People,dc=demo,dc=cn -w substring -b dc=demo,dc=cn "cn=linlin" dn memberof # extended LDIF## LDAPv3# base with scope subtree# filter: cn=linlin# requesting: dn memberof ## search resultsearch: 2result: 32 No such object# numResponses: 1

可以看到,运维组成员可以查询其他所有, 普通用户只能连接。

普通用户修改密码

# vim updateselfpass.shdn: cn=linlin,ou=测试组,ou=People,dc=demo,dc=cnchangetype: modifyreplace: userPassworduserPassword: 12345678#-------------------------# ldapmodify -H ldap:/// -x -D cn=linlin,ou=测试组,ou=People,dc=demo,dc=cn -w substring-f updateselfpass.sh modifying entry "cn=linlin,ou=测试组,ou=People,dc=demo,dc=cn"[root@test-openldap-235 ~]# ldapmodify -H ldap:/// -x -D cn=linlin,ou=测试组,ou=People,dc=demo,dc=cn -w substring-f updateselfpass.shldap_bind: Invalid credentials (49)

普通用户修改别人密码

# vim updateselfpass.shdn: cn=lixiao,ou=测试组,ou=People,dc=demo,dc=cnchangetype: modifyreplace: userPassworduserPassword: 12345678#-------------------------# ldapmodify -H ldap:/// -x -D cn=linlin,ou=测试组,ou=People,dc=demo,dc=cn -w 12345678 -f updateselfpass.shmodifying entry "cn=lixiao,ou=测试组,ou=People,dc=demo,dc=cn"ldap_modify: Insufficient access (50)

可以看到普通用户无法修改别人密码

命令参数说明

-H ldap服务端地址,可以是ldap://192.168.253.235:389 表示tcp, 可以是ldap:/// 表示本地的tcp, 可以是ldapi:/// 本地unix socket连接-x 启用简单认证,通过-D dn -w 密码的方式认证-f 指定要修改的文件-a 使用ldapmodify增加一个entry的时候等同于ldapadd-b  basedn 根目录, 将在此目录下查询

LDAP管理工具推荐: LDAP Admin

更多文章请扫一扫

上一篇:Redis 运维实战 第01期:Redis 复制
下一篇:运维狗的北京爱情故事
相关文章

 发表评论

暂时没有评论,来抢沙发吧~