LDAP客户端认证配置与应用接入

2022-09-29 16:04:11 浏览数 (1)

[TOC]

0x00 基础加深

描述:通过上一篇笔记的学习以及操作,我们已经完成吧账号属性导入了OpenLDAP中,然后通过OpenLDAP用户进行验证登陆所以我们还需对客户端进行配置; 除此之外我们还将常见的开源应用进行接入OpenLDAP之中进行应用;

(1) 用户与用户组的对应有如何关系?

  • Posixgroup用户组属性: OpenLDAP默认属性,该Posixgroup用户组属性和用户没有实际的对应关系,如果需要进行对应就需要把用户设置到Posixgroup中,且成员属性为memberUid,然后再把Dev该用户的gidNumber设置为上述用户组的gidNumber;
    • 以上设置基本可以满足大部分业务场景的需要,但是如果我们需要根据用户组来过滤用户的话,Posixgroup用户组属性,是无法满足需要的,比如:nginx与openldap集成过滤用户组时、proftpd与openldap集成过滤用户组时、openvpn与openldap集成过滤用户组时、gitlab与openldap集成过滤用户组时,Posixgroup用户组属性是无法满足的,此时我们就需要使用groupOfUniqueNames用户组属性。

    WeiyiGeek.

  • groupOfUniqueNames用户组属性:可以根据用户组过滤用户(过滤唯一),roupOfUniqueNames用户组属性的成员属性为uniqueMember,可以看到groupOfUniqueNames用户组属性配置如下:

WeiyiGeek.

0x01 认证配置
多组平台认证

描述:通过前面对LDAP Account Manager的管理配置,默认情况下创建的用户会在People而创建的组会保存在Group之中;

本段文章主要实践在Ldap中通过memberof的一个功能来实现添加多组用于不同的平台认证,首先需要查看我采用Docker搭建的openldap是支持memberof的功能。

代码语言:javascript复制
#方式1:
$docker exec -it openldap slapcat -n 0 | grep olcModuleLoad
olcModuleLoad: {0}back_mdb
olcModuleLoad: {1}memberof  #可以看到该模块存在
olcModuleLoad: {2}refint


#方式2:
docker exec openldap ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn
dn: cn=config
dn: cn=module{0},cn=config
dn: cn=schema,cn=config
dn: cn={0}core,cn=schema,cn=config
dn: cn={1}cosine,cn=schema,cn=config
dn: cn={2}nis,cn=schema,cn=config
dn: cn={3}inetorgperson,cn=schema,cn=config
dn: cn={4}ppolicy,cn=schema,cn=config
dn: cn={5}dhcp,cn=schema,cn=config
dn: cn={6}dnszone,cn=schema,cn=config
dn: cn={7}mail,cn=schema,cn=config
dn: cn={8}mmc,cn=schema,cn=config
dn: cn={9}openssh-lpk,cn=schema,cn=config
dn: cn={10}quota,cn=schema,cn=config
dn: cn={11}radius,cn=schema,cn=config
dn: cn={12}samba,cn=schema,cn=config
dn: cn={13}zarafa,cn=schema,cn=config
dn: olcBackend={0}mdb,cn=config
dn: olcDatabase={-1}frontend,cn=config
dn: olcDatabase={0}config,cn=config
dn: olcDatabase={1}mdb,cn=config
dn: olcOverlay={0}memberof,olcDatabase={1}mdb,cn=config #服务存在
dn: olcOverlay={1}refint,olcDatabase={1}mdb,cn=config

操作流程:

  • Step1.登录LAM新建立一个组选择Groups选项卡->New Group,然后Tree View->ou=Group查看新建立的组;

WeiyiGeek.

  • Step2.此处以Gitlab ,Jenkins ,SonarQube以及Harbor为例创建四个用户,先创建一个gituser为例其账号密码相同Users->New User->last Name(其他属性按需求添加)->set Password,建议在建立用户的时候将RDN identifier设置为uid,其他三个用户类似创建即可;

WeiyiGeek.

  • Step3.创建四个Object属性为 groupOfUniqueNames 的组(作用:根据用户组过滤用户该过滤是唯一的) 分别对应上面四个平台,选择组ou=Group->Create new entry here->Default->Object classes:groupOfUniqueNames->Proceed->添加基础信息然后commit;

WeiyiGeek.

最终创建结果如下:

WeiyiGeek.

采用ldapsearch输出LDAP.ldif格式的文件来看我们创建的组与用户;

代码语言:javascript复制
$ldapsearch -LLL -x -H ldap://127.0.0.1:389/ -D "cn=admin,dc=WeiyiGeek,dc=com,dc=cn" -b "dc=WeiyiGeek,dc=com,dc=cn" dn uniqueMember -w WeiyiGeek
dn: cn=gitlab,ou=Group,dc=WeiyiGeek,dc=com,dc=cn
uniqueMember: uid=gituser,ou=People,dc=WeiyiGeek,dc=com,dc=cn

dn: cn=harbor,ou=Group,dc=WeiyiGeek,dc=com,dc=cn
uniqueMember: uid=haruser,ou=People,dc=WeiyiGeek,dc=com,dc=cn

dn: cn=jenkins,ou=Group,dc=WeiyiGeek,dc=com,dc=cn
uniqueMember: cn=jenkuser,ou=People,dc=WeiyiGeek,dc=com,dc=cn

dn: cn=sonarqube,ou=Group,dc=WeiyiGeek,dc=com,dc=cn
uniqueMember: uid=sonaruser,ou=People,dc=WeiyiGeek,dc=com,dc=cn


$ldapsearch -LLL -x -H ldap://127.0.0.1:389/ -D "cn=admin,dc=WeiyiGeek,dc=com,dc=cn" -b "dc=WeiyiGeek,dc=com,dc=cn" "(|(objectClass=inetOrgPerson)(objectClass=groupOfUniqueNames))" -w WeiyiGeek
#User
dn: uid=gituser,ou=People,dc=WeiyiGeek,dc=com,dc=cn
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
loginShell: /bin/bash
homeDirectory: /home/gituser
userPassword:: e1NTSEF9UGVyM21xc1dJcnV3K1d2bWRiVmVpd3RWZHVVeVN6Tks=
uid: gituser
cn: gituser
uidNumber: 10000
gidNumber: 10000
sn: gituser
mail: gituser@weiyigeek.top

dn: cn=jenkuser,ou=People,dc=WeiyiGeek,dc=com,dc=cn
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
loginShell: /bin/bash
homeDirectory: /home/jenkuser
uid: jenkuser
cn: jenkuser
uidNumber: 10001
gidNumber: 10000
userPassword:: e1NTSEF9UlpQM0VCOE5qSW92bzVvL3NlTUVvVEVOSlZoc1NFcFI=
sn: jenkuser
mail: jenkuser@weiyigeek.top

dn: uid=sonaruser,ou=People,dc=WeiyiGeek,dc=com,dc=cn
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
loginShell: /bin/bash
homeDirectory: /home/sonaruser
uid: sonaruser
cn: sonaruser
uidNumber: 10002
gidNumber: 10000
userPassword:: e1NTSEF9SVRMTjJ4SGc1YS85bmNwQzlsU2NXcUhuYWNSWFdUTlo=
sn: sonaruser
mail: sonaruser@weiyigeek.top

dn: uid=haruser,ou=People,dc=WeiyiGeek,dc=com,dc=cn
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
loginShell: /bin/bash
homeDirectory: /home/haruser
uid: haruser
cn: haruser
uidNumber: 10003
gidNumber: 10000
userPassword:: e1NTSEF9QVp4SXV2VnlDWmR1MVpsZEQ1SEpHUW9NUDh4dlJUQXc=
sn: haruser
mail: haruser@weiyigeek.top

#groupOfUniqueNames
dn: cn=gitlab,ou=Group,dc=WeiyiGeek,dc=com,dc=cn
cn: gitlab
description:: Z2l0bGFiIOW5s WPsOS7k W6k iupOivgee7hA==
objectClass: groupOfUniqueNames
objectClass: top
ou: Group
uniqueMember: uid=gituser,ou=People,dc=WeiyiGeek,dc=com,dc=cn

dn: cn=jenkins,ou=Group,dc=WeiyiGeek,dc=com,dc=cn
cn: jenkins
description:: amVua2lucyDmjIHnu63pm4bmiJDkuI7lj5HluIPlubPlj7DorqTor4E=
objectClass: groupOfUniqueNames
objectClass: top
ou: Group
uniqueMember: cn=jenkuser,ou=People,dc=WeiyiGeek,dc=com,dc=cn

dn: cn=sonarqube,ou=Group,dc=WeiyiGeek,dc=com,dc=cn
cn: sonarqube
description:: c29uYXJxdWJlIOS7o eggei0qOmHj a1i ivleW5s WPsA==
objectClass: groupOfUniqueNames
objectClass: top
ou: Group
uniqueMember: uid=sonaruser,ou=People,dc=WeiyiGeek,dc=com,dc=cn

dn: cn=harbor,ou=Group,dc=WeiyiGeek,dc=com,dc=cn
cn: harbor
description:: aGFyYm9yIOW5s WPsOiupOivgeS7k W6kw==
objectClass: groupOfUniqueNames
objectClass: top
ou: Group
uniqueMember: uid=haruser,ou=People,dc=WeiyiGeek,dc=com,dc=cn

至此,LDAP Account Manager平台上的操作就暂告一段落了,接下来我们就靠这个uniqueMember属性来实现不同分组验证登陆到不同的平台。

0x02 应用服务接入
Ldap与sshd

描述:采用SSH进行远程LDAP用户验证登陆,先查询本地数据库中是否存在该用户如果不存在则从LDAP中请求查看该用户,并使用该用户密码进行验证登陆 ;

基础操作:

代码语言:javascript复制
#停掉sssd服务
service sssd stop && chkconfig sssd off

#安装nslcd服务
yum install nss-pam-ldapd

#修改配置文件(如下所示即可)
$vim /etc/nslcd.conf
uid nslcd
gid ldap
uri ldap://10.10.107.254/
base dc=WeiyiGeek,dc=com,dc=cn
binddn cn=admin,dc=WeiyiGeek,dc=com,dc=cn
bindpw WeiyiGeek
ssl no

$vim /etc/pam_ldap.conf
auth        required      pam_env.so
auth        required      pam_faildelay.so delay=2000000
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so
auth        sufficient    pam_ldap.so use_first_pass #添加

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so #添加

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so
password    sufficient    pam_ldap.so use_authok #添加

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_ldap.so  #添加


$vim /etc/pam.d/system-auth
session     optional      pam_mkhomedir.so skel=/etc/skel/ umask=0022

$vim /etc/nsswitch.conf
#在此三行后边增加ldap,修改后默认登录的用户通过本地配置文件进行查找并匹配。当匹配不到用户信息时,会通过后端配置的LDAP认证服务进行匹配;
passwd: files ldap
shadow: files ldap
group: files ldap

$vim /etc/sysconfig/authconfig
CACHECREDENTIALS=yes 
FAILLOCKARGS="deny=4 unlock_time=1200"
FORCELEGACY=no
FORCESMARTCARD=no
IPADOMAINJOINED=no
IPAV2NONTP=no
PASSWDALGORITHM=md5  #默认密码加密方式默认SHA512
USEDB=no
USEECRYPTFS=no
USEFAILLOCK=no
USEFPRINTD=no
USEHESIOD=no
USEIPAV2=no
USEKERBEROS=no
USELDAP=yes #启用LDAP认证协议
USELDAPAUTH=yes  #启用OpenLDAP验证
USELOCAUTHORIZE=yes  #启用本地验证
USEMKHOMEDIR=no
USENIS=no
USEPAMACCESS=no
USEPASSWDQC=no
USEPWQUALITY=yes
USESHADOW=yes #启用密码验证
USESMARTCARD=no
USESSSD=no
USESSSDAUTH=no
USESYSNETAUTH=no
USEWINBIND=no
USEWINBINDAUTH=no
WINBINDKRB5=no


#验证配置,可以通过phpldapadmin增加一个用户,或者在ldaptest1的基础上复制条目(这里不过多的说明,不会的看前面的文章)
#此时假设您已经添加成功,在phpldapadmin中可以看到新增用户,但是在本地上是没有新建的用户的;

#重启服务
systemctl restart nslcd

#查看系统用户列表
#客户端查询:
ldapsearch -H ldap://172.27.1.111 -x -b "cn=admin,dc=WeiyiGeek,dc=com,dc=cn" |grep dn
#服务端查询:
ldapsearch -x -b "cn=admin,dc=WeiyiGeek,dc=com,dc=cn" |grep dn
#查询单个用户:
ldapsearch -x -b "uid=ldaptest3,ou=People,dc=WeiyiGeek,dc=com,dc=cn" | grep dn

ssh支持LDAP相关配置:

代码语言:javascript复制
$vim /etc/ssh/sshd_config
UsePAM yes

$vim /etc/pam.d/sshd 
#用于第一次登陆的账户自动创建家目录  
session    required     pam_mkhomedir.so
#OpenLDAP限制用户登录系统
account    required     pam_access.so

$vim /etc/pam.d/password-auth 

#OpenLDAP限制用户登录系统(在账号中,不能让每个用户都能登录系统,所以要限制用户登录)
$vim /etc/security/access.conf  #限制ldaptest3用户ssh登录系统
-:ldaptest3:ALL

#重启ssh
systemctl restart sshd

测试结果:

代码语言:javascript复制
#采用LDAP中的ldaptest1用户
[ldaptest1@localhost ~]$ getent passwd | grep -E "ldap|ns"
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
nslcd:x:65:55:LDAP Client User:/:/sbin/nologin
ldaptest1:x:1001:1001:ldaptest1:/home/ldaptest1:/bin/bash
ldaptest2:x:1002:1002:ldaptest2:/home/ldaptest2:/bin/bash
ldaptest3:x:1003:1003:ldaptest3:/home/ldaptest3:/bin/bash

#用户密码设置(默认是不允许更改密码,我已经在ldap服务端配置用户可以更新自己的密码)
[ldaptest2@localhost ~]$ passwd
更改用户 ldaptest2 的密码 。
(current) LDAP Password:
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

#客户端机器上面是验证否有ldaptest1用户,通过cat /etc/passwd 查询本地是没有的
[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
dhcpd:x:177:177:DHCP server:/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
nslcd:x:65:55:LDAP Client User:/:/sbin/nologin

#但是通过getent passwd方式查询的时候又有该用户
[root@localhost ~]# getent passwd | grep "ldap"
ldaptest1:x:1001:1001:ldaptest1:/home/ldaptest1:/bin/bash
ldaptest2:x:1002:1002:ldaptest2:/home/ldaptest2:/bin/bash
ldaptest3:x:1003:1003:ldaptest3:/home/ldaptest3:/bin/bash

#直接查看ldaptest1的ID,可以查询到,说明他通过了OpenLDAP进行的验证
[root@localhost ~]# id ldaptest1
uid=1001(ldaptest1) gid=1001(ldaptest1) 组=1001(ldaptest1)

[root@localhost ~]# getent shadow | grep ldaptest1
ldaptest1:*:18363:0:99999:7:::0

#注意事项(如果输入的ldap中建立的cn用户密码失败时候会在message中显示-可以进行排错)
$tail -n 5 -f messages
Apr 12 01:16:30 localhost nslcd[6617]: [f37e85] <authc="ldaptest2"> uid=ldaptest2,ou=People,dc=WeiyiGeek,dc=com,dc=cn: lookup failed: Invalid credentials
Apr 12 01:16:33 localhost nslcd[6617]: [10b4e8] <authc="ldaptest2"> uid=ldaptest2,ou=People,dc=WeiyiGeek,dc=com,dc=cn: lookup failed: Invalid credentials

登录结果:

WeiyiGeek.

图形化简化部署 描述:采用setup工具进行图形化部署OpenLDAP客户端(新手推荐)

代码语言:javascript复制
yum install setuptool -y

#配置文件备份(到时可以对比一下它修改的地方)
cp /etc/nsswitch.conf /etc/nsswitch.conf.bak
cp /etc/pam.d/system-auth-ac /etc/pam.d/system-auth-ac.bak

#修改后的文件对比
vimdiff /etc/nsswitch.conf /etc/nsswitch.conf.bak
vimdiff /etc/pam.d/system-auth-ac /etc/pam.d/system-auth-ac.bak

图形化部署OpenLDAP客户端之采用LDAP认证

WeiyiGeek.

0 人点赞