06-OpenLDAP密码策略
阅读视图
1. openldap密码策略
2. OpenLDAP服务端定制密码策略
3. 客户端策划策略实例
4. 定义⽤户第⼀次登录就修改密码
问题排查⼿册
重点推荐
备注:本⽂依然承接系列⽂。
1. openldap密码策略
OpenLDAP密码策略包括以下⼏个⽅⾯
密码的⽣命周期
保存密码历史,避免在⼀段时间内重⽤相同的密码
密码强度,新密码可以根据各种特性进⾏检查。
密码连续认证失败的最⼤次数。
⾃动帐号锁定
⽀持⾃动解锁帐号或管理员解锁帐号。
优雅(Grace)绑定(允许密码失败后登录的次数)。
密码策略可以在任意DIT范围定义,可以是⽤户、组或任意组合。
2. 密码策略属性详解
密码策略涉及的属性如下:
pwdAllowUserChange:允许⽤户修改其密码
pwdAttribute, pwdPolicy:对象的⼀个属性,⽤于标识⽤户密码。默认值(⽬前唯⼀⽀持的)是userPassword
pwdExpireWarning:密码过期前警告天数
pwdFailureCountInterval:多久时间后重置密码失败次数, 单位是秒
pwdGraceAuthNLimit:密码过期后不能登录的天数,0代表禁⽌登录。
pwdInHistory:开启密码历史记录,⽤于保证不能和之前设置的密码相同。
pwdLockout:定义⽤户错误密码输⼊次数超过pwdMaxFailure定义后, 是否锁定⽤户, TRUE锁定(默认).
pwdLockoutDuration:密码连续输⼊错误次数后,帐号锁定时间。
pwdMaxAge:密码有效期,到期需要强制修改密码, 2592000是30天
pwdMaxFailure:密码最⼤失效次数,超过后帐号被锁定。
pwdMinAge:密码最⼩有效期, 默认为0, ⽤户随时更改密码, 如果定义了, ⽤户在离上次更改密码 + 定义
的时间之内不能更改密码pwdMinLength:⽤户修改密码时最短的密码长度
pwdMustChange:⽤户在帐户锁定后由管理员重置帐户后是否必须更改密码, 并且只有在pwdLockout为TRUE时才相关, 如果值为FLASE(默认值), 管理员帮⽤户解锁⽤户后, ⽤户不必更改密码, 如果为TRUE, 就必须更改密码。如果使⽤pwdReset来解锁⽤户, 其值将覆盖此属性
pwdSafeModify:该属性控制⽤户在密码修改操作期间是否必须发送当前密码。如果属性值为FALSE(缺省值),则⽤户不必发送其当前密码。如果属性值为TRUE,那么修改密码值时⽤户必须发送当前密码。
pwdLockoutDuration:帐号锁定后,不能⾃动解锁,此时需要管理员⼲涉
3. OpenLDAP服务端定制密码策略
1. 编辑f,修改添加如下内容,重新⽣成数据库并加载slapd进程
[root@mldap01 ~]# vim /etc/f
修改部分:
modulepath /usr/lib/openldap
modulepath /usr/lib64/openldap
moduleload ppolicy.la
添加部分:添加在最后⼀⾏
overlay ppolicy
ppolicy_default cn=default,ou=Pwpolicies,dc=gdy,dc=com
ppolicy_hash_cleartext
ppolicy_use_lockout
// 解释
overlay ppolicy  必须添加
ppolicy_default cn=default,ou=Pwpolicies,dc=gdy,dc=com  指定默认的密码规则条⽬, 如果例外条⽬需要在⽤户中定义pwdPolicySubentry DN ppolicy_hash_cleartext  密码加密存储, 默认⽀持明⽂存储不安全
ppolicy_use_lockout  超过最多失败次数后,锁定账号时的提⽰
[root@mldap01 ~]# slaptest -f /etc/f -F /etc/openldap/slapd.d/
config file testing succeeded
[root@mldap01 ~]# chown -R ldap.ldap /etc/openldap
[root@mldap01 ~]# /etc/init.d/slapd restart
Stopping slapd:                                            [  OK  ]
Starting slapd:                                            [  OK  ]
2. 查看是否加载了ppolicy.la模块
3. 查看属性是否定义
4. 定义密码策略组
```shell
1. 添加ou条⽬
[root@mldap01 slapd.d]# cat << EOF | ldapadd -x -D "cn=Manager,dc=gdy,dc=com" -W
dn: ou=ppolicy,dc=gdy,dc=com
objectClass: organizationalUnit
ou: ppolicy
EOF
Enter LDAP Password:
adding new entry "ou=ppolicy,dc=gdy,dc=com"
2. 定义默认密码规则
[root@mldap01 slapd.d]# cat << EOF | ldapadd -x -D "cn=Manager,dc=gdy,dc=com" -W
dn: cn=default,ou=ppolicy,dc=gdy,dc=com
cn: default
objectClass: pwdPolicy
objectClass: person
pwdAllowUserChange: TRUE
pwdAttribute: userPassword
pwdExpireWarning: 259200
pwdFailureCountInterval: 0
root的初始密码pwdGraceAuthNLimit: 5
pwdInHistory: 5
pwdLockout: TRUE
pwdLockoutDuration: 300
pwdMaxAge: 2592000
pwdMaxFailure: 5
pwdMinAge: 0
pwdMinLength: 8
pwdMustChange: TRUE
sn: summy value
EOF
Enter LDAP Password:
adding new entry "cn=default,ou=ppolicy,dc=gdy,dc=com"
// 备注
注意此处不⽤添加 pwdSafeModify: TRUE, 可能会导致错误。
5. 定义⽤户遵守指定的密码策略
默认情况下,所有OpenLDAP遵守默认密码策略。要实现不通⽤户或者不同组具有不通的密码策略,可以根据⾃⼰的需求定制密码策略。例如, cn=security,ou=policy,dc=gdy,dc=com定义安全部门所拥有的密码策略,命令如下:
dn: uid=wulei,dc=gdy,dc=com
objectClass: inetOrgPerson
uid: wulei
cn: wu lei
sn: lei
loginShell: /bin/bash
homeDirectory: /home/wulei
homePhone: xxxxxxxxx
employeeNumber: 123456
mail: wulei@gdy
pwdPolicySubentry: cn=security,ou=policy,dc=gdy,dc=com
// 备注
在⽤户添加pwdPolicySubentry: DN, 那么就可以不⽤遵循默认的条例, ⽽使⽤这⾥定义的条例
3. 客户端策划策略测试实例
1. pwdInHistory密码历史记录
```shell
在客户端先使⽤ssh登录⼀个⽤户user3, 然后执⾏passwd修改6次密码。在服务端查看如下
[root@mldap01 ~]# ldapsearch -x -LLL uid=user3 +
dn: uid=user3,ou=people,dc=gdy,dc=com
structuralObjectClass: account
entryUUID: 5c68cef0-f82d-1037-8087-6ff088bb15ae
creatorsName: cn=Manager,dc=gdy,dc=com
createTimestamp: 20180530081530Z
pwdHistory: 20180530094257Z#1.3.6.1.4.1.1466.115.121.1.40#41#{crypt}\(1\)MrxsXdF
k$gM/H7GbqYBjqz5yU4zaag/
pwdHistory: 20180530094316Z#1.3.6.1.4.1.1466.115.121.1.40#41#{crypt}\(1\)tblcN7B
d$WUiE.5vNb5A8sTImEBbtZ.
pwdHistory: 20180530094347Z#1.3.6.1.4.1.1466.115.121.1.40#41#{crypt}\(1\)khuMHWG
v$29N0SMJg6.tJSNOXXGCOV.
pwdHistory: 20180530094418Z#1.3.6.1.4.1.1466.115.121.1.40#41#{crypt}\(1\)CTydGID
O$akbXWqVk2xXffBz50dSIA0
pwdHistory: 20180530094442Z#1.3.6.1.4.1.1466.115.121.1.40#41#{crypt}$1\(98Y14qO
W\)helhYVnLFfSp68qEdo/j4.
pwdChangedTime: 20180530094442Z
entryCSN: 20180530094442.343733Z#000000#000#000000
modifiersName: uid=user3,ou=people,dc=gdy,dc=com
modifyTimestamp: 20180530094442Z
entryDN: uid=user3,ou=people,dc=gdy,dc=com
subschemaSubentry: cn=Subschema
hasSubordinates: FALSE
pwdHistory 最多只记录5次(已定义5次)
```
2. 密码复杂度
shell 在客户端输⼊密码123456 [user1@test01 ~]$ passwd Changing password for user user1. Enter login(LDAP) password: New password: BAD PASSWORD: it is too simplistic/systematic
3. 密码锁定pwdLockout
在客户端的⽤户user1上连续输⼊错误密码5次, 然后查看该⽤户属性。
当超过了指定次数后,会⾃动在隐藏属性打上pwdAccountLockedTime标志。如上图。
并通过pwdFailureTime属性记录错误输⼊时间及次数
解决⽅法:
```shell
[root@mldap01 slapd]# cat << EOF | ldapadd -x -D "cn=Manager,dc=gdy,dc=com" -W
dn: uid=user1,ou=people,dc=gdy,dc=com
changetype: modify
delete: pwdAccountLockedTime
EOF
Enter LDAP Password:
modifying entry "uid=user1,ou=people,dc=gdy,dc=com"
删除该属性即可
```
4. 密码过期解决⽅案pwdGraceAuthNLimit等等属性
4. 定义⽤户第⼀次登录就修改密码