实施OpenLDAP密码策略

在本指南中,您将学习如何实施OpenLDAP密码策略。在OpenLDAP中,密码策略是通过以下方式实现的: Password Policy (ppolicy) Overlay。策略覆盖提供了各种密码控制机制,包括:

  • 老化密码-最小和最大年龄
  • 密码质量
  • 自动帐户锁定
  • 控制密码重用和复制
  • 帐户超时
  • 重设所需密码
  • 可接受的密码内容
  • 宽限登录名在过期后的特定时间段内使用过期的密码。

有关政策覆盖的更多信息, man slapo-ppolicy

实施OpenLDAP密码策略

加载密码策略模块

要实施LDAP密码策略,您需要确保: ppolicy.la 模块被加载到LDAP数据库中。运行命令以列出已加载的模块。

slapcat -n 0 | grep -i module

在当前的LDAP配置中,没有密码策略模块。 ppolicy.la将被加载。请参阅上面的命令输出。

dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/libexec/openldap
olcModuleLoad: {0}back_mdb.la
olcModuleLoad: {1}memberof.la
olcModuleLoad: {2}refint.la
structuralObjectClass: olcModuleList
olcAttributeTypes: {15}( 1.3.6.1.4.1.4754.1.99.1 NAME 'pwdCheckModule' DESC 
 'Loadable module that instantiates "check_password() function' EQUALITY cas
 op AUXILIARY MAY pwdCheckModule )

因此,要加载模块,请创建如下所示的LDIF文件,以定义如何向slapd添加密码策略模块。

请注意,在此设置中,模块位于路径下方。 /usr/libexec/openldap 由…定义 olcModulePath 属性。

vi load-ppolicy-mod.ldif
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: ppolicy.la

将模块加载到LDAP数据库中。

ldapadd -Y EXTERNAL -H ldapi:/// -f load-ppolicy-mod.ldif

加载模块后,再次列出slapd模块将为您提供类似于以下内容的输出(在某些情况下可能有所不同):

slapcat -n 0 | grep -i module
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/libexec/openldap
olcModuleLoad: {0}back_mdb.la
olcModuleLoad: {1}memberof.la
olcModuleLoad: {2}refint.la
olcModuleLoad: {3}ppolicy.la
structuralObjectClass: olcModuleList

创建密码策略OU容器

创建一个LDAP OU容器,该容器将用于存储默认密码策略。

vi pwpolicy-ou.ldif
dn: ou=pwpolicy,dc=ldapmaster,dc=kifarunix-demo,dc=com
objectClass: organizationalUnit
objectClass: top
ou: pwpolicy
ldapadd -Y EXTERNAL -H ldapi:/// -f pwpolicy-ou.ldif

创建一个OpenLDAP密码策略覆盖DN

将ppolicy模块加载到slapd数据库中后,继续添加LDAP密码策略 叠加层 DN。

将密码策略覆盖添加到每个LDAP数据库后端。此设置中的Mdb。

ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b  cn=config olcDatabase | grep mdb

请参见下面的输出中突出显示的行。

dn: olcDatabase={1}mdb,cn=config
olcDatabase: {1}mdb
dn: olcOverlay={0}memberof,olcDatabase={1}mdb,cn=config

创建具有以下内容的LDIF文件,以使用配置选项将ppolicy Overlay DN添加到slapd中。相应地替换域组件。

vi pwpolicyoverlay.ldif
dn: olcOverlay=ppolicy,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcPPolicyConfig
olcOverlay: ppolicy
olcPPolicyDefault: cn=default,ou=pwpolicy,dc=ldapmaster,dc=kifarunix-demo,dc=com
olcPPolicyHashCleartext: TRUE

在上面找到适用于策略覆盖的配置选项的更多信息 man slapo-ppolicy

更新数据库。

ldapadd -Y EXTERNAL -H ldapi:/// -f pwpolicyoverlay.ldif

创建一个OpenLDAP密码策略

现在,您可以在上面创建的默认密码策略下创建LDAP密码策略。 cn=default,ou=pwpolicy,dc=ldapmaster,dc=kifarunix-demo,dc=com.

政策 叠加层是 pwd政策 对象类。因此,在定义策略时,可以使用“ ObjectClass属性”部分中描述的任何属性。 man slapo-ppolicy

vi ldap-pwpolicies.ldif
dn: cn=default,ou=pwpolicy,dc=ldapmaster,dc=kifarunix-demo,dc=com
objectClass: person
objectClass: pwdPolicyChecker
objectClass: pwdPolicy
cn: pwpolicy
sn: pwpolicy
pwdAttribute: userPassword
pwdMinAge: 0
pwdMaxAge: 5184000
pwdInHistory: 5
pwdCheckQuality: 2
pwdMinLength: 12
pwdExpireWarning: 432000
pwdGraceAuthNLimit: 5
pwdLockout: TRUE
pwdLockoutDuration: 0
pwdMaxFailure: 3
pwdFailureCountInterval: 0
pwdReset: TRUE
pwdMustChange: TRUE
pwdAllowUserChange: TRUE
pwdSafeModify: FALSE

为了正确描述上面使用的密码属性, man slapo-ppolicy。有关所使用的对象类的说明, 对象类和属性

更新拍击密码策略。

ldapadd -Y EXTERNAL -H ldapi:/// -f ldap-pwpolicies.ldif

测试密码策略

尝试更改环境中现有OpenLDAP用户之一的密码,以测试实施的OpenLDAP密码策略的有效性。

上面执行的检查包括:

  • 密码历史答:将5个先前使用的密码保存在数据库中,以避免重复使用。
  • pwdCheckQuality:将值设置为2。服务器检查密码的语法,如果服务器无法检查语法,则返回拒绝密码的错误。
  • pwdMinLength:将密码中接受的最小字符数设置为12。

尝试设置一个简单的密码。

ldappasswd -H ldapi:/// -Y EXTERNAL -S "uid=june,ou=people,dc=ldapmaster,dc=kifarunix-demo,dc=com"
New password: password
Re-enter new password: password
...
Result: Constraint violation (19)
Additional info: Password fails quality checking policy

重用现有密码。

ldappasswd -H ldapi:/// -Y EXTERNAL -S "uid=june,ou=people,dc=ldapmaster,dc=kifarunix-demo,dc=com"
New password: password1234
Re-enter new password: password1234
...
Result: Constraint violation (19)
Additional info: Password is not being changed from existing value

在测试用户是否在首次登录时被提示重设密码时,我注意到的一件事是尽管进行了设置, pwdMustChange: TRUE 属性 pwdReset: TRUE 这不适用于用户输入。

因此,要提示用户在首次登录时重设密码,请编辑用户条目, pwdReset:真

例如,要要求LDAP数据库中的June用户重置密码,只需按如下所示编辑和更新条目:

vim mod-june.ldif
dn: uid=june,ou=people,dc=ldapmaster,dc=kifarunix-demo,dc=com
changetype: modify
add: pwdReset
pwdReset: TRUE
ldapmodify -Y EXTERNAL -H ldapi:/// -f mod-june.ldif

接下来,要对此进行测试,请尝试以6月用户身份登录系统。

如果您使用SSSD进行身份验证,请清除缓存。

systemctl stop sssd;rm -rf /var/lib/sss/db/*;systemctl restart sssd

登录;

ssh -l june localhost
ju[email protected]'s password: current-password Password expired. Change your password now. Creating directory '/home/june'. Welcome to Ubuntu 18.04 LTS (GNU/Linux 4.15.0-20-generic x86_64)  * Documentation:  https://help.ubuntu.com  * Management:     https://landscape.canonical.com  * Support:        https://ubuntu.com/advantage  * Canonical Livepatch is available for installation.    - Reduce system reboots and improve kernel security. Activate at:      https://ubuntu.com/livepatch Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings The programs included with the Ubuntu system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Sun Jan  5 11:43:09 2020 from ::1 WARNING: Your password has expired. You must change your password now and login again! Current Password: current-pass New password: New-pass-that-meets-policies-set Retype new password: New-pass-that-meets-policies-set passwd: password updated successfully

了解有关OpenLDAP密码策略的更多信息 管理员指南:重叠式广告

实施密码复杂度政策

如您所见,您还可以使用简单的密码,只要它符合上述某些策略,就可以轻松破解。

那么,OpenLDAP如何执行密码复杂性检查策略?要检查密码的复杂性,您需要安装一个附加的LDAP模块。

在本演示中,我们将使用 pqChecker 这使您可以定义密码的以下功能:

  • 所需的大写字母数。
  • 所需的小写字母数。
  • 所需的特殊字符(非字母字符)数。
  • 所需的位数(0-9)。
  • 禁止字符

在CentOS 8上安装pqChecker

现在,您已经在CentOS 8系统上设置了OpenLDAP服务器,将pqchecker模块安装在同一服务器上。

先决条件

下载并解压缩OpenLDAP源tarball(如果尚未下载),以确保您具有必需的构建工具。请参阅上方的OpenLDAP服务器设置链接以了解操作方法。

接下来,安装JAVA SDK。该演示使用Java 11。

dnf install java-11-openjdk-devel

克隆pqchecker github存储库

git clone https://bitbucket.org/ameddeb/pqchecker.git

安装pqchecker

转到OpenLDAP源目录并构建依赖关系。

cd openldap-2.4.48
./configure
make depend

接下来,转到克隆的pqchecker目录并按如下所示安装:

cd ~/pqchecker
autoreconf -f -i
./configure LDAPSRC=/root/openldap-2.4.48 JAVAHOME=/usr/lib/jvm/java-11-openjdk-11.0.5.10-0.el8_0.x86_64 PARAMDIR=/etc/openldap/pqchecker libdir=/usr/libexec/openldap

替换变量的值, LDAPSRC,JAVAHOME,PARAMDIRlibdir 因此。

make install /etc/openldap/pqchecker

当前在下面安装了pqchecker /usr/libexec/openldap/pqchecker.so

安装完成后,调整pqchecker目录的所有权。

chown -R ldap:ldap /etc/openldap/pqchecker/

更新上面创建的密码策略OU容器, cn=default,ou=pwpolicy,dc=ldapmaster,dc=kifarunix-demo,dc=com,加载pqchecker模块。

cd ~
vim mod-ppolicy.ldif
dn: cn=default,ou=pwpolicy,dc=ldapmaster,dc=kifarunix-demo,dc=com
changetype: modify
add: pwdCheckModule
pwdCheckModule: pqchecker.so
ldapadd -Y EXTERNAL -H ldapi:/// -f mod-ppolicy.ldif

pqChecker模块的结构

pqChecker提供的密码复杂度设置为 /etc/openldap/pqchecker/pqparams.dat 在pqchecker安装期间自动创建的配置文件。

默认情况下,启用以下复杂性检查:

less /etc/openldap/pqchecker/pqparams.dat
# Data format: 0|[email protected])..
# Or         : 1|[email protected])..
#
# 1st character is the modified passwords broadcast flag. 1 -> Broadcast, 0 -> Don't broadcast
# 2nd character is a separator
# U: Uppercase, L: Lowercase, D: Digit, S: Special characters -> from 3rd to 10th character.
# From the 11th character begins the list of forbidden characters
# Default: No broadcast, 1 Uppercase, 1 Lowercase, 1 digit, 1 Special and no forbidden characters
0|01010101

这基本上是指根据以下格式设置的密码:UULLDDSS必须至少包含一个大写字母,一个小写字母,一位数字和一个不带禁止字符的特殊字符(01010101)。

现在,此强制实施的另一个限制是忽略上面设置的最小密码长度策略。 pwdMinLength:12

因此,要以最小密码长度策略进行比赛,有必要调整pqChecker的密码格式,以使总密码长度至少为12个字符。

此处使用的格式为:

0|04040202

也就是说,密码必须至少包含它。

  • 四个大写字母
  • 4个小写字母
  • 2位数
  • 两个特殊字符。

测试密码复杂度

在LDAP连接系统中将密码重置为LDAP用户。本演示使用Ubuntu 18.04作为测试客户端。

使用您的旧密码。

[email protected]:~$ passwd
Current Password: password 
New password: [email protected]#nk19
Retype new password: [email protected]#nk19
Password change failed. Server message: Password is in history of old passwords
passwd: Authentication token is no longer valid; new one required
passwd: password unchanged

使用遵循定义的复杂性的新密码, ZX#[email protected]

[email protected]:~$ passwd
Current Password: 
New password: 
Retype new password: 
passwd: password updated successfully

如果您知道实现OpenLDAP密码复杂性检查的其他技巧,请在注释中添加建议。

总结了有关如何实施OpenLDAP密码策略的指南。

Sidebar