RHCSA 系列(十四): 在 RHEL 7 中设置基于 LDAP 的认证
在这篇文章中,我们将首先罗列一些 LDAP 的基础知识(它是什么,它被用于何处以及为什么会被这样使用),然后向你展示如何使用 RHEL 7 系统来设置一个 LDAP 服务器以及配置一个客户端来使用它达到认证的目的。
RHCSA 系列:设置 LDAP 服务器及客户端认证 – Part 14
正如你将看到的那样,关于认证,还存在其他可能的应用场景,但在这篇指南中,我们将只关注基于 LDAP 的认证。另外,请记住,由于这个话题的广泛性,在这里我们将只涵盖它的基础知识,但你可以参考位于总结部分中列出的文档,以此来了解更加深入的细节。
基于相同的原因,你将注意到:为了简洁起见,我已经决定省略了几个位于 man 页中 LDAP 工具的参考,但相应命令的解释是近在咫尺的(例如,输入 man ldapadd)。
那还是让我们开始吧。
我们的测试环境
我们的测试环境包含两台 RHEL 7机器:
Server: 192.168.0.18. FQDN: rhel7.mydomain.com
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 实现。为了安装服务器和客户端,分别使用下面的命令:
# 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
来验证),为了使得服务器能够更改由管理工具创建的条目,该用户应该有目录 /var/lib/ldap
的所有权,而这些管理工具仅可以由 root 用户来运行(紧接着有更多这方面的内容)。
在递归地更改这个目录的所有权之前,将 slapd 的示例数据库配置文件复制进这个目录:
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# chown -R ldap:ldap /var/lib/ldap
4. 设置一个 OpenLDAP 管理用户并设置密码:
# slappasswd
正如下一幅图所展示的那样:
设置 LDAP 管理密码
然后以下面的内容创建一个 LDIF 文件(ldaprootpasswd.ldif
):
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
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 这几个域被允许使用。
# ldapadd -H ldapi:/// -f ldaprootpasswd.ldif
上面命令的输出应该与下面的图像相似:
LDAP 配置
接着从 /etc/openldap/schema
目录导入一个基本的 LDAP 定义:
# 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=) 和密码:
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 域名配置
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
添加 LDAP 域名,属性和键值
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 用户配置
相似地,你可以删除你刚刚创建的用户条目:
# ldapdelete -x -W -D cn=Manager,dc=mydomain,dc=com "uid=ldapuser,ou=People,dc=mydomain,dc=com"
10. 允许有关 ldap 的通信通过防火墙:
# firewall-cmd --add-service=ldap
11. 最后,但并非最不重要的是使用 LDAP 开启客户端的认证。
为了在最后一步中对我们有所帮助,我们将使用 authconfig 工具(一个配置系统认证资源的界面)。
使用下面的命令,在通过 LDAP 服务器认证成功后,假如请求的用户的家目录不存在,则将会被创建:
# authconfig --enableldap --enableldapauth --ldapserver=rhel7.mydomain.com --ldapbasedn="dc=mydomain,dc=com" --enablemkhomedir --update
LDAP 客户端认证
总结
在这篇文章中,我们已经解释了如何利用一个 LDAP 服务器来设置基本的认证。若想对当前这个指南里描述的设置进行更深入的配置,请参考位于 RHEL 系统管理员指南里的 第 13 章 – LDAP 的配置,并特别注意使用 TLS 来进行安全设定。
本文来自云栖社区合作伙伴“Linux中国”,原文发布日期:2015-10-04
RHCSA 系列(十四): 在 RHEL 7 中设置基于 LDAP 的认证相关推荐
- Redis系列(十四)、Redis6新特性之RESP3与客户端缓存(Client side caching)
Redis6引入新的RESP3协议,并以此为基础加入了客户端缓存的新特性,在此特性下,大大提高了应用程序的响应速度,并降低了数据库的压力,本篇就带大家来看一下Redis6的新特性:客户端缓存. 目录 ...
- Git使用 从入门到入土 收藏吃灰系列 (十四) 清除git仓库的所有提交记录
文章目录 一.前言 二.清除git仓库的所有提交记录 本节速览 清除git仓库的所有提交记录 一.前言 参考安装Git 详细安装教程 参考视频B站 Git最新教程通俗易懂,这个有点长,感觉讲的精华不多 ...
- Reflex WMS入门系列十四:在Reflex系统上创建一个Receipt
Reflex WMS入门系列十四:在Reflex系统上创建一个Receipt 很多情况下,使用Reflex WMS系统的企业都会使用某个ERP系统,比如SAP,Oracle EBS等,用以支持企业供应 ...
- HTML5 2D游戏引擎研发系列 第四章 Canvas技术篇-画布技术-基于手动切片动画
作者:HTML5游戏开发者社区-白泽 转载请注明出处:http://html5gamedev.or HTML5 2D游戏引擎研发系列 第四章 <Canvas技术篇-画布技术-基于手动切片动画&g ...
- 微课系列(四):Python中map对象的几种用法和注意事项
在Python中,map.filter.enumerate.zip.reversed等对象除了惰性求值之外,还有个共同的特点是"其中的元素只能使用一次",这一点如果不注意的话,有时 ...
- 【《Real-Time Rendering 3rd》 提炼总结】(十一) 第十四章 : 游戏开发中的渲染加速算法总结
本文由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/78884513 导读 这是一篇1万3千 ...
- 【转载】【《Real-Time Rendering 3rd》 提炼总结】(十一) 第十四章 : 游戏开发中的渲染加速算法总结
本文由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/78884513 导读 这是一篇1万 ...
- 三十四、深入Java中的泛型(上篇)
@Author:Runsen @Date:2019年10月22日 19:39:21 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件 ...
- 火云开发课堂 - 《Shader从入门到精通》系列 第四节:在Shader中使用纹理
<Shader从入门到精通>系列在线课程 第四节:在Shader中使用纹理 视频地址:http://edu.csdn.net/course/detail/1441/22668?auto_s ...
最新文章
- MySQL锁表解决方法
- hive sqoop 分区导入_使用sqoop将hive分区表的数据导入到mysql的解决方案:shell脚本循环...
- 人工智能与电气工程及其自动技术论述
- arc 和 非arc兼容
- OCA第2部分中的Java难题
- java写hive自定义函数_hive自定义函数的实现和执行
- 58技术主席:还原万亿级三高业务场景的设计与实践
- phpcmsV9 添加内容:如何“增加复选框、下拉菜单”(含案例、截图)- 教程篇
- android shell 批量打包,Android执行shell命令打包
- Android 系统(74)---Android手势触摸事件的分发和消费机制
- matlab中solver函数_Matlab中微分方程的模型
- Android课设电台论文,基于Android的超短波电台多媒体传输系统
- 建模步骤_带你十个步骤学建模(二)
- [机器学习] ——KNN K-最邻近算法
- shell--字符串是否为空
- eclipse安装spring boot插件spring tool suite
- 图解Python机器学习pdf 中日双语 第1页
- WIN2008R2激活工具
- Proxomitron之天涯只看规则
- 计算机应用与维修电竞与管理,电子竞技运动与管理-五年制高技招生专业-广州市白云工商技师学院_广州市白云工商高级技工学校_信息工程系(计算机系)...
热门文章
- win7 没有microsoft print to pdf_现在还能不能下载到正版WIN 7
- dict去重python_python去重,一个由dict组成的list的去重示例
- spss process插件_SPSS教程:绘制调节效应图
- 智慧树python答案内蒙古科技大学_2020年_知到_打开企业形象设计之门(内蒙古科技大学)_答案护理人文修养_智慧树_期末答案...
- rn如何测试数据请求时间_rn最新版测试
- vba 跳到下一个循环_VBA野知识分享:从一个数组中取部分值生成新数组,不使用循环的思路...
- webpack html转成js,WebPack的基础学习
- 字节跳动测试开发4轮面试_字节跳动2018招聘测试开发方向(第四批)
- easylog 使用_Easyloggingpp的使用
- 天津大学仁爱学院c语言期末考试题,天津大学《C语言程序设计》2016年7月考试期末大作业...