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. 編輯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模塊

  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
    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: [email protected]
    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. 定義用戶第一次登錄就修改密碼

```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進程
    shell [root@test01 ~]# /etc/init.d/nslcd restart

  3. 測試user5登錄系統
    ```shell
    [root@test01 ~]# ssh [email protected]
    [email protected]'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 [email protected]
    [email protected]'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,那麼修改密碼值時用戶必須發送當前密碼。

    本人暫時也還沒理解透

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章