如何在智能告警平台CA触发测试告警
1890
2022-09-29
运维干货: 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 在配置第三方认证的时候,就是通过这样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 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 修改权限 # 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 普通用户查询 # 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 可以看到,运维组成员可以查询其他所有, 普通用户只能连接。 普通用户修改密码 # 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 更多文章请扫一扫
发表评论
暂时没有评论,来抢沙发吧~