Page tree

如需转载请标注内容地址为: https://wiki.shileizcc.com/confluence/pages/viewpage.action?pageId=40566878

Skip to end of metadata
Go to start of metadata

未经允许不得转载

OpenLDAP 密码策略与审计控制

密码策略

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

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

通过本地实现密码策略介绍

当管理、创建用户时,管理员会根据 /etc/login.defs 文件所定义的数据以及调用 /etc/skel 目录下环境附加给用户作为用户属性。/etc/login.defs 包含邮件目录、密码有效期、密码更改天数、密码最小长度、密码失效前警告天数、UID 范围、GID 范围、是否创建家目录、密码使用加密算法等。

当用户修改初始密码会根据 /etc/login.defs 范围进行修改,当用 pam 定义密码策略时,用户会根据 pam 所定义的密码策略进行修改。

实现方式如下。

编辑 /etc/pam.d/system-auth 文件,定位 password 行,添加如下内容。

password requisite pam_cracklib.so minlen=8 ucredit=-2 lcredit=-2 dcredit=-3 ocredit=-1

用户修改密码时,密码长度至少为 8 位,大写和小写字母各两位,数字有 3 位,特殊字符有 1 位,否则显示密码不符合密码策略规范。

更多 pam 模块及参数,可以查看每个模块相关说明文档,参数说明表:

参数参数说明
minlen用户密码设置的最小长度。
ucredit用户密码必须包含多少个大写字母:N>=0,表示至少个数,N<=0,表示必须个数。
lcredit用户密码必须包含多少个小写字母:N>=0,表示至少个数,N<=0,表示必须个数。
dcredit用户密码必须包含多少个数字:N>=0,表示至少个数,N<=0,表示必须个数。
ocredit用户密码必须包含多少个特殊字符:N>=0,表示至少个数,N<=0,表示必须个数。

密码策略属性详解

密码策略涉及的属性如下。

pwdAllowUserChange:允许用户修改其密码。

pwdAttribute:pwdPolicy 对象的一个属性,用于识别用户密码。

pwdExpireWarning:密码过期前告警天数。

pwdFailureCountInterval:密码失败后恢复时间。

pwdGraceAuthNLimit:密码过期后不能登入的天数,0 代表禁止登录。

pwdInHistory:开启密码历史记录,用户保证不能和之前设置的密码相同。

pwdLockout:超过定义次数,账号被锁定。

pwdLockoutDuration:密码连接输入错误次数后,账号锁定时间。

pwdMaxAge:密码有效期,到期需要强制修改密码。

pwdMaxFaliure:密码最大失效次数,超过后账号被锁定。

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 定制密码策略

OpenLDAP 服务端定制密码策略

通过 OpenLDAP 服务端定制用户密码策略,需要服务端加载 ppolicy 模块并定制密码策略后即可。加载 ppolicy 模块有两种方法:一种是修改 slapd.conf 配置文件(已经抛弃此配置方式),另一种则是通过修改 cn=config 数据库完成。查看模块:

$ cat /etc/openldap/slapd.d/cn\=config/cn\=module\{0\}.ldif
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 fd5b4379
dn: cn=module{0}
objectClass: olcModuleList
cn: module{0}
structuralObjectClass: olcModuleList
entryUUID: 27e57f1e-e94d-1037-8c90-63d8fb67fa40
creatorsName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
createTimestamp: 20180511095518Z
olcModulePath: /usr/lib64/openldap/
olcModuleLoad: {0}memberof
olcModuleLoad: {1}refint
entryCSN: 20180511095518.594577Z#000000#000#000000
modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
modifyTimestamp: 20180511095518Z

查看 ppolicy.la 模块

$ ls /usr/lib64/openldap/ppolicy.la

加载模块:(需要结合目前的系统环境,对序号进行修改)

$ cat << EOF | ldapadd -Y EXTERNAL -H ldapi:///
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: {2}ppolicy.la
EOF

添加 objectClass 对象,增加额外属性和值,命令如下:

$ 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=shileizcc,dc=com
olcPPolicyHashCleartext: TRUE
olcPPolicyUseLockout: TRUE
EOF

定义密码策略组

要定义密码策略组,按以下步骤操作。

1)可以在 pwpolicies 条目下创建不同的密码策略,加载即可,命令如下:

$ cat << EOF | ldapadd -x -D "cn=admin,dc=shileizcc,dc=com" -w shileizcc -H ldap://shileizcc.com
dn: ou=pwpolicies,dc=shileizcc,dc=com
ou: pwpolicies
objectClass: organizationalUnit
EOF

2)定义默认密码规则。

类似于系统层面的 /etc/login.defs 对文件的默认添加用户属性的定义。可以定义不同的密码策略应用至不同的用户,实现更精准的密码控制,命令如下:

$ cat << EOF | ldapadd -x -D "cn=admin,dc=shileizcc,dc=com" -w shileizcc -H ldap://shileizcc.com
dn: cn=default,ou=pwpolicies,dc=shileizcc,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

3)定义用户规则制定密码策略。

默认情况下,所有 OpenLDAP 遵守默认密码策略。要实现不同用户或者不同组具有不同的密码策略,可以根据自己的需求定制密码策略。例如,

cn=security,ou=policy,dc=shileizcc,dc=com

定义安全部门所拥有的密码策略,命令如下:

dn: uid=slzcc,dc=shileizcc,dc=com
objectClass: inetOrgPerson
uid: slzcc
cn: sl
sn: zcc
loginShell: /bin/bash
homDirectory: /home/slzcc
homePhone: xxxxxxxxxxx
exployeeNumber: 134958
mail: slzcc@shileizcc.com
pwdPolicySubentry: cn=security,ou=policy,dc=shileizcc,dc=com

注:经过修改后,slzcc 用户不遵守默认定义的密码策略,而遵守 security 所定义的密码策略。给用户添加时则需要写入单独的配置:

$ cat << EOF | ldapmodify -x -D "cn=admin,dc=shileizcc,dc=com" -w shileizcc -H ldap://shileizcc.com
dn: cn=shilei,dc=shileizcc,dc=com
changetype: modify
add: pwdPolicySubentry
pwdPolicySubentry: cn=default,ou=pwpolicies,dc=shileizcc,dc=com
EOF

如果对全局进行配置,则可以加入如下权限:

$ 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=shileizcc,dc=com" write by anonymous auth by * read
olcAccess: {1}to * by self write by dn="cn=default,ou=pwpolicies,dc=shileizcc,dc=com" write by * read
EOF

定义用户登录需改密码

为了增强用户密码安全性,一般需要用户初始密码。方式有两种:一种为用户登录系统,然后通过 passwd 命令重置密码。另一种则是用户登录系统时提示初始密码。关于第一种方法不进行介绍,直接使用 passwd 后跟用户名即可修改。

为了定义用户密码控制策略,将 pwdReset 属性和值添加值用户的属性中,否则不生效,命令如下:

$ cat << EOF | ldapadd -x -D "cn=admin,dc=shileizcc,dc=com" -w shileizcc -H ldap://shileizcc.com
dn: cn=shilei,cn=ops,ou=IT,dc=shileizcc,dc=com
changetype: modify
replace: pwdReset
pwdReset: TRUE
EOF

注:如果没有响应的组织,则通过下面的命令进行添加:

$ cat << EOF | ldapadd -x -D "cn=admin,dc=shileizcc,dc=com" -w shileizcc  -H ldap://shileizcc.com
dn: ou=IT,dc=shileizcc,dc=com
ou: IT
objectClass: top
objectClass: organizationalUnit

dn: cn=Ops,ou=IT,dc=shileizcc,dc=com
cn: Ops
gidNumber: 500
objectClass: posixGroup
objectClass: top

dn: cn=shilei,cn=ops,ou=IT,dc=shileizcc,dc=com
uid: shilei
cn: shilei
sn: shi
givenName: lei
displayName: shilei
objectClass: posixAccount
objectClass: top
objectClass: person
objectClass: shadowAccount
objectClass: inetOrgPerson
uidNumber: 1009
gidNumber: 1009
gecos: System Manager
loginShell: /bin/bash
homeDirectory: /home/shilei
userPassword: shilei
shadowLastChange: 17654
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
shadowExpire: -1
employeeNumber: 18002
homePhone: 0531-xxxxxxxx
mobile: 152xxxxxxxxx
mail: shileizcc@126.com
postalAddress: BeiJing
initials: Test
EOF

为了查看定义用户的策略信息,可运行以下命令:

$ ldapsearch -x -LLL -D "cn=admin,dc=shileizcc,dc=com" -H ldap://shileizcc.com -w shileizcc uid=shilei +
dn: cn=shilei,cn=ops,ou=IT,dc=shileizcc,dc=com
structuralObjectClass: inetOrgPerson
entryUUID: 19c24658-eb80-1037-921b-7fbd22e01290
creatorsName: cn=admin,dc=shileizcc,dc=com
createTimestamp: 20180514050501Z
pwdReset: TRUE
entryCSN: 20180514053040.714197Z#000000#000#000000
modifiersName: cn=admin,dc=shileizcc,dc=com
modifyTimestamp: 20180514053040Z
entryDN: cn=shilei,cn=ops,ou=IT,dc=shileizcc,dc=com
subschemaSubentry: cn=Subschema
hasSubordinates: FALSE

pwdReset 属性隐藏属性,默认 ldapsearch 无法获取隐藏属性,通过 “+” 号可获取查询包含的隐藏属性。

为了查看用户策略信息,可运行以下命令

$ ldapwhoami -x -D "cn=shilei,cn=ops,ou=IT,dc=shileizcc,dc=com" -H ldap://shileizcc.com -w shilei -e ppolicy -v
ldap_initialize( ldap://shileizcc.com:389/??base )
ldap_bind: Success (0); Password must be changed (Password expires in 0 seconds)
dn:cn=shilei,cn=ops,ou=IT,dc=shileizcc,dc=com
Result: Success (0)

客户端配置

要配置客户端,按以下步骤设置。

1)要使客户端识别服务端密码策略,运行以下命令。

$ echo "bind_policy soft" >> /etc/pam_ldap.conf
$ echo "pam_password md5" >> /etc/pam_ldap.conf
$ echo "pam_lookup_policy yes" >> /etc/pam_ldap.conf
$ echo "pam_password clear_remove_old" >> /etc/pam_ldap.conf

2)启动 nslcd 进程,命令如下

$ systemctl restart nslcd

3)要验证客户端,命令如下

$ ssh shilei@192.168.218.209

注:当再次输入新密码时,按回车后就会断开终端,然后再吃登入系统时,要使用新密码才可以登录。

4)要查看用户密码策略信息,可运行以下命令

$ ldapwhoami -x -D "cn=shilei,cn=ops,ou=IT,dc=shileizcc,dc=com" -H ldap://shileizcc.com -w shilei -e ppolicy -v
ldap_initialize( ldap://shileizcc.com:389/??base )
dn:cn=shilei,cn=ops,ou=IT,dc=shileizcc,dc=com
Result: Success (0)

此时,发现 shilei 用户密码已经完成修改。此操作 OpenLDAP 服务端上完成查询操作。

密码审计控制

加载审计模块 Auditlog

开启密码审计功能主要用于记录 OpenLDAP 用户修改密码,以及密码审计。具体命令如下:

$ 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
olcAuditlogFile: /var/log/slapd/auditlog.log
EOF

当有用户修改密码后,服务端会自动在所定义的目录下新建 auditlog.log 文件,用于记录用户修改密码的时间和属性信息。

在客户端验证密码策略时效

为了验证 OpenLDAP 服务端所定义的密码策略是否生效,运行以下命令:

$ ssh shilei@192.168.218.209
$ passwd

客户端通过 OpenLDAP 用户登录服务器,并成功修改初始密码,如果密码不符合密码策略规范,修改密码时会提示密码不符合密码策略规范,提示重新输入,知道密码符合所定义的位置。

注意:如果无法执行 passwd 则可能是没有权限造成的,需要写入 Database 权限:

$ cat << EOF | ldapmodify -c -Y EXTERNAL -Q -H ldapi:///
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by dn="cn=admin,dc=shileizcc,dc=com" write by anonymous auth by * read
olcAccess: {1}to * by self write by dn="cn=admin,dc=shileizcc,dc=com" write by * read
EOF

常见用户密码处理方法

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

如果账号被锁,可以通过如下方式首先进行检查:

$ ldapwhoami -x -D "cn=shilei,cn=ops,ou=IT,dc=shileizcc,dc=com" -H ldap://shileizcc.com -w shilei -e ppolicy -v
...
ldap_bin: Invalid credentials (49); Account locked
 
$ ldapsearch -x -LLL -D "cn=admin,dc=shileizcc,dc=com" -H ldap://shileizcc.com -w shileizcc uid=shilei +
...
pwdFailureTime: 20150325124533Z
pwdFailureTime: 20150325124537Z
pwdFailureTime: 20150325124543Z
pwdFailureTime: 20150325124547Z
pwdFailureTime: 20150325124551Z
pwdAccountLockedTime: 2015032512455iZ
...

问题出在了输入次数超过限制后,用户被锁定。通过服务端查看密码输错次数,超过次数后,用户隐藏属性为打上 pwdAccountLockedTime 标志,说明账户被锁,通过 pwdFailureTime 属性记录错误输入时间及次数。

通过下面的命令删除标签即可:

$ cat << EOF | ldapadd -x -D "cn=admin,dc=shileizcc,dc=com" -w shileizcc  -H ldap://shileizcc.com
dn: cn=shilei,cn=ops,ou=IT,dc=shileizcc,dc=com
changetype: modify
delete: pwdAccountLockedTime
EOF

然后重新查看用户信息,验证登录是否可以为 Success。

$ ldapwhoami -x -D "cn=shilei,cn=ops,ou=IT,dc=shileizcc,dc=com" -H ldap://shileizcc.com -w shilei -e ppolicy -v

如何提示修改初始密码

当用户登录时,要提示用户修改初始密码,可运行以下命令。

为了定义用户密码控制策略,将 pwdReset 属性和值添加值用户的属性中,否则不生效,命令如下:

$ cat << EOF | ldapadd -x -D "cn=admin,dc=shileizcc,dc=com" -w shileizcc -H ldap://shileizcc.com
dn: uid=dpcwc,ou=people,dc=shileizcc,dc=com
changetype: modify
repliace: pwdReset
pwdReset: TRUE
EOF

为了查看定义用户的策略信息,可运行以下命令:

$ ldapsearch -x -LLL -D "cn=admin,dc=shileizcc,dc=com" -H ldap://shileizcc.com -w shileizcc uid=shilei +
dn: cn=shilei,cn=ops,ou=IT,dc=shileizcc,dc=com
structuralObjectClass: inetOrgPerson
entryUUID: 19c24658-eb80-1037-921b-7fbd22e01290
creatorsName: cn=admin,dc=shileizcc,dc=com
createTimestamp: 20180514050501Z
pwdReset: TRUE
entryCSN: 20180514053040.714197Z#000000#000#000000
modifiersName: cn=admin,dc=shileizcc,dc=com
modifyTimestamp: 20180514053040Z
entryDN: cn=shilei,cn=ops,ou=IT,dc=shileizcc,dc=com
subschemaSubentry: cn=Subschema
hasSubordinates: FALSE

pwdReset 属性隐藏属性,默认 ldapsearch 无法获取隐藏属性,通过 “+” 号可获取查询包含的隐藏属性。

删除属性为:

$ cat << EOF | ldapmodify -x -D "cn=admin,dc=shileizcc,dc=com" -w shileizcc -H ldap://shileizcc.com
dn: cn=shilei,cn=ops,ou=IT,dc=shileizcc,dc=com
changetype: modify
delete: pwdReset
EOF

密码过期解决方案

密码过期主要是由于账号没有在指定时间内修改密码,当超过的时间后会提示用户密码过期。

则将用户的密码信息删除,然后添加密码字符串即可,命令如下:

$ cat << EOF | ldapmodify -Y EXTERNAL -H ldapi:///
dn:  cn=shilei,cn=ops,ou=IT,dc=shileizcc,dc=com
changtype: modify
delete: userpassword
userpassword: 123
-
add: userpassword
userpassword: 123
EOF

The current time to create this page is  and the end time is  ,Document status is STABLE ,Write a version of the interface V1.1.0 。

  • No labels

5 Comments

  1. hi, 我配置了LDAP 的ssh 认证, 用户可以正常登陆,修改密码, 最近在搞密码策略,

    想设置用户首次登陆必须修改密码, 照着文档配置了 pwdReset: TRUE , 用户始终无法登陆,  /var/log/message  报错 

    Mar 18 05:11:43 localhost nslcd[928]: [7ed7ab] <authc="shilei"> ldap_result() failed: Insufficient access: Operations are restricted to bind/unbind/abandon/StartTLS/modify password
    Mar 18 05:11:43 localhost nslcd[928]: [7ed7ab] <authc="shilei"> cn=shilei,ou=people,dc=starwave,dc=local: lookup failed: Insufficient access
    Mar 18 05:11:43 localhost nslcd[928]: [7ed7ab] <authc="shilei"> cn=shilei,ou=people,dc=starwave,dc=local: "${shadowWarning:--1}": password will expire in 1 day

    有什么见解吗, 谢谢


    1. 不生效可能是 /etc/pam.d/system-auth 配置不正确,客户端没有正确识别服务端的密码策略。可以先检查一遍是否跟文档中一致,如果无法解决找一下相关文档纠正下。

      我有空时会找个实例测一下。

      1. 我看文档中写着 客户端要配置pam

        echo "bind_policy soft" >> /etc/pam_ldap.conf
        echo "pam_password md5" >> /etc/pam_ldap.conf
        echo "pam_lookup_policy yes" >> /etc/pam_ldap.conf
        echo "pam_password clear_remove_old" >> /etc/pam_ldap.conf

        你这个客户端是centos6 的吧, centos7 并没有这个文件啊

        1. 是的这个是 centos 6 的,后续我会试一下 centos 7 的,但是目前没有环境。抱歉