06-OpenLDAP密码策略
阅读视图
- openldap密码策略
- OpenLDAP服务端定制密码策略
- 客户端策划策略实例
- 定义用户第一次登录就修改密码
问题排查手册
重点推荐官方文档
备注:本文依然承接系列文。
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服务端定制密码策略
编辑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 ]
查看是否加载了ppolicy.la模块
查看属性是否定义
定义密码策略组
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, 可能会导致错误。
定义用户遵守指定的密码策略
默认情况下,所有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. 客户端策划策略测试实例
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次)
密码复杂度
在客户端输入密码123456
[user1@test01 ~]$ passwd
Changing password for user user1.
Enter login(LDAP) password:
New password:
BAD PASSWORD: it is too simplistic/systematic
密码锁定
pwdLockout
在客户端的用户user1上连续输入错误密码5次, 然后查看该用户属性。
当超过了指定次数后,会自动在隐藏属性打上
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" 删除该属性即可
密码过期解决方案
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. 客户端配置
修改pam_ldap.conf配置文件
必须有如下配置
bind_policy soft
pam_password md5
pam_lookup_policy yes
pam_password clear_remove_old
重启nslcd进程
[root@test01 ~]# /etc/init.d/nslcd restart
测试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密码策略的更多相关文章
- mysql5.7 密码策略
查看现有的密码策略 mysql> SHOW VARIABLES LIKE 'validate_password%';+-------------------------------------- ...
- MYSQL57密码策略修改
1.查看当前的密码测试 show variables like 'validate_password%';
- Windows 2008修改密码策略方法
Windows Server 2008默认强制要求定期更改密码,这个功能有时实在是让人烦不胜烦,适当情况下可以考虑关闭. 方法如下: 1.按windows键+R(或者点开始---动行)打开运行窗口,输 ...
- MySQL5.7.12新密码登录方式及密码策略
在Centos6.6上安装MySQL5.7.12时,遇到了一个问题 安装后在/root目录下没有发现有.mysql_secret这个文件,所以没有没法按照官方文档上说的那样使用,这里记录下, 解决方式 ...
- WindowsServer2012 取消密码策略
1.打开“组策略管理”界面:管理工具 >> 组策略管理,如果找不到该功能,则需要先安装,在“服务管理器”里面“添加新功能”.(或者:开始——运行——gpmc.msc) 2.依次打开“林”& ...
- 略过 Mysql 5.7的密码策略
之前从mysql 5.6的时候,mysql 还没有密码策略这个东东,所以我们每个用户的密码都可以随心所欲地设置,什么123 ,abc 这些,甚至你搞个空格,那也是OK的. 而mysql.user 表里 ...
- Windows2008修改密码策略简单介绍
Windows2008修改密码策略简单介绍 Windows的密码策略,确实是挺繁琐的,刚接触SharePoint2010,装的windows2008 R2,就遇到了改密码策略的问题. 打开本地安全策略 ...
- pam密码策略
PAM 的使用历史 PAM 是关注如何为服务验证用户的 API.在使用 PAM 之前,诸如 login(和 rlogin.telnet.rsh)之类的应用程序在 /etc/passwd 中查找用户名, ...
- Windows Server 2008 R2 /2012 修改密码策略
今天建了域环境,在添加新用户的时候,发现用简单的密码时域安全策略提示密码复杂度不够,于是我就想在域安全策略里面把密码复杂度降低一点. 问题: 在“管理工具 >> 本地安全策略 > ...
随机推荐
- SqlServer 更改数据库名称
1.首先选中需要更改数据库右击属性找到文件, 此处可直接修改数据库逻辑名称 2.选中数据库右击选择重命名修改数据库名称. 3.将数据库进行分离,找到数据库文件mdf与ldf文件,直接更改文件名称 4. ...
- HW2017笔试编程题
一.写一个转换字符串的函数 1.题目描述 将输入字符串中下标为偶数的字符连成一个新的字符串输出,需要注意两点: (1)如果输入字符串的长度超过20,则转换失败,返回“ERROR!”字符串: (2)输入 ...
- nmcli工具详解
目录 1. nmcli 安装 2. nmcli 基本选项 3. general 常规选项 3.1 status 3.2 hostname 3.3 permissions 3.4 loggin 4. n ...
- 经济学人使用Golang构建微服务历程回顾
关键点 经济学人内容分发系统需要更大的灵活性,将内容传递给日益多样化的数字渠道.为了实现这一灵活性目标并保持高水平的性能和可靠性,平台从一个单体结构过渡到微服务体系结构. 用Go编写的服务是新系统的一 ...
- 如何做自己的服务监控?spring boot 1.x服务监控揭秘
1.准备 下载可运行程序:http://www.mkyong.com/spring-boot/spring-boot-hello-world-example-jsp/ 2.添加服务监控依赖 <d ...
- 使用BizTalk实现RosettaNet B2B So Easy
使用BizTalk实现RosettaNet B2B So Easy 最近完成了一个vmi-hub的B2B项目,使用Rosettanet 2.0的标准与一家品牌商,OEM,供应商实现B2B.一共交换4个 ...
- JavaWeb学习 (十七)————JSP属性范围
所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...
- python的Web框架,Django模型系统二,模型属性,及数据库进阶查询
原始数据接上篇文章来操作.可能需要查看后才能懂.点击这里查看 1.常用的模型字段类型 官方文档:https://docs.djangoproject.com/en/2.1/ref/models/fie ...
- 一个小时学会PHP
一.PHP概要 PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广 ...
- Asp.Net初学小结
第一章 1.搭建Asp.net开发环境 1).net FrameWork(VS) 2)IIS(xp:5.1,2003:6.0,vista:70,win7:7.5) C:\Windows\Mic ...