RHCSA系列:在RHEL 7中设置基于LDAP的身份验证 – 第14部分

我们将从概述一些LDAP基础知识(它是什么,它在哪些地方使用以及为什么)开始这篇文章,并展示如何使用Red Hat Enterprise Linux 7系统设置LDAP服务器和配置客户端以对其进行身份验证。

RHCSA Series: Setup LDAP Server and Client Authentication – Part 14

正如我们将看到的,还有其他一些可能的应用程序场景,但在这本指南中,我们将完全专注于基于LDAP的身份验证。此外,请记住,由于主题的广泛性,我们在这里只覆盖了它的基础知识,但你可以参考概述中提到的文档以获取更深入的详细信息。

出于同样的原因,你会注意到我决定为了简洁起见省略了对LDAP工具的手册页的几个引用,但相应的解释就在指尖之间(例如man ldapadd)。

话虽如此,让我们开始吧。

我们的测试环境

我们的测试环境包括两个RHEL 7盒子:

Server: 192.168.0.18. FQDN: rhel7.mydomain.com
Client: 192.168.0.20. FQDN: ldapclient.mydomain.com

如果你愿意,你可以使用在第12部分:自动化RHEL 7安装中使用Kickstart安装的机器作为客户端。

LDAP是什么?

LDAP代表轻量级目录访问协议,它由一组协议组成,允许客户端通过网络访问中央存储的信息(例如登录shell的目录,家目录的绝对路径和其他典型的系统用户信息),这些信息应该可以从不同的位置访问或者对大量终端用户可用(另一个例子是公司所有员工的家庭地址和电话号码的目录)。

将这些(以及更多)信息集中存储意味着可以更容易地维护和被所有被授权使用的人访问。

下图提供了LDAP的简化图示,并在下面进行了详细描述:

LDAP Diagram

详细解释上述图示。

  1. LDAP目录中的条目表示单个信息单元,并由所谓的专有名称唯一标识。
  2. 属性是与条目关联的信息片段(例如地址,可用联系电话号码和电子邮件地址)。
  3. 每个属性分配一个或多个由空格分隔的。每个条目中唯一的值称为相对专有名称。

话虽如此,让我们继续进行服务器和客户端的安装配置。

安装和配置LDAP服务器和客户端

RHEL 7中,LDAP是通过OpenLDAP实现的。要安装服务器和客户端,请分别使用以下命令:

# yum update && yum install openldap openldap-clients openldap-servers
# yum update && yum install openldap openldap-clients nss-pam-ldapd

安装完成后,我们需要关注一些事情。以下步骤仅在服务器上执行,除非有明确的说明:

1. 确保SELinux不会妨碍,通过在服务器和客户端上持久地启用以下布尔值

# setsebool -P allow_ypbind=0 authlogin_nsswitch_use_ldap=0

其中allow_ypbind对于基于LDAP的认证是必需的,而authlogin_nsswitch_use_ldap可能被一些应用程序所需。

2. 启用并启动服务:

# systemctl enable slapd.service
# systemctl start slapd.service

请记住,您也可以使用systemctl禁用、重启或停止服务:

# systemctl disable slapd.service
# systemctl restart slapd.service
# systemctl stop slapd.service

3. 由于slapd服务以ldap用户运行(您可以使用ps -e -o pid,uname,comm | grep slapd来验证),为了使服务器能够修改只能以root身份运行的行政工具创建的条目,该用户应拥有/var/lib/ldap目录。关于这一点稍后会详细说明。

在更改此目录的递归所有权之前,将其中的示例数据库配置文件slapd复制到其中:

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

4. 设置一个OpenLDAP管理用户并分配一个密码:

# slappasswd

如下面的图片所示:

Set LDAP Admin Password

创建一个 LDIF 文件(名为 ldaprootpasswd.ldif),内容如下:

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}PASSWORD

其中:

  1. PASSWORD 是之前得到的哈希字符串。
  2. cn=config 表示全局配置选项。
  3. olcDatabase 表示一个特定的数据库实例名称,通常可以在 /etc/openldap/slapd.d/cn=config 目录中找到。

参考之前提供的理论背景,ldaprootpasswd.ldif 文件将向 LDAP 目录添加一个条目。在该条目中,每一行代表一个属性:值对(其中 dn、changetype、add 和 olcRootPW 是属性,冒号右边的字符串是它们的相应值)。

在我们继续之前,您可能想记住这一点,请注意,我们在本文的其余部分使用相同的通用名称 (cn=),每个步骤都依赖于上一个步骤。

5. 现在,通过指定指向 ldap 服务器的 URI 来添加相应的 LDAP 条目,其中只允许协议/主机/端口字段。

# ldapadd -H ldapi:/// -f ldaprootpasswd.ldif 

输出应类似于:

LDAP Configuration

并从 /etc/openldap/schema 目录中导入一些基本的 LDAP 定义:

# for def in cosine.ldif nis.ldif inetorgperson.ldif; do ldapadd -H ldapi:/// -f /etc/openldap/schema/$def; done
LDAP Definitions

6. 使 LDAP 在其数据库中使用您的域名。

创建另一个 LDIF 文件,我们将其称为 ldapdomain.ldif,并使用以下内容,根据需要替换您的域(在 dc=Domain Component 中)和密码:

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=Manager,dc=mydomain,dc=com" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=mydomain,dc=com

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

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}PASSWORD

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
  dn="cn=Manager,dc=mydomain,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=mydomain,dc=com" write by * read

然后按照如下方式加载:

# ldapmodify -H ldapi:/// -f ldapdomain.ldif
LDAP Domain Configuration

7. 现在是向我们的 LDAP 目录添加一些条目的时候了。属性和值在下面的文件中由冒号 (:) 分隔,我们将这个文件命名为 baseldapdomain.ldif

dn: dc=mydomain,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: mydomain com
dc: mydomain

dn: cn=Manager,dc=mydomain,dc=com
objectClass: organizationalRole
cn: Manager
description: Directory Manager

dn: ou=People,dc=mydomain,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=mydomain,dc=com
objectClass: organizationalUnit
ou: Group

向 LDAP 目录添加条目:

# ldapadd -x -D cn=Manager,dc=mydomain,dc=com -W -f baseldapdomain.ldif
Add LDAP Domain Attributes and Values

8. 创建一个名为 ldapuser 的 LDAP 用户(adduser ldapuser),然后在 ldapgroup.ldif 中创建 LDAP 组的定义。

# adduser ldapuser
# vi ldapgroup.ldif

添加以下内容。

dn: cn=Manager,ou=Group,dc=mydomain,dc=com
objectClass: top
objectClass: posixGroup
gidNumber: 1004

其中 gidNumber 是 ldapuser 在 /etc/group 中的 GID)并加载它:

# ldapadd -x -W -D "cn=Manager,dc=mydomain,dc=com" -f ldapgroup.ldif

9. 使用定义了 ldapuser 的 LDIF 文件(ldapuser.ldif):

dn: uid=ldapuser,ou=People,dc=mydomain,dc=com
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: ldapuser
uid: ldapuser
uidNumber: 1004
gidNumber: 1004
homeDirectory: /home/ldapuser
userPassword: {SSHA}fiN0YqzbDuDI0Fpqq9UudWmjZQY28S3M
loginShell: /bin/bash
gecos: ldapuser
shadowLastChange: 0
shadowMax: 0
shadowWarning: 0

并加载它:

# ldapadd -x -D cn=Manager,dc=mydomain,dc=com -W -f ldapuser.ldif
LDAP User Configuration

同样,您可以删除刚刚创建的用户条目:

# ldapdelete -x -W -D cn=Manager,dc=mydomain,dc=com "uid=ldapuser,ou=People,dc=mydomain,dc=com"

10. 允许通过防火墙通信:

# firewall-cmd --add-service=ldap

11. 最后,但同样重要的是,使客户端能够使用 LDAP 进行身份验证。

为了帮助我们在最后一步,我们将使用 authconfig 工具(一个配置系统身份验证资源的接口)。

使用以下命令,如果在 LDAP 服务器上成功进行身份验证后,请求的用户的主目录不存在,则会创建该主目录:

# authconfig --enableldap --enableldapauth --ldapserver=rhel7.mydomain.com --ldapbasedn="dc=mydomain,dc=com" --enablemkhomedir --update
LDAP Client Configuration

总结

在本文中,我们已经解释了如何设置针对LDAP服务器的基本身份验证。要进一步配置本指南中描述的设置,请参考RHEL 7系统管理员指南中的第13章 – LDAP配置,特别注意使用TLS进行安全设置。

如有任何问题,请随时使用下方的评论表单提出。

Source:
https://www.tecmint.com/setup-ldap-server-and-configure-client-authentication/