Loading

搭建openldap环境,配置密码策略

CentOS Linux release 7.8.2003 (Core)
openldap-clients-2.4.44-21.e17_6.x86_64
openldap-servers-2.4.44-21.e17_6.x86_64
openldap-2.4.44-21.e17_6.x86_64

一、环境准备

关闭 selinux firewalld

setenforce 0
systemctl stop firewalld.service
systemctl disable firewalld.service

二、OPENLDAP服务搭建

1、安装openldap

yum install -y openldap openldap-clients openldap-servers

2、启动openldap

systemctl start slapd  
systemctl enable slapd

3、配置ldap超级管理员

生成密码,等一下作为 olcRootPW 的值

slappasswd -s "123456"
{SSHA}yGu5OYMOpwVa2I/6Z8uwac/bo2KHjaW+

创建admin.ldif 文件

# 先查看对应的配置, 有的版本不是{2}hdb, 要相对修改
ls /etc/openldap/slapd.d/cn=config/

# admin.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=example,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}yGu5OYMOpwVa2I/6Z8uwac/bo2KHjaW+

dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=admin,dc=example,dc=com" read by * none

导入配置

ldapmodify -Y EXTERNAL -H ldapi:/// -f admin.ldif

4、配置数据库

openldap默认使用的数据库是BerkeleyDB

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap:ldap /var/lib/ldap/DB_CONFIG

导入schema

ls /etc/openldap/schema/*.ldif | xargs -I {} sudo ldapadd -Y EXTERNAL -H ldapi:/// -f {}

5、创建默认DN

创建base.ldif 文件

dn: dc=example,dc=com
o: Example.Inc
objectClass: top
objectclass: dcObject
objectclass: organization

dn: cn=admin,dc=example,dc=com
cn: admin
objectClass: organizationalRole
description: Directory Manage

导入配置

ldapadd -x -w 123456 -D "cn=admin,dc=example,dc=com" -f base.ldif

查一下是否有刚才加的DN

ldapsearch -x -D "cn=admin,dc=example,dc=com" -w123456

6、禁止匿名访问

默认情况下匿名用户可以获取所有用户信息,甚至是密码字段,虽然密码字段是经过加密的那也很危险
创建disable_anon.ldif文件

# disable_anon.ldif
dn: cn=config
changetype: modify
add: olcDisallows
olcDisallows: bind_anon

dn: cn=config
changetype: modify
add: olcRequires
olcRequires: authc

dn: olcDatabase={-1}frontend,cn=config
changetype: modify
add: olcRequires
olcRequires: authc

导入配置

ldapadd -Q -Y EXTERNAL -H ldapi:/// -f disable_anon.ldif

三、添加密码策略

1、加载ppolicy模块

查看是否已加载任何模块

slapcat -n 0 | grep olcModuleLoad

如果上面命令没有任何输出,使用ldapadd加载模块

# add_ppolicy_module.ldif
dn: cn=module,cn=config
cn: module 
objectClass: olcModuleList
olcModulePath: /usr/lib64/openldap
olcModuleLoad: ppolicy.la

# 执行
ldapadd -Y EXTERNAL -Q -H ldapi:/// -f add_ppolicy_module.ldif

# 执行完在用上面的命令验证是否加载进来
slapcat -n 0 | grep olcModuleLoad

# 输出:olcModuleLoad: {0}ppolicy.la
# 说明加载成功

2、创建密码策略

增加用户修改密码的权限

# allow_user_modify_pwd.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword by self write by dn.base="cn=admin,dc=example,dc=com" write by anonymous auth by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {1}to * by dn.base="cn=admin,dc=example,dc=com" write by self write by * read

# 执行
ldapmodify -Y EXTERNAL -H ldapi:/// -f allow_user_modify_pwd.ldif

可以用一个ou来组织我们的策略

# create_pwd_policy.ldif
# ou=policies
dn: ou=policies,dc=example,dc=com
objectClass: organizationalUnit
ou: policies

# cn=default
dn: cn=default,ou=policies,dc=example,dc=com
objectClass: pwdPolicy
objectClass: organizationalRole
cn: default
pwdAllowUserChange: TRUE
pwdAttribute: 2.5.4.35 #userPassword
pwdMinLength: 6
pwdCheckQuality: 2
pwdInHistory: 3
pwdLockout: TRUE
pwdLockoutDuration: 10
pwdMaxFailure: 3

# 执行
ldapadd -x -D "cn=admin,dc=example,dc=com" -w 123456 -f create_pwd_policy.ldif

应用default策略为默认策略,该olcPPolicyDefault属性是可选的。它用于创建默认密码策略,以便在没有其他策略适用于用户时重新使用。我建议这样做。如果不创建默认策略,则必须将pwdPolicySubentry添加到要对其实施密码策略的每个条目。此属性的值必须与带有pwdPolicy类的条目的DN匹配。如果不匹配,将没有默认策略。

即如果对象不设置pwdPolicySubentry属性则默认都用当前default策略。

# set_default_policy.ldif
dn: olcOverlay=ppolicy,olcDatabase={2}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcPPolicyConfig
olcOverlay: ppolicy
olcPPolicyDefault: cn=default,ou=policies,dc=example,dc=com

# 执行
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f set_default_policy.ldif

3、添加pqchecker密码检查模块

具有ppolicy覆盖的OpenLDAP目录服务器允许管理功能强大的密码策略。除密码内容质量外,策略覆盖还直接支持此策略的所有方面。密码内容强度管理留给外部插件,该插件必须是本机共享库。pqChecker组件提供了此功能。它允许检查密码的内容,即:

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

官网给出的方法安装pqchecker

rpm -iv http://www.meddeb.net/pub/pqchecker/rhel/7/pqchecker-2.0.0-1.el7.x86_64.rpm

# 找到二进制包安装的位置后续会用到
ls /usr/lib64/openldap/pqchecker.so*
# /usr/lib64/openldap/pqchecker.so.2.0.0

查看策略配置文件(后续修改这个文件来配置策略)

cat /etc/openldap/pqchecker/pqparams.dat
# 0|01010101
Order (left to right) Field Length Sequence Range Meaning of content
1 N| 2 characters 1,2 0| or 1| 1| → Broadcasts passwords, 0| → Don't broadcasts
2 UU 2 characters 3,4 00 → 99 Number of required uppercase characters
3 LL 2 characters 5,6 00 → 99 Number of required lowercase characters
4 DD 2 characters 7,8 00 → 99 Number of required digits
5 SS 2 characters 9,10 00 → 99 Number of required special characters
6 The rest indefinite 11 → end of line All characters List of forbidden characters. This list may be empty

配置默认密码策略对新策略的支持

#add_pqchecker.ldif
dn: cn=default,ou=policies,dc=example,dc=com
changetype: modify
add: objectClass
objectclass: pwdPolicyChecker
-
add: pwdcheckmodule
pwdCheckModule: pqchecker.so.2.0.0

#通过命令将上面的设置,生效
ldapmodify -a -D "cn=admin,dc=example,dc=com" -w 123456 -f add_pqchecker.ldif

四、创建用户来测试策略

1、创建测试用用户

# add_test_user.ldif
dn: ou=people1,dc=example,dc=com
objectClass: organizationalUnit
ou: people1

dn: uid=joe,ou=people1,dc=example,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: Captain
sn: Smeth
uid: joe
userPassword: 123456

dn: uid=joe1,ou=people1,dc=example,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: Captain
sn: Smeth
uid: joe1
userPassword: 123456

dn: ou=people2,dc=example,dc=com
objectClass: organizationalUnit
ou: people2

dn: uid=ben,ou=people2,dc=example,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: Captain
sn: Smeth
uid: ben
userPassword: 123456

dn: uid=ben1,ou=people2,dc=example,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: Captain
sn: Smeth
uid: ben1
userPassword: 123456

# 执行
ldapadd -x -D "cn=admin,dc=example,dc=com" -w 123456 -f add_test_user.ldif

参考

posted @ 2021-02-04 10:54  nicepink  阅读(1625)  评论(0)    收藏  举报