06-OpenLDAP密码策略

摘要:
阅读openldap密码策略openldap服务器自定义密码策略客户端规划策略实例定义用户首次登录密码修改疑难解答手册密钥推荐官方文档注意:本文继续遵循一系列文章。定义用户遵守指定的密码策略默认情况下,所有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. 编辑slapd.conf,修改添加如下内容,重新生成数据库并加载slapd进程

    [root@mldap01 ~]# vim /etc/openldap/slapd.conf
    
    修改部分:
    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/openldap/slapd.conf -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模块

    06-OpenLDAP密码策略第1张

  3. 查看属性是否定义

    06-OpenLDAP密码策略第2张

  4. 定义密码策略组

    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. 定义默认密码规则
    
    ```shell
    [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
    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.com
    pwdPolicySubentry: cn=security,ou=policy,dc=gdy,dc=com
    
    // 备注
    在用户添加pwdPolicySubentry: DN, 那么就可以不用遵循默认的条例, 而使用这里定义的条例
    

3. 客户端策划策略测试实例

  1. pwdInHistory密码历史记录

    在客户端先使用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. 密码复杂度

    在客户端输入密码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次, 然后查看该用户属性。

    06-OpenLDAP密码策略第3张

    当超过了指定次数后,会自动在隐藏属性打上pwdAccountLockedTime标志。如上图。
    并通过pwdFailureTime属性记录错误输入时间及次数

    解决方法:

    [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等等属性

    06-OpenLDAP密码策略第4张

4. 定义用户第一次登录就修改密码

```shell
1. 定义用户密码控制策略
[root@mldap01 ~]# cat << EOF | ldapadd -x -D "cn=Manager,dc=gdy,dc=com" -W 
> dn: uid=user3,ou=People,dc=gdy,dc=com
> changetype: modify
> replace: pwdReset
> pwdReset: TRUE
> EOF
Enter LDAP Password: 
modifying entry "uid=user3,ou=People,dc=gdy,dc=com"

2. 查看定义用户的策略信息, pwdReset属于隐藏属性,需要+查看
[root@mldap01 ~]# ldapsearch -x -LLL uid=user3 +
dn: uid=user3,ou=People,dc=gdy,dc=com
structuralObjectClass: account
entryUUID: 92945c00-f29d-1037-9978-7f120cbb343e
creatorsName: cn=Manager,dc=gdy,dc=com
createTimestamp: 20180523062337Z
pwdReset: TRUE
entryCSN: 20180524081057.839314Z#000000#000#000000
modifiersName: cn=Manager,dc=gdy,dc=com
modifyTimestamp: 20180524081057Z
entryDN: uid=user3,ou=People,dc=gdy,dc=com
subschemaSubentry: cn=Subschema
hasSubordinates: FALSE

主要查看pwdReset: TRUE
3. 另一种查看用户策略信息
[root@mldap01 cn=config]# ldapwhoami -x -D uid=user3,ou=People,dc=gdy,dc=com -W -e ppolicy -v
ldap_initialize( <DEFAULT> )
Enter LDAP Password:     # 输入user3用户的密码
ldap_bind: Success (0); Password must be changed (Password expires in 0 seconds)     # 关键有这行
dn:uid=user3,ou=People,dc=gdy,dc=com
Result: Success (0)
```

5. 客户端配置

  1. 修改pam_ldap.conf配置文件

    必须有如下配置
    bind_policy soft
    pam_password md5
    pam_lookup_policy yes
    pam_password clear_remove_old
    
  2. 重启nslcd进程

    [root@test01 ~]# /etc/init.d/nslcd restart
    
  3. 测试user5登录系统

    [root@test01 ~]# ssh user3@127.0.0.1
    user3@127.0.0.1's password:      # 输入密码
    You are required to change your LDAP password immediately.
    Creating directory '/home/user3'.
    WARNING: Your password has expired.
    You must change your password now and login again!
    Changing password for user user3.
    Enter login(LDAP) password:      # 输入密码
    New password:             # 输入新密码
    Retype new password:      # 重复输入新密码
    LDAP password information changed for user3
    passwd: all authentication tokens updated successfully.
    Connection to 127.0.0.1 closed.
    
    [root@test01 ~]# ssh user3@127.0.0.1
    user3@127.0.0.1's password: 
    Last login: Wed May 30 17:00:23 2018 from localhost
    

问题排查指南

由于在搭建时总是出现问题,导致走一步坑一步。特地总结一些排查问题的方法。

例1:openldap客户端ssh总是登录不上,报错与密码错误相同

场景描述:在做密码策略的时候,openldap客户端总是ssh登录不上,密码命名正确,也要重新输入,一直重试3遍后,到期失败。看服务器日志也看不出什么。

排查方法:按照一层一层排查。

  • 首先1:先su - $USER,判断openldap客户端是否正常。

  • 其次2:使用ldapwhoami看密码是否正常。

    ldapwhoami -x -D uid=user2,ou=People,dc=gdy,dc=com -W -e ppolicy -v -h 192.168.244.17
    
  • 其次3:删除安全策略,测试看是否正常

  • 最后4:在网上找到一篇,在pam模块中添加一条实例,重试,结果正常。

例2:新增密码策略后, 不管是修改密码, 还是登录后即修改密码, 都报错

场景描述: 在做登录后即修改密码的实验的时候, 总是报错passwd: Authentication token manipulation error, 不管是第一次登录就修改密码, 还是正常的执行passwd修改, 都会报错如上, openldap客户端/var/log/secure也报错May 25 15:17:29 1 passwd: pam_unix(passwd:chauthtok): user "user4" does not exist in /etc/passwd

排查方法: 需要静下心一层一层排查

  • 首先1: 查服务端日志, 无果, 查客户端日志, 如上。

  • 其次2: 搜索引擎搜索相关报错, 搜到需要添加access, 可是我已经添加。此次方式失败, 参考链接如下:

    https://www.cnblogs.com/lemon-le/p/d668fc96897e0aed2d3f5a2fa0ce0497.html
    https://stackoverflow.com/questions/26254767/ldap-users-not-able-to-change-their-password-using-passwd-command
    
  • 其次三: 回滚版本, 意思是将刚添加的密码策略属性, 删除, 尝试更改密码。发现更改密码成功。此时感觉密码策略与access有冲突。

  • 其次四: 将密码策略属性逐个添加, 边添加边更改密码, 最后发现是属性pwdSafeModify有问题。

  • 最后五: 找到属性pwdSafeModify问题, 再来解决。发现当有属性pwdSafeModify FALSE时, 无法登录后立马修改密码, 而修改执行passwd, 而当pwdSafeModify TRUE时, 修改密码报错如上。而当属性pwdSafeModify不存在时, 功能正常。

  • 最后官网找了下pwdSafeModify的解释。

    该属性控制用户在密码修改操作期间是否必须发送当前密码。如果属性值为FALSE(缺省值),则用户不必发送其当前密码。如果属性值为TRUE,那么修改密码值时用户必须发送当前密码。

    本人暂时也还没理解透

免责声明:文章转载自《06-OpenLDAP密码策略》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇聊一聊sockmap 以及ebpfTaro实现VirtualList虚拟列表下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

图文介绍openLDAP在windows上的安装配置

目录 概述 测试环境 安装过程 配置启动 客户端介绍 多级DC的ldif文件的配置 [一]、概述 什么叫LDAP呢,概念的东西这里就不多讲了,网上搜索下有很多,本文的重点是介绍如何在windows平台上安装和配置openLDAP软件。 openLDAP官方网站:http://www.openldap.org/ openLDAP官网只提供了linux平台...

LDAP-openldap服务部署和测试(YUM安装)

  1. 概述2. 服务端部署过程2.1 软件包说明2.2 部署过程2.3 配置过程3. 测试4. 生成LDIF格式文件4.1 安装migrationtools工具4.2 用migrationtools生成ldif文件4.3 添加ldif到ldap数据库5. 日志配置5.1 openldap的日志级别5.2 配置日志功能6. 客户端配置6.1 基础环境准...

Redhat 5上OPENLDAP的安装备份和恢复

1. 安装 1.1. 安装环境 查看当前操作系统版本: [root@vmw9181-app ~]# cat /etc/issue Red Hat Enterprise Linux Server release 5.3 (Tikanga) 1.2. 安装openldap-*包 使用yum源安装openldap包 [root@vmw9181-app yum....

OpenLDAP安装与配置

因为公司内部有多个系统,而每个系统都有自己的一套用户认证。每次新进或离职一位同事,运维的小伙伴们,都要在每个系统上去添加用户,搞得小伙伴们很不爽。 为了让运维的小伙伴们,从这个繁琐的工作中解放出来,同时也为了统一管理所有系统的用户认证,我们决定启用ldap。这样每个系统的用户认证全部通过ldap来进行,而每个系统的权限就使用各自系统的权限管理即可。 一、O...

openldap系列

openldap系列 阅读视图 系列介绍 openldap系列目录 1. 系列介绍 本系列文档大部分来自于郭大勇老师的《OpenLDAP实战指南》,少部分来自于互联网。所有文档均已经过本人测试。如诸位看官搭建的时候,建议先保证环境与文档中的一致,以便减少实际操作中出现问题的概率。如果出现问题,建议先回滚操作,意思是把刚操作的进行配置删除,以达到最基本的...

02-OpenLDAP配置

OpenLDAP配置 在OpenLDAP 2.4版本中,配置OpenLDAP的方法有两种:一种通过修改配置文件实现配置,另一种通过修改数据库的形式完成配置。 通过配置数据库完成各种配置,属于动态配置且不需要重新启动slapd进程服务。此配置数据库(cn=config)包含一个基于文本的集合LDIF文件(位于/etc/openldap/slapd.d目录下)...