前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LDAP客户端认证配置与应用接入

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

作者头像
全栈工程师修炼指南
发布2022-09-29 16:04:11
3.1K0
发布2022-09-29 16:04:11
举报

[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.
    WeiyiGeek.

    WeiyiGeek.

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

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.
WeiyiGeek.

WeiyiGeek.

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

WeiyiGeek.

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

WeiyiGeek.

最终创建结果如下:

WeiyiGeek.
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.
WeiyiGeek.

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.
WeiyiGeek.

WeiyiGeek.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00 基础加深
  • 0x01 认证配置
    • 多组平台认证
    • 0x02 应用服务接入
      • Ldap与sshd
      相关产品与服务
      访问管理
      访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档