RHCSA 系列(十四): 在 RHEL 7 中设置基于 LDAP 的认证

在这篇文章中,我们将首先罗列一些 LDAP 的基础知识(它是什么,它被用于何处以及为什么会被这样使用),然后向你展示如何使用 RHEL 7 系统来设置一个 LDAP 服务器以及配置一个客户端来使用它达到认证的目的。

RHCSA 系列:设置 LDAP 服务器及客户端认证 – Part 14

正如你将看到的那样,关于认证,还存在其他可能的应用场景,但在这篇指南中,我们将只关注基于 LDAP 的认证。另外,请记住,由于这个话题的广泛性,在这里我们将只涵盖它的基础知识,但你可以参考位于总结部分中列出的文档,以此来了解更加深入的细节。

基于相同的原因,你将注意到:为了简洁起见,我已经决定省略了几个位于 man 页中 LDAP 工具的参考,但相应命令的解释是近在咫尺的(例如,输入 man ldapadd)。

那还是让我们开始吧。

我们的测试环境

我们的测试环境包含两台 RHEL 7机器:


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

如若你想,你可以使用在 RHCSA 系列(十二): 使用 Kickstart 完成 RHEL 7 的自动化安装 中使用 Kickstart 安装的机子来作为客户端。

LDAP 是什么?

LDAP 代表轻量级目录访问协议Lightweight Directory Access Protocol,并包含在一系列协议之中,这些协议允许一个客户端通过网络去获取集中存储的信息(例如所登录的 shell 的路径,家目录的绝对路径,或者其他典型的系统用户信息),而这些信息可以从不同的地方访问到或被很多终端用户获取到(另一个例子是含有某个公司所有雇员的家庭地址和电话号码的目录)。

对于那些被赋予了权限可以使用这些信息的人来说,将这些信息进行集中管理意味着可以更容易地维护和获取。

下面的图表提供了一个简化了的关于 LDAP 的示意图,在下面将会进行更多的描述:

LDAP 示意图

下面是对上面示意图的一个详细解释。

  • 在一个 LDAP 目录中,一个条目entry代表一个独立单元或信息,被所谓的区别名DN,Distinguished Name 唯一识别。
  • 一个属性attribute是一些与某个条目相关的信息(例如地址,有效的联系电话号码和邮箱地址)。
  • 每个属性被分配有一个或多个值value,这些值被包含在一个以空格为分隔符的列表中。每个条目中那个唯一的值被称为一个相对区别名RDN,Relative Distinguished Name。

接下来,就让我们进入到有关服务器和客户端安装的内容。

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

在 RHEL 7 中, LDAP 由 OpenLDAP 实现。为了安装服务器和客户端,分别使用下面的命令:


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

一旦安装完成,我们还需要关注一些事情。除非显示地提示,下面的步骤都只在服务器上执行:

1. 在服务器和客户端上,为了确保 SELinux 不会妨碍挡道,长久地开启下列的布尔值:


  1. # setsebool -P allow_ypbind=0 authlogin_nsswitch_use_ldap=0

其中 allow_ypbind 为基于 LDAP 的认证所需要,而 authlogin_nsswitch_use_ldap则可能会被某些应用所需要。

2. 开启并启动服务:


  1. # systemctl enable slapd.service
  2. # systemctl start slapd.service

记住你也可以使用 systemctl 来禁用,重启或停止服务:


  1. # systemctl disable slapd.service
  2. # systemctl restart slapd.service
  3. # systemctl stop slapd.service

3. 由于 slapd 服务是由 ldap 用户来运行的(你可以使用 ps -e -o pid,uname,comm | grep slapd 来验证),为了使得服务器能够更改由管理工具创建的条目,该用户应该有目录 /var/lib/ldap 的所有权,而这些管理工具仅可以由 root 用户来运行(紧接着有更多这方面的内容)。

在递归地更改这个目录的所有权之前,将 slapd 的示例数据库配置文件复制进这个目录:


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

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


  1. # slappasswd

正如下一幅图所展示的那样:

设置 LDAP 管理密码

然后以下面的内容创建一个 LDIF 文件(ldaprootpasswd.ldif):


  1. dn: olcDatabase={0}config,cn=config
  2. changetype: modify
  3. add: olcRootPW
  4. olcRootPW: {SSHA}PASSWORD

其中:

  • PASSWORD 是先前得到的经过哈希处理的字符串。
  • cn=config 指的是全局配置选项。
  • olcDatabase 指的是一个特定的数据库实例的名称,并且通常可以在/etc/openldap/slapd.d/cn=config 目录中发现。

根据上面提供的理论背景,ldaprootpasswd.ldif 文件将添加一个条目到 LDAP 目录中。在那个条目中,每一行代表一个属性键值对(其中 dn,changetype,add 和 olcRootPW 为属性,每个冒号右边的字符串为相应的键值)。

随着我们的进一步深入,请记住上面的这些,并注意到在这篇文章的余下部分,我们使用相同的通用名Common Names (cn=),而这些余下的步骤中的每一步都将与其上一步相关。

5. 现在,通过特别指定相对于 ldap 服务的 URI ,添加相应的 LDAP 条目,其中只有 protocol/host/port 这几个域被允许使用。


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

上面命令的输出应该与下面的图像相似:

LDAP 配置

接着从 /etc/openldap/schema 目录导入一个基本的 LDAP 定义:


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

LDAP 定义

6. 让 LDAP 在它的数据库中使用你的域名。

以下面的内容创建另一个 LDIF 文件,我们称之为 ldapdomain.ldif, 然后酌情替换这个文件中的域名(在域名部分Domain Component dc=) 和密码:


  1. dn: olcDatabase={1}monitor,cn=config
  2. changetype: modify
  3. replace: olcAccess
  4. olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
  5. read by dn.base="cn=Manager,dc=mydomain,dc=com" read by * none
  6. dn: olcDatabase={2}hdb,cn=config
  7. changetype: modify
  8. replace: olcSuffix
  9. olcSuffix: dc=mydomain,dc=com
  10. dn: olcDatabase={2}hdb,cn=config
  11. changetype: modify
  12. replace: olcRootDN
  13. olcRootDN: cn=Manager,dc=mydomain,dc=com
  14. dn: olcDatabase={2}hdb,cn=config
  15. changetype: modify
  16. add: olcRootPW
  17. olcRootPW: {SSHA}PASSWORD
  18. dn: olcDatabase={2}hdb,cn=config
  19. changetype: modify
  20. add: olcAccess
  21. olcAccess: {0}to attrs=userPassword,shadowLastChange by
  22. dn="cn=Manager,dc=mydomain,dc=com" write by anonymous auth by self write by * none
  23. olcAccess: {1}to dn.base="" by * read
  24. olcAccess: {2}to * by dn="cn=Manager,dc=mydomain,dc=com" write by * read

接着使用下面的命令来加载:


  1. # ldapmodify -H ldapi:/// -f ldapdomain.ldif

LDAP 域名配置

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


  1. dn: dc=mydomain,dc=com
  2. objectClass: top
  3. objectClass: dcObject
  4. objectclass: organization
  5. o: mydomain com
  6. dc: mydomain
  7. dn: cn=Manager,dc=mydomain,dc=com
  8. objectClass: organizationalRole
  9. cn: Manager
  10. description: Directory Manager
  11. dn: ou=People,dc=mydomain,dc=com
  12. objectClass: organizationalUnit
  13. ou: People
  14. dn: ou=Group,dc=mydomain,dc=com
  15. objectClass: organizationalUnit
  16. ou: Group

添加条目到 LDAP 目录中:


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

添加 LDAP 域名,属性和键值

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


  1. # adduser ldapuser
  2. # vi ldapgroup.ldif

添加下面的内容:


  1. dn: cn=Manager,ou=Group,dc=mydomain,dc=com
  2. objectClass: top
  3. objectClass: posixGroup
  4. gidNumber: 1004

其中 gidNumber 是 ldapuser 在 /etc/group 中的 GID,然后加载这个文件:


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

9. 为用户 ldapuser 添加一个带有定义的 LDIF 文件(ldapuser.ldif):


  1. dn: uid=ldapuser,ou=People,dc=mydomain,dc=com
  2. objectClass: top
  3. objectClass: account
  4. objectClass: posixAccount
  5. objectClass: shadowAccount
  6. cn: ldapuser
  7. uid: ldapuser
  8. uidNumber: 1004
  9. gidNumber: 1004
  10. homeDirectory: /home/ldapuser
  11. userPassword: {SSHA}fiN0YqzbDuDI0Fpqq9UudWmjZQY28S3M
  12. loginShell: /bin/bash
  13. gecos: ldapuser
  14. shadowLastChange: 0
  15. shadowMax: 0
  16. shadowWarning: 0

并加载它:


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

LDAP 用户配置

相似地,你可以删除你刚刚创建的用户条目:


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

10. 允许有关 ldap 的通信通过防火墙:


  1. # firewall-cmd --add-service=ldap

11. 最后,但并非最不重要的是使用 LDAP 开启客户端的认证。

为了在最后一步中对我们有所帮助,我们将使用 authconfig 工具(一个配置系统认证资源的界面)。

使用下面的命令,在通过 LDAP 服务器认证成功后,假如请求的用户的家目录不存在,则将会被创建:


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

LDAP 客户端认证

总结

在这篇文章中,我们已经解释了如何利用一个 LDAP 服务器来设置基本的认证。若想对当前这个指南里描述的设置进行更深入的配置,请参考位于 RHEL 系统管理员指南里的 第 13 章 – LDAP 的配置,并特别注意使用 TLS 来进行安全设定。

本文来自合作伙伴“Linux中国”,原文发布日期:2015-10-04   

时间: 2024-12-23 21:58:46

RHCSA 系列(十四): 在 RHEL 7 中设置基于 LDAP 的认证的相关文章

RHCSA 系列(四): 编辑文本文件及分析文本

作为系统管理员的日常职责的一部分,每个系统管理员都必须处理文本文件,这包括编辑已有文件(大多可能是配置文件),或创建新的文件.有这样一个说法,假如你想在 Linux 世界中挑起一场圣战,你可以询问系统管理员们,什么是他们最喜爱的编辑器以及为什么.在这篇文章中,我们并不打算那样做,但我们将向你呈现一些技巧,这些技巧对使用两款在 RHEL 7 中最为常用的文本编辑器: nano(由于其简单和易用,特别是对于新手来说)和 vi/m(由于其自身的几个特色使得它不仅仅是一个简单的编辑器)来说都大有裨益.我

【玩转数据系列十四】如何通过PAI实现云端实时心脏状况监测

背景 我们通过之前的案例已经为大家介绍了如何通过常规的体检数据预测心脏病的发生,请见https://yq.aliyun.com/articles/54260.通过前文的案例我们可以生成一个算法模型,通过向这个模型输入用户实时的体检数据就会返回用户患有心胀病的概率.那么我们该如何搭建这套实时监测用户健康情况的服务呢?PAI最新推出的在线预测服务帮您实现.目前,机器学习PAI已经支持实验模型一键部署到云端生成API,通过向这个API推送用户的实时体检数据,就可以实时拿到反馈结果,做到心脏状况的云端的

VBScript教程 第十四课在VBScript中使用对象_vbs

使用对象 无论使用的是 ActiveX? 控件(以前称为 OLE 控件)还是 Java? 对象,Microsoft Visual Basic Scripting Edition 和 Microsoft? Internet Explorer 都以相同的方式处理它们.如果您使用的是 Internet Explorer 并且 ActiveX 库中安装了这些控件,就会看到由以下代码制作的页面. <OBJECT> 标记用来包含对象,<PARAM> 标记用来设置对象属性的初始值.使用 <

Windows 8开发入门(十四) windows 8中粘贴板(剪切板)的使用

在Windows 8中我们的粘贴板分别保存4种信息:文本.图片.网页.文件.在本文中我们将分别复制和粘 贴这4种元素,当然你也可以在外部复制这4种元素,然后在程序中粘贴出来. DataPackage:包含用户 希望与另一个应用程序交换的数据 //设置一个中转变量保存用户的值 DataPackage dp = new DataPackage(); 第一:我们来看看复制和粘贴文本的后台处理代码 . //<!--复制文本--> private void CopyText_Click(object s

[狐狸谈网站系列十四]攻什么也别攻网站

昨天,有很多朋友跟狐狸说了这样一个问题:你啊你,文章没有啥可读性,非常空洞.为什么CHINAZ还整版的放到首页.狐狸诧异.也许这样的调侃性文章不应该放到CHINAZ上,或者来讲,以狐狸这样的草根,根本就不应该上CHINAZ首版,但是,他真的就上了.不喜欢的朋友,也请继续拍砖,嬉笑怒骂随便. 最近,网络不是很安定,个人站长的聚集讨论地落伍刚被D完,图王的站长网也惨遭下手.这还不算啥,就连深受网民爱戴的软件资讯站,CNBETA也被放马两天.不得以,转到了百度空间.原以为,只有咱这些小站长倒霉,这不,

ORACLE SQL性能优化系列 (十四) 完结篇

oracle|性能|优化 46.       连接多个扫描 如果你对一个列和一组有限的值进行比较, 优化器可能执行多次扫描并对结果进行合并连接. 举例:     SELECT *     FROM LODGING     WHERE MANAGER IN ('BILL GATES','KEN MULLER');       优化器可能将它转换成以下形式     SELECT *     FROM LODGING     WHERE MANAGER = 'BILL GATES'     OR MA

分秒必争域的时间同步问题[为企业部署Windows Server 2008系列十四]

有的时候客户端无法登录域,除了前面我们谈到的DNS问题,时间同步问题也可能引起不能登录域. 域环境中的时间同步问题常常会引起域用户无法登录域,那么如何解决AD的时间同步问题呢? 首先,我们看一下环境: 客户端: DC:

WF 4.0 基础篇(十四) Delay与WF4中的线程

本节主要介绍WF的实例是单线程运行的,Delay并不是Thread.Sleep,Parallel是单线程运行的,WorkflowApplication与WorkflowInvoker 在调用流程上的区别,InvokeMethod 调用异步方法 本文例子下载: http://files.cnblogs.com/foundation/DelayAndThreadWorkflow.rar 本文例子说明 WF的实例是单线程运行的 在WF3.x与WF4.0中,工作流实例都是单线程执行的 很多时候,[Par

WorldWind系列十四:DEM数据加载和应用——以SRTM为例(下)

使用了TerrainAccessor.cs类120行代码 public virtual TerrainTile GetElevationArray(double north, double south, double west, double east, int samples) { TerrainTile res = null; res = new TerrainTile(null); res.North = north; res.South = south; res.West = west;