LDAP学习笔记之九:OpenLDAP 密码策略、审计控制

一、密码策略

OpenLDAP密码策略包括以下几方面

密码的生命周期。
保存密码历史,避免在一段时间内重用相同的密码。
密码强度,新密码可以根据各种特性进行检查。
密码连续认证失败的最大次数。
自动账号锁定。
支持自动解锁账号或管理员解锁账号。
优雅(Grace)绑定(允许密码失效后登录的次数)。
密码策略可以在任意DIT 范围定义,可以是用户、组或任意组合。

密码策略属性详解 

pwdAllowUserChange,允许用户修改其密码。
pwdAttribute,pwdPolicy对象的一个属性,用于标识用户密码。
pwdExpire Warning,密码过期前警告天数。
pwdFailureCountInterval,密码失败后恢复时间。
pwdGraceAuthNLimit,密码过期后不能登录的天数,0代表禁止登录。
pwdInHistory,开启密码历史记录,用于保证不能和之前设置的密码相同。
pwdLockout,超过定义次数,账号被锁定。
pwdLockoutDuration,密码连续输入错误次数后,账号锁定时间。
pwdMaxAge,密码有效期,到期需要强制修改密码。
pwdMaxFailure,密码最大失效次数,超过后账号被锁定。
pwdMinAge,密码有效期。
pwdMinLength,用户修改密码时最短的密码长度。
pwdMustChange,用户登录系统后提示修改密码。
pwdSafeModify,是否允许用户修改密码,与 pwdMustChange共同使用。
pwdLockoutDuration,账号锁定后,不能自动解锁,此时需要管理员干涉。

设定用户密码定期修改及过期时间

向条目中添加一个名为shadowAccount的objectClass, 设定如下属性(attributes):

shadowLastChange: 密码从1970年1月1日开始, 到最近一次修改, 一共间隔了多少天. 比如这里指定成16967就表示2016年6月15日. 也可以直接获取当天的日期,方法为:在系统里useradd一个用户,查看/etc/shadow中该用户的第三个值, 即是该值. 该值如果设置成0, 则表示下次登陆将强制修改密码, 用户修改密码成功以后, 该值将发生对应的变化;
shadowMin: 密码从shadowLastChange指定的日期开始, 到多少天以后才能再次修改密码, 防止某些人天天没事就修改密码, 此值设置成0表示不限制;
shadowMax: 密码从shadowLastChange指定的日期开始, 到多少天以后过期(即多少天后必须更改密码);
shadowInactive: 密码过期以后还可以登陆多少天(每次登陆都会要求更改密码), 如果超过此值指定的天数, 下次登陆时会提示Your account has expired; please contact your system administrator;
shadowWarning: 提前多少天开始警告用户密码将会过期;
shadowExpire: 密码从1970年1月1日开始, 多少天以后将会过期, 这里一般用不到;
shadowFlag: 暂时无用

一组建议的值

shadowLastChange: 0
shadowMin: 0
shadowMax: 90 #每隔90天强制更换密码
shadowInactive: 7 #过期以后还有7天可以登陆,每次登陆都会提示修改密码
shadowWarning: 8 #提前8天开始提示密码即将过期 

二、OpenLDAP服务端定制密码策略

1.加载模块

查看模块相关信息

[root@ldap01 ~]# cat /etc/openldap/slapd.d/cn\=config/cn\=module\{0\}.ldif|grep ^olcModule #查看模块相关信息
olcModulePath: /usr/lib64/openldap
olcModuleLoad: {0}memberof.la
olcModuleLoad: {1}refint
[root@ldap01 ~]# ls /usr/lib64/openldap/ppolicy.la  #查看 ppolicy.la 模块
/usr/lib64/openldap/ppolicy.la

加载模块(根据上面的模块信息对序号进行修改)

[root@ldap01 ~]# cat << EOF | ldapadd -Y EXTERNAL -H ldapi:///
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: {2}ppolicy.la
EOF
[root@ldap01 ~]# cat /etc/openldap/slapd.d/cn\=config/cn\=module\{0\}.ldif|grep ^olcModule #查看模块相关信息

添加 objectClass 对象,增加额外属性和值

[root@ldap01 ~]# cat << EOF | ldapadd -Y EXTERNAL -H ldapi:///
dn: olcOverlay=ppolicy,olcDatabase={2}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcPPolicyConfig
olcOverlay: ppolicy
olcPPolicyDefault: cn=default,ou=pwpolicies,dc=ldap01,dc=pwb,dc=com
olcPPolicyHashCleartext: TRUE
olcPPolicyUseLockout: TRUE
EOF

2.定义密码策略组

在 pwpolicies 条目下创建密码策略组

[root@ldap01 ~]# cat << EOF | ldapadd -x -D "cn=admin,dc=ldap01,dc=pwb,dc=com"  -w 123456 -H ldap://ldap01.pwb.com
dn: ou=pwpolicies,dc=ldap01,dc=pwb,dc=com
ou: pwpolicies
objectClass: organizationalUnit
EOF

定义密码策略组默认密码规则,可以定义多个,例如一个默认,一个安全人员的密码策略

[root@ldap01 ~]# cat << EOF | ldapadd -x -D "cn=admin,dc=ldap01,dc=pwb,dc=com"  -w 123456 -H ldap://ldap01.pwb.com
dn: cn=default,ou=pwpolicies,dc=ldap01,dc=pwb,dc=com
cn: default
objectClass: pwdPolicy
objectClass: person
pwdAllowUserChange: TRUE
pwdAttribute: userPassword
pwdExpireWarning: 259200
pwdFailureCountInterval: 0
pwdGraceAuthNLimit: 5
pwdInHistory: 5
pwdLockout: TRUE
pwdLockoutDuration: 300
pwdMaxAge: 2592000
pwdMaxFailure: 5
pwdMinAge: 0
pwdMinLength: 8
pwdMustChange: TRUE
pwdSafeModify: TRUE
sn: dummy value
EOF


[root@ldap01 ~]# cat << EOF | ldapadd -x -D "cn=admin,dc=ldap01,dc=pwb,dc=com"  -w 123456 -H ldap://ldap01.pwb.com
dn: cn=security,ou=pwpolicies,dc=ldap01,dc=pwb,dc=com
cn: security
objectClass: pwdPolicy
objectClass: person
pwdAllowUserChange: TRUE
pwdAttribute: userPassword
pwdExpireWarning: 259200
pwdFailureCountInterval: 0
pwdGraceAuthNLimit: 5
pwdInHistory: 5
pwdLockout: TRUE
pwdLockoutDuration: 300
pwdMaxAge: 2592000
pwdMaxFailure: 5
pwdMinAge: 0
pwdMinLength: 8
pwdMustChange: TRUE
pwdSafeModify: TRUE
sn: dummy value
EOF

设置用户使用密码策略

[root@ldap01 ~]# cat << EOF | ldapadd -x -D "cn=admin,dc=ldap01,dc=pwb,dc=com"  -w 123456 -H ldap://ldap01.pwb.com
dn: uid=ldap1,ou=People,dc=ldap01,dc=pwb,dc=com
changetype: modify
add: pwdPolicySubentry  #修改使用security策略组可以replace
pwdPolicySubentry: cn=default,ou=pwpolicies,dc=ldap01,dc=pwb,dc=com
EOF



如果对全局进行配置,则可以加入如下权限:
[root@ldap01 ~]# cat << EOF | ldapmodify -c -Y EXTERNAL -Q -H ldapi:///
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by dn="cn=default,ou=pwpolicies,dc=ldap01,dc=pwb,dc=com" write by anonymous auth by * read
olcAccess: {1}to * by self write by dn="cn=default,ou=pwpolicies,dc=ldap01,dc=pwb,dc=com" write by * read
EOF

定义用户登录需改密码 

root@ldap01 ~]#  cat << EOF | ldapadd -x -D "cn=admin,dc=ldap01,dc=pwb,dc=com"  -w 123456 -H ldap://ldap01.pwb.com
dn: uid=ldap1,ou=People,dc=ldap01,dc=pwb,dc=com
changetype: modify
replace: pwdReset
pwdReset: TRUE
EOF

[root@ldap01 ~]# ldapsearch -x -D "cn=admin,dc=ldap01,dc=pwb,dc=com"  -w 123456   "uid=ldap1" +  #注意最后有个+号,pwdReset 属性隐藏属性,默认 ldapsearch 无法获取隐藏属性,通过+号可获取查询包含的隐藏属性

利用shadow设置用户首次登陆修改密码

利用shadow属性来强制用户(网上在客户端的配置好像存在问题,在centos7上存在问题,google后有人建议使用shadow)

[root@client01 log]#  cat << EOF | ldapadd -x -D "cn=admin,dc=ldap01,dc=pwb,dc=com"  -w 123456 -H ldap://ldap01.pwb.com
dn: uid=ldap1,ou=People,dc=ldap01,dc=pwb,dc=com
changetype: modify
replace: shadowLastChange  
shadowLastChange: 0
EOF

3.客户端配置验证 

[root@client01 log]# ssh ldap1@192.168.1.132  #首次登录提示密码过期,强制我们需要修改密码
ldap1@192.168.1.132's password: 
You are required to change your password immediately (root enforced)
need a new password
Last login: Thu Apr 21 23:09:47 2022 from client01.pwb.com
WARNING: Your password has expired.
You must change your password now and login again!
更改用户 ldap1 的密码 。
(current) LDAP Password: 
新的 密码:             #此处输入123456
重新输入新的 密码:
password change failed: Constraint violation  #提示我们修改失败,因为不符合密码策略组设置的密码策略
passwd: 鉴定令牌操作错误
Connection to 192.168.1.132 closed.
[root@client01 log]# ssh ldap1@192.168.1.132 #重新登录修改密码,需要符合密码长度
ldap1@192.168.1.132's password: 
You are required to change your password immediately (root enforced)
need a new password
Last login: Thu Apr 21 23:17:37 2022 from client01.pwb.com
WARNING: Your password has expired.
You must change your password now and login again!
更改用户 ldap1 的密码 。
(current) LDAP Password: 
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
Connection to 192.168.1.132 closed.
[root@client01 log]# ssh ldap1@192.168.1.132  #修改后程序登录是密码可以正常登录
ldap1@192.168.1.132's password: 
Last login: Thu Apr 21 23:23:19 2022 from client01.pwb.com
[ldap1@client01 ~]$ 

4.添加pqchecker密码检查模块

上面的策略只能实现基本的功能,但对于密码负责度的检测,自带的模块无法实现,我们只能额外安装其他模块,此处用到的模块是:pqchecker

安装模块

[root@ldap01 ~]# wget --no-check-certificate https://meddeb.net/pub/pqchecker/rhel/7/pqchecker-2.0.0-1.el7.x86_64.rpm
[root@ldap01 ~]# qpm -ql pqchecker
[root@ldap01 ~]# cat /etc/openldap/pqchecker/pqparams.dat |grep -v "^#"
0|01010101  #规则实例如上:|号后面的为规则,前两位表示密码至少得有多少个大写字母,最多为99个,最少为0个,以此类推,每两位标识一种字符至少包含的数量,后面分别是小写字母,数字,特殊字符。

配置密码策略对新策略的支持  

root@ldap01 ~]# vim add_pqchecker.ldif
dn: cn=default,ou=pwpolicies,dc=ldap01,dc=pwb,dc=com
changetype: modify
replace: pwdCheckQuality
pwdCheckQuality: 2  #可以使用3个值 0:不检查 1:检查,但是密码不符合也接受 2:检查,密码不符合不接受
-
add: objectclass
objectclass: pwdPolicyChecker
-
add: pwdcheckmodule
pwdcheckmodule: pqchecker.so.2.0.0
[root@ldap01 ~]# ldapadd -x -D cn=admin,dc=ldap01,dc=pwb,dc=com -w 123456 -f add_pqchecker.ldif
root@ldap01 ~]# ldapsearch -Y external -H ldapi:/// -b cn=config "(objectClass=olcModuleList)" -LLL
......
olcModuleLoad: {2}ppolicy.la  #pqchecker依赖ppolicy模块,必须为加载状态
[root@ldap01 ~]# ldapsearch -Y external -H ldapi:/// -b cn=default,ou=pwpolicies,dc=ldap01,dc=pwb,dc=com pwdCheckModule pwdCheckQuality -LLL
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: cn=default,ou=pwpolicies,dc=ldap01,dc=pwb,dc=com
pwdCheckModule: pqchecker.so.2.0.0
pwdCheckQuality: 2 

配置用户

[root@ldap01 ~]# cat << EOF | ldapadd -x -D "cn=admin,dc=ldap01,dc=pwb,dc=com"  -w 123456 -H ldap://ldap01.pwb.com
dn: uid=ldap2,ou=People,dc=ldap01,dc=pwb,dc=com
changetype: modify
add: pwdPolicySubentry
pwdPolicySubentry: cn=default,ou=pwpolicies,dc=ldap01,dc=pwb,dc=com
EOF 

客户端验证ldapadd 用户修改密码时是否满足包含1个字符1个数字一个大写字母一个小写字母的策略,自行验证 

5.加载审计模块 Auditlog

开启密码审计功能主要用于记录 OpenLDAP 用户修改密码,以及密码审计

[root@ldap01 log]# cat << EOF | ldapadd -Y EXTERNAL -H ldapi:///
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: {1}auditlog

dn: olcOverlay=auditlog,olcDatabase={2}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcAuditLogConfig
olcAuditlogFi
EOF

6.常见用户密码问题

超过输入密码的次数账户被锁

[root@ldap01 ~]# cat << EOF | ldapadd -x -D "cn=admin,dc=ldap01,dc=pwb,dc=com"  -w 123456 -H ldap://ldap01.pwb.com
dn: uid=ldap2,ou=People,dc=ldap01,dc=pwb,dc=com
changetype: modify
delete: pwdAccountLockedTime  #超过次数后,用户隐藏属性为打上 pwdAccountLockedTime 标志,删除标签即可
EOF

密码过期解决方案  

#密码过期主要是由于账号没有在指定时间内修改密码,当超过的时间后会提示用户密码过期 将用户的密码信息删除,然后添加密码字符串即可
[root@ldap01 ~]# cat << EOF | ldapadd -x -D "cn=admin,dc=ldap01,dc=pwb,dc=com"  -w 123456 -H ldap://ldap01.pwb.com
dn: uid=ldap2,ou=People,dc=ldap01,dc=pwb,dc=com
dn:  cn=shilei,cn=ops,ou=IT,dc=shileizcc,dc=com
changtype: modify
delete: userpassword
userpassword: 123
-
add: userpassword
userpassword: 123
EOF

  

 

  

  

 

  

 

posted @ 2022-04-22 23:31  百衲本  阅读(4987)  评论(1编辑  收藏  举报
cnblogs_post_body { color: black; font: 0.875em/1.5em "微软雅黑" , "PTSans" , "Arial" ,sans-serif; font-size: 15px; } cnblogs_post_body h1 { text-align:center; background: #333366; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 23px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } cnblogs_post_body h2 { text-align:center; background: #006699; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 20px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } cnblogs_post_body h3 { background: #2B6695; border-radius: 6px 6px 6px 6px; box-shadow: 0 0 0 1px #5F5A4B, 1px 1px 6px 1px rgba(10, 10, 0, 0.5); color: #FFFFFF; font-family: "微软雅黑" , "宋体" , "黑体" ,Arial; font-size: 18px; font-weight: bold; height: 25px; line-height: 25px; margin: 18px 0 !important; padding: 8px 0 5px 5px; text-shadow: 2px 2px 3px #222222; } 回到顶部 博客侧边栏 回到顶部 页首代码 回到顶部 页脚代码