企业当中电脑的帐号应该都是相同的,这时,通过统一管理的身份验证服务器来管理,应该是个比较合理的作法!
如果在企业的环境中有多部系统,每部系统里面的用户都相同,那么是否每部系统都需要创建这批帐号呢? 如果是每部系统独立创建这些帐号,未来需要添加、移除、修改帐号的任务时,可能会造成许多的困扰。因此,统一将帐号密码放置在一部系统上, 就会是比较正统的作法!过去 Linux 常见的帐号密码管理机制,大概使用 NIS,不过近来为了跨平台管理,大多使用 LDAP 机制管理!达成 LDAP 机制的软件非常多,我们在这个章节中,主要介绍 FreeIPA 这套软件喔!
在企业内部,每个员工应该有专属的帐号与密码,包括用于公司内部的 email 地址、登录工作站的身份验证等等。这些帐号密码的管理机制, 大多使用轻量级目录服务 (Lightweight Directory Access Protocol, LDAP),这个 LDAP 协定的主要功能在『目录服务 (directory service)』。 底下我们先来谈谈什么是 LDAP,尤其是很重要的 LDIF 文档内容~还有关于领域 (domain) 的设置等等,之后实际设置 LDAP 的服务器软件时, 大家才能比较清楚的了解,那个是什么东西~
以电脑教室为例,如果让每个学生全部都以同一个帐号登录 (例如很多学校都会用 student 当登录帐号), 那么学生在座位上面的调整就会比较没有弹性,因为他们得要将自己的作业数据放置到该电脑的本地端目录,或者是学生自己的 USB 磁盘机。 那,如果课程是有延续性质的,学生就得要坐到前一次上课的座位,否则就无法取得上次操作的环境与文件。 因此,许多电脑教室或办公室,可能都会提供一个文件服务器来给学生或员工挂载使用,例如底下的图标,就是以 NFS 服务来提供文件系统的范例:
不过文件系统也是需要验证的,否则所有人都可以读取任何人的文件数据,那就天下大乱了!因此就需要有身份验证系统才行。 所以,我们也才能够通过身份验证系统登录每一部主机,这样在出问题时,也比较好查找到到底是那一位学生或员工恶意使用所造成的问题, 比较好厘清责任归属啰。
总结说明身份识别与文件系统间的关系就是:在一组或一间服务器机房内,所有的服务器均需要使用同一组帐号与密码来登录, 并取得相同家目录时,就需要这样的设备需求。此种状况常见的环境有:
再次强调该功能就得要有两个组件:
以纯粹 linux 的服务器环境来说,最容易设置的其实是 NIS 与 NFS 两者的搭配,不过 NIS 对于 windows 的支持较差,所以如果考量到未来的系统规划, 建议是可以使用跨平台的 LDAP 来取代 NIS 作为身份识别系统较佳。至于文件系统方面,虽然 SAMBA 才是缺省可以提供跨平台的文件系统, 不过在运作的性能方面,还是以 NFS 较为强大,因此作为纯 Linux Server 的环境来说,当然首选还是使用 NFS 的。 在这个章节中,我们主要介绍 LDAP 协定的应用,其他文件系统数据,将于后续章节介绍啰!
如前所述,LDAP 全名: Lightweight Directory Access Protocol,主要的功能在于『目录服务 (directory service)』的提供!什么是『目录服务』呢? 从 wiki 上的说明来看,目录服务指的是:
目录服务是一个保存、组织和提供信息访问服务的软件系统,在软件工程中,一个目录是指一组名字和值的映射。 它允许根据一个给出的名字来寻找对应的值,与词典相似。 像词典中每一个词也许会有多个词义,在一个目录中,一个名字也许会与多个不同的信息相关联。 类似地,就像一个词会有多个不同的发音和多个不同的词义,目录中的一个名字可能会有多个不同类型的值。
目录也许只提供范围非常小的节点类型和数值类型,也可能对任意的或可延伸的一组类型提供支持。在一个电话目录中,节点就是姓名而数值项就是电话号码。 在DNS中,节点是域名而数值项是IP地址(还有别名,邮件服务器名等等)。 在一个网络操作系统的目录中,节点是那些由操作系统所管理的资源,包括用户、电脑、打印机和其它共享资源。
简单的说,就是你可以提供一个查找的数据对应的内容,举例来说,你可以提供一个『帐号名称』, 而在这个帐号名称底下给予对应了密码、UID、GID、真实姓名等信息,若用户端使用帐号名称来查找目录服务,则可以得到该帐号的密码、 UID等等信息就是了。而且目录服务还不只提供这些数据,你想要额外增加什么节点都可以!所以用途相当广泛。
基本上,你就将 LDAP 想成是一个目录,而每个目录都有个目录名称,然后根据不同需求,可以给予更多的目录节点。 至于目录的内容,则根据目录的定义来给予乡对应的内容就是了。至于目录的节点还是需要根据不同的层级给予不同的设置才行。 单纯以节点的角度来看,以一个公司名称为『 example.com 』的位置来说,该公司的相关部门位置节点有点像这样:
如上所示,公司底下有两个部门 (organization unit),一个是服务器部门 (Servers) 一个是人资部门 (People) , 其中人资部门底下管理着员工证号 (Person, udid),大概就是这样一层一层的分配下来~而每一个节点底下可以搭配不同的数据给予特别的任务就是了。 而如果是不同部门的相似架构呢?则可以用底下图标来说明:
在公司 (company.com) 内部的两大部门 (location1, location2) 个别提供了各自的帐号密码管理机制之类的,可以再细分下去之意。 因此,只要找寻不同的 location 即可取得各自部门的人信息息。
在比较学理的组成说明如下:
如果是比较简单理解的方式来说的话,你有没有发现,上面的图标非常非常像是目录树系统 (directory tree)!哈哈!没错, 你就将 LDAP 的组成结果想成是目录树,而最顶天的节点就是根目录,接下来的每个节点就是各自的子目录。那跟关联性数据库 (SQL) 有啥不同呢? 你就这样想,每个节点 (目录) 里面的内容,都可以随便你添加任何数据!这就大大的增加了数据的可扩充性了!
如前所述,在 LDAP 的架构下,我们将每笔纪录都称为一个 DN,最顶天的 DN 我们称为 baseDN,而撰写的方法通常与你的 DNS 架构有点关系! 例如,我们的 DNS 架构是 server.vbird 这样的领域,那么 baseDN 应该就可以设置成:『 dc=server,dc=vbird 』这样的结构! 跟目录树系统对照起来,也就是说,根目录 (/) 相当于 dc=server,dc=vbird 这个 DN 的名称就是了。那么谁可以管理这个 LDAP 系统呢? 我们就得要有另外一个管理员的 DN!这个管理员 DN 有点像 /root 目录啦!通常我们称为 rootDN,在后续谈到的 FreeIPA 里面, rootDN 的名称通常是『 cn=Directory Manager 』这样的结构!那如果你有帐号数据的话,也有可能需要用到帐号的 DN, 会有点像 /home/admin 类似的目录,在 FreeIPA 的帐号数据 DN 有点像『 uid=admin,cn=users,cn=accounts,dc=server,dc=vbird 』。
那么 baseDN 里面含有什么数据呢?如果一部创建好的 LDAP 数据,使用『 ldapsearch -x "dc=server" 』查找数据时,应该就会出现如下画面:
# server.vbird dn: dc=server,dc=vbird objectClass: top objectClass: domain objectClass: pilotObject objectClass: domainRelatedObject objectClass: nisDomainObject dc: server info: IPA V2.0 associatedDomain: server.vbird nisDomain: server.vbird
上面这个数据就被称为是 LDIF (LDAP Data Interchange Format)!这是正常的 LDAP 修改数据内容的格式!早期修改 LDAP 的信息,都要通过这种格式,然后以 ldapmodify 指令来导入修改~相当痛苦!近期以来,有 FreeIPA 可以使用指令的方式来修订 LDAP 的内容, 感觉舒服多了!
要提供 LDAP 的身份验证功能,有很多软件可以支持,在 Windows 上面最常用的就是 AD (Active Directory, AD) 服务器,在 Linux 上面则有多种服务! 包括 openldap 服务器、389ds 服务器、Red Hat Directory Server (rhds) 服务器、FreeIPA 服务器等等,其中 openldap, 389ds 主要仅提供 LDAP 服务, rhds 则是 Red Hat 官方支持的软件,基本上没有发布给 RHEL 衍生产品使用,最后的 FreeIPA 就有趣了!FreeIPA 是开放原代码软件, 主要的任务是提供类似 windows AD 服务器的功能,可以统一提供 LDAP, DNS, NTP 等等功能,相当强大!而且,如同上一小节提到的, FreeIPA 已经集成了大部分常见系统的纲要档,所以,几乎所有的用户端系统,都可以直接拿 FreeIPA 服务器当作帐号密码验证来源服务器! 简单易用!
FreeIPA 的官方网站自己的介绍中,FreeIPA 就是 Identity, Policy, Audit,亦即身份验证、政策规则管理、稽核验证功能等。 鸟哥最需要的其实只有第一个啦!那就是身份验证的功能!也就是帐密统一管理的 LDAP 机制就是了!过去鸟哥使用 openldap 设置时, 每一个项目都需要用到 LDIF 文本档进行导入,真的头很痛~FreeIPA 则有制式化方式创建服务,设置上面做非常多简化! 因此,管理员只需要知道 LDAP 是什么,大致请处 LDIF 格式之后,其他的,都用 ipa 这个指令来完成即可!相当简便! 整个简单的 FreeIPA 服务器功能,我们可以拿底下的图标来做个简单的介绍:
上图当中,右侧为 FreeIPA 服务器里头的组件,有特殊底色的组件是 FreeIPA 架设值,就可以主动提供与设置好的项目! 你几乎什么都不用做,所有的设置就完成了!之后要添加、删除、修改帐号等数据,就通过『 ipa cli 』组件来管理即可! 要注意的是,FreeIPA 并不是独立做出全部的服务,而是拿既有的软件来搭建出类似 AD 的管理机制!所以 ldap.conf 是使用 openldap-clients 软件,身份验证则是抓取 sssd 服务来处理,只是全部的设置档,都是通过 freeipa 主动建置完毕而已。
至于用户端,只要设置好 ldap 用户端数据,加上设计好 sssd 服务,就可以主动连接上 FreeIPA 的 LDAP 服务 (一般端口口放行在 port 389 及加密的 port 636),那就能够进行身份验证了!整体结构就是这样。
帐号信息毕竟是非常重要的内部数据,所以,建议直接放在 LAN 的内部服务器系统,不要放在 DMZ 环境下喔! 不要让你家的帐号数据暴露在可被访问的 DMZ 环境内~这样应该会稍微安全些!我们在 LAN 区域当中创建好 LDAP 服务器,然后在 LAN 里面抓两部系统来处理,一部预计使用 Linux 另一部将使用 windows 系统喔! 所以,最终会有三部新的系统这样。相关的设置会有点像这样:
不过,由于担心云端系统可用的资源不够多,因此,建议将上一节课的 works 系统先关闭,最终只剩下系统缺省绝对会使用的项目即可:
# 在 cloud 母系统上面,将多余的虚拟机关闭,剩下需要的大概有: [root@cloud ~]# virsh list Id Name State ------------------------------------ 1 master running 13 server_dns_master running 15 server_dns_slave running 16 server_dhcp running 19 server_backup running
要先记得,我们的母系统是在 cloud 的主机底下,然后我们拷贝的服务器来源文件,主要是由 server_raw 来的!现在就让我们来处理 XML 以及映像档数据:
# 1.1 拷贝 server_raw/client_raw 给 server_ldap/client_linux 使用 [root@cloud ~]# cd /kvm/img [root@cloud img]# cp server_raw.img server_ldap.img [root@cloud img]# cp client_raw.img client_linux_00.img # 1.2 windows 需要比较大的容量,而且需要全新安装,请创建 100G 的硬盘 [root@cloud img]# qemu-img create -f qcow2 client_win_00.img 100G # 2.1 创建好 server_ldap.xml 的设置档,并尝试启动 [root@cloud img]# cd /kvm/xml [root@cloud xml]# cp server_workstation.xml server_ldap.xml [root@cloud xml]# vim server_ldap.xml <name>server_ldap</name> <nvram>/kvm/xml/server_ldap.uefi.fd</nvram> <source file="/kvm/img/server_ldap.img"/> <source bridge="lanbr0"/> <mac address="52:54:00:00:20:51"/> <graphics type="vnc" port="5936" listen="127.0.0.1" passwd="rocky9"> [root@cloud xml]# virsh create server_ldap.xml # 2.2 创建好 Linux 用户端 client_linux_00 的设置档,并尝试启动 [root@cloud xml]# cp client_raw.xml client_linux_00.xml [root@cloud xml]# vim client_linux_00.xml <name>client_linux_00</name> <loader readonly="yes" type="pflash" secure="no">/usr/share/edk2/ovmf/OVMF_CODE.fd</loader> <nvram>/kvm/xml/client_linux_00.uefi.fd</nvram> <source file="/kvm/img/client_linux_00.img"/> <mac address="52:54:00:00:20:00"/> <graphics type="vnc" port="5920" listen="127.0.0.1" passwd="rocky9"> [root@cloud xml]# virsh create client_linux_00.xml # 2.3 创建好 Windows 用户端 client_win_00 的设置档,并尝试启动 [root@cloud xml]# cp client_raw.xml client_win_00.xml [root@cloud xml]# vim client_win_00.xml <name>client_win_00</name> <memory>6097152</memory> <currentMemory>6097152</currentMemory> <loader readonly="yes" type="pflash" secure="yes">/usr/share/edk2/ovmf/OVMF_CODE.secboot.fd</loader> <nvram>/kvm/xml/client_win_00.uefi.fd</nvram> <hyperv mode="custom"> <relaxed state="on"/> <vapic state="on"/> <spinlocks state="on" retries="8191"/> <vpindex state="on"/> <runtime state="on"/> <synic state="on"/> <stimer state="on"> <direct state="on"/> </stimer> <reset state="on"/> <vendor_id state="on" value="KVM Hv"/> <frequencies state="on"/> <reenlightenment state="on"/> <tlbflush state="on"/> <ipi state="on"/> <evmcs state="on"/> </hyperv> <timer name="hypervclock" present="yes"/> </clock> <source file="/kvm/img/client_win_00.img"/> <mac address="52:54:00:c2:00:00"/> <tpm model="tpm-tis"> <backend type="emulator" version='2.0'/> </tpm> <graphics type="vnc" port="5921" listen="127.0.0.1" passwd="rocky9" /> [root@cloud xml]# virsh create client_win_00.xml # 这样就可以进入 windows 11 的安装模式当中才对!
上面的设置数据跟前几个章节相近,没有什么太大的问题~但是,Windows 11 的虚拟机安装,就很有问题了! 因为 Windows 11 对硬件的要求比较高~所以,我们缺省的环境是不足以支撑相关硬件的要求的~同时,Windows 11 的相关安装档, 以及 virtio 磁盘机驱动程序,则需要事先下载到 /kvm/iso 底下才行!因为 windows 11 的 XML 数据非常多~ 所以鸟哥将全部的设置写入一个文本档,大家可以从底下的网址自行取得参考喔!
几个比较重要的安装流程是,安装过程由于 windows 不懂 virtio 的磁盘设备,因此,你得要到 virtio-win.iso 那个光盘去找数据! 加载驱动程序,这样才有办法抓到实际的硬盘来安装!后续安装过程应该就很顺畅了。安装完毕之后,到设备管理员当中, 会看到更多的有问题的设备~每个有问题设备都点进去更新驱动程序,同样使用 virtio-win.iso 光盘的内容!应该很快就能找到正确的驱动程序! 在这过后,你的 windows 11 才会有网络喔~要注意!要注意!
FreeIPA 的 LDAP 功能,应该还是需要固定 IP 地址才好!至于 linux/windows 等客户端,那就单纯使用 dhcp 取得就好! 如上图所示,我们的 LDAP 相关数据应该是:
底下的动作需要在刚刚激活的虚拟机底下实做 (vnc://192.168.201.249:5936),这是因为我们会修改网络参数的缘故啊!
# 在 LDAP 服务器 (VNC 环境) 完成如下参数设置: [root@server001 ~]# hostnamectl hostname ldap.server.vbird [root@server001 ~]# nmcli connection modify enp1s0 ipv4.method manual ipv4.addresses 192.168.20.251/24 \ > ipv4.gateway 192.168.20.254 ipv4.dns 192.168.30.211,192.168.30.212 \ > ipv4.dns-search server.vbird,lan.vbird,ap.vbird [root@server001 ~]# nmcli connection up enp1s0 [root@server001 ~]# curl http://vbird.cn
创建新主机,需要有名称的对应!请修改 dns1 服务器的 server.vbird 的 zone file !直接做吧!
# 底下所有的动作都应该要在 dns1 (master DNS) 上面动作: [root@dns1 ~]# vim /var/named/named.server.vbird @ IN SOA dns1.server.vbird. adm.mail.server.vbird. ( 2024070404 3H 15M 1D 600 ) .... ldap IN A 192.168.20.251 .... [root@dns1 ~]# vim /var/named/named.192.168.20 @ IN SOA dns1.server.vbird. adm.mail.server.vbird. ( 2024070404 3H 15M 1D 600 ) ... 251 IN PTR ldap.server.vbird. ... [root@dns1 ~]# systemctl restart named-chroot [root@dns1 ~]# dig +short ldap.server.vbird 192.168.20.251 [root@dns1 ~]# dig +short -x 192.168.20.251 ldap.server.vbird.
如前所述,FreeIPA 真的是很庞大的一个系统~集成好多东西!还提供了网页界面的控制环境!一切都是这么的美好... 不过,鸟哥基本上只需要使用 LDAP 统一控制用户的帐号密码而已啦!所以,预计开放的防火墙端口口并不会全部都放行! 而是只放行 port 389, 636 而已喔~相关的 FreeIPA server 与使用 LDAP 服务的用户端相关性, 有点像底下的模样:
上图右侧有底色的方块,是 FreeIPA 提供的,或是 FreeIPA 主动去设置的项目!好像很多组件要处理, 但事实上,使用一个安装指令就搞定了...实在觉得很简单啊!
基本上,LDAP 的服务在查找数据时,主要是使用主机名称在进行查找的!但是,LDAP 是架构在 TCP/IP 的协定上! 所以,主机名称对应到正确的 IP 地址这件事,就显得非常非常重要!我们的环境其实比较 OK,因为着眼在企业内部使用内部 DNS 系统的情境, 因此无须改动 /etc/hosts !只是特别要注意,主机名称一定要对应的起来才行!很重要!对应不起来,LDAP 就会失败!
# 在 LDAP 系统上面,找出正确的主机名称对应的 IP 地址: [root@ldap ~]# dig +short ldap.server.vbird 192.168.20.251 [root@ldap ~]# ip addr show enp1s0 | grep 'inet ' inet 192.168.20.251/24 brd 192.168.20.255 scope global noprefixroute enp1s0 # 本机的主机名称与 IP 确实是可以对应的! [root@ldap ~]# hostname ldap.server.vbird # 主机名称的设置也没有问题!OK 的!
看起来是没问题啊!另外,我们也需要规划一下 LDAP 那个小节提到的两个 DN,一个是 baseDN,一个是 rootDN! 一般来说,baseDN 会跟你的 dns 的 FQDN 有关!因为我们的领域 (domain) 主要是 server.vbird,所以, baseDN 通常就会这样设置:
那个 rootDN 是在 OpenLDAP 上面的管理员节点,鸟哥将它借来用在 FreeIPA 上面~至于用户家目录建议不要放置在 /home 的原因是, 未来我们会将统一管理的用户各自的家目录也提供给企业内的所有主机使用,如果远程帐号也使用 /home 的话,我们就得要将帐号一个一个设置, 否则可能会跟本机帐号冲突 (都在 /home 底下啊)。因此,鸟哥建议将远程用户的家目录放置到其他位置,例如 /rhome 就是个常见的远程用户家目录上层目录名。大致需要注意的项目就像上面这样啰!接下来,就让我们简单来设置一下 FreeIPA 服务器吧!
FreeIPA 在 RHEL 9 衍生产品的软件名称为 ipa-server,所以,你可以简单的立刻安装好:
[root@ldap ~]# yum install ipa-server
安装完毕之后,我们可以使用 FreeIPA 提供的 ipa-server-install 脚本来完成我们需要的所有工作喔! 这个脚本运行过程中,会需要输入一些信息,大多就是 baseDN 或管理员密码等,底下,让我们来简单的完成需要的任务:
# 在 LDAP 服务器上面,创建好 ipa server [root@ldap ~]# ipa-server-install The log file for this installation can be found in /var/log/ipaserver-install.log ============================================================================== This program will set up the IPA Server. Version 4.10.2 This includes: * Configure a stand-alone CA (dogtag) for certificate management * Configure the NTP client (chronyd) * Create and configure an instance of Directory Server * Create and configure a Kerberos Key Distribution Center (KDC) * Configure Apache (httpd) * Configure SID generation * Configure the KDC to enable PKINIT To accept the default shown in brackets, press the Enter key. Do you want to configure integrated DNS (BIND)? [no]: ↵ <==缺省不要绑定 DNS 喔! Enter the fully qualified domain name of the computer on which you're setting up server software. Using the form. Example: master.example.com Server host name [ldap.server.vbird]: ↵ <==缺省用本机的主机名,所以没问题! The domain name has been determined based on the host name. Please confirm the domain name [server.vbird]: ↵ <==一样使用本机领域名! The kerberos protocol requires a Realm name to be defined. This is typically the domain name converted to uppercase. Please provide a realm name [SERVER.VBIRD]: ↵ <==同样采用默认值 Certain directory server operations require an administrative user. This user is referred to as the Directory Manager and has full access to the Directory for system management tasks and will be added to the instance of directory server created for IPA. The password must be at least 8 characters long. Directory Manager password: <==输入 LDAP 管理密码 Password (confirm): <==输入 LDAP 管理密码 The IPA server requires an administrative user, named 'admin'. This user is a regular system account used for IPA server administration. IPA admin password: <==输入 admin 用户密码 Password (confirm): <==输入 admin 用户密码 Trust is configured but no NetBIOS domain name found, setting it now. Enter the NetBIOS name for the IPA domain. Only up to 15 uppercase ASCII letters, digits and dashes are allowed. Example: EXAMPLE. NetBIOS domain name [SERVER]: ↵ <==同样采用默认值 Do you want to configure chrony with NTP server or pool address? [no]: ↵ <==同样采用默认值 The IPA Master Server will be configured with: Hostname: ldap.server.vbird IP address(es): 192.168.30.216 Domain name: server.vbird Realm name: SERVER.VBIRD The CA will be configured with: Subject DN: CN=Certificate Authority,O=SERVER.VBIRD Subject base: O=SERVER.VBIRD Chaining: self-signed Continue to configure the system with these values? [no]: yes The following operations may take some minutes to complete. Please wait until the prompt is returned. # 接下来会跑好一阵子的系统检测与设置~你可以顺便看看 FreeIPA 在干麻! The ipa-client-install command was successful Please add records in this file to your DNS system: /tmp/ipa.system.records.t241j_cw.db ============================================================================== Setup complete Next steps: 1. You must make sure these network ports are open: TCP Ports: * 80, 443: HTTP/HTTPS * 389, 636: LDAP/LDAPS * 88, 464: kerberos UDP Ports: * 88, 464: kerberos * 123: ntp 2. You can now obtain a kerberos ticket using the command: 'kinit admin' This ticket will allow you to use the IPA tools (e.g., ipa user-add) and the web user interface. Be sure to back up the CA certificates stored in /root/cacert.p12 These files are required to create replicas. The password for these files is the Directory Manager password The ipa-server-install command was successful # 出现上面这段文本,就是完成了!要注意提示!防火墙记得处理!
基本上,整体安装就这样搞定耶!因为鸟哥以前搞 OpenLDAP 时,搞到头发昏~没想到 FreeIPA 竟然这样搞定一切... 刚刚完成的当下,会有点不知所措...笑死~
要注意的是,无论 FreeIPA 提供什么服务,鸟哥这边再次强调,目前『我们系统仅使用 LDAP 有加密连接的服务』而已,所以,我们只需要放行 port 636 这个 ldaps 喔!那就来处理一下防火墙吧!
# 放行需要的防火墙! [root@ldap ~]# firewall-cmd --permanent --add-service=freeipa-ldaps [root@ldap ~]# firewall-cmd firewall-cmd --permanent --remove-service={ftp,http,https} [root@ldap ~]# firewall-cmd --reload [root@ldap ~]# firewall-cmd --list-service cockpit dhcpv6-client freeipa-ldaps ssh
其实,比较重要的是 freeipa-ldaps 与 ssh 就是了!
现在,先让我们来检查一下,目前这个 LDAP 服务器,真的可以顺利提供 LDAP 嘛? 最简单的方法,其实就是使用 ldapsearch -x 这个指令来查找即可!应该要先来查找一下 baseDN 这个节点的内容才是! 不过要注意的是, ldapsearch 其实会找第一个出现的组件,所以, dc=server,dc=vbird 要列表,可以直接查找 dc=server 即可! 简单这样处理看看:
# 查找一下,目前有没有名为 dc=server,dc=vbird 的节点纪录 [root@ldap ~]# ldapsearch -x dc=server ....(略过).... # server.vbird dn: dc=server,dc=vbird objectClass: top objectClass: domain objectClass: pilotObject objectClass: domainRelatedObject objectClass: nisDomainObject dc: server info: IPA V2.0 associatedDomain: server.vbird nisDomain: server.vbird # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1
出现的数据最要注意的是『 dn: dc=server,dc=vbird 』那一行!因为那个 dn 就是判别名称的意思!后面的 objectClass 等信息, 就是这个节点的内容!这样应该就看得懂吧!另外,上面安装 IPA 时,过程中说有创建一个 admin 的用户, 我们也可以使用『 uid=帐号名称 』这样来查找看看喔!
[root@ldap ~]# ldapsearch -x uid=admin
# admin, users, compat, server.vbird
dn: uid=admin,cn=users,cn=compat,dc=server,dc=vbird
objectClass: posixAccount
objectClass: ipaOverrideTarget
objectClass: top
gecos: Administrator
cn: Administrator
uidNumber: 915600000
gidNumber: 915600000
loginShell: /bin/bash
homeDirectory: /home/admin
ipaAnchorUUID:: OklQQTpzZXJ2ZXIudmJpcmQ6MzVmYjkwOGMtZmYyYi0xMWVlLThlZTgtNTI1ND
AwMDAzMGM2
uid: admin
# admin, users, accounts, server.vbird
dn: uid=admin,cn=users,cn=accounts,dc=server,dc=vbird
objectClass: top
objectClass: person
objectClass: posixaccount
objectClass: krbprincipalaux
objectClass: krbticketpolicyaux
objectClass: inetuser
objectClass: ipaobject
objectClass: ipasshuser
objectClass: ipaSshGroupOfPubKeys
objectClass: ipaNTUserAttrs
uid: admin
cn: Administrator
sn: Administrator
uidNumber: 915600000
gidNumber: 915600000
homeDirectory: /home/admin
loginShell: /bin/bash
gecos: Administrator
ipaNTSecurityIdentifier: S-1-5-21-2221503860-19708226-1022894140-500
以 admin 为开头的帐号有两笔纪录,这两笔纪录分在不同的 cn 组织中~一个是 cn=compat 一个是 cn=accounts! 不过内容差不多耶~应该是有进行两个组织相同帐号的同步才对!这样才能适合不同用户端系统的帐号需求!所以,看起来没问题喔!
只是...ldapsearch 是找哪个设置档?基本上看一下底下这个文件:
[root@ldap ~]# cat /etc/openldap/ldap.conf | grep -v '#' | grep -v '^$' SASL_NOCANON on URI ldaps://ldap.server.vbird BASE dc=server,dc=vbird SASL_MECH GSSAPI
上面文件最重要的就是 LDAP 服务器来源的主机名称~还有 baseDN 名称的设置!
过去我们都得要使用 LDIF 格式来处理好需要的节点 (DN) 格式,之后再以 ldapadd, ldapmodify, ldapdelete 等指令来导入处理, 以改变在 LDAP 服务器当中的数据。如果学过 SQL 语言的,那你可以假想,LDIF 就是 SQL 的语法,而 ldap{add,modify,delete} 则是导入 SQL 语言的指令这样。问题是,LDIF 很难处理~一个小细节错误,在导入的时候,就很容易出错! 虽然使用 LDIF 创见 LDAP 数据库内容会比较干净,不过...就是很难管理!
现在,FreeIPA 提供了 ipa 这个 cli 指令,可以让大家快速方便的找到所有需要的帐号管理功能,处理起来非常方便! 怎么使用 ipa 呢?我们需要在 ldap.server.vbird 系统上面,先以 Kerberos 验证登录管理员身份后, 才能使用 ipa 喔!我们在前一小节安装 FreeIPA 的时候,不是要你输入 Directory Manager 的密码嘛? 在底下的指令当中输入那个密码就对了!
[vbird@ldap ~]$ kinit admin Password for admin@SERVER.VBIRD: <==这里输入 LDAP admin 的密码 [vbird@ldap ~]$ klist Ticket cache: KCM:1000 Default principal: admin@SERVER.VBIRD Valid starting Expires Service principal 07/04/24 21:52:49 07/05/24 21:51:25 krbtgt/SERVER.VBIRD@SERVER.VBIRD # 时间格式是 月/日/西元年后两位数
你用 Linux 的哪个帐号运行 kinit 都没问题,如上所示,鸟哥用 vbird 这个管理员惯用的一般帐号,进行 FreeIPA 的 admin 管理身份转换,然后使用 klist 查看一下目前的 Kerberos 票据 (ticket),就可以看到,如果 vbird 这个帐号一直没有注销的话, 这份票据就可以用到 24 小时之后喔!好了!现在你可以开始使用 ipa 这个指令啦!
在 linux 系统的管理中,创建用户的缺省家目录,一般是在 /home 底下,我们可以通过修改 /etc/default/useradd 这个指令来修改默认值。那 FreeIPA 的帐号默认值怎么查看与修改?首先,记得你已经登录了 admin 这个帐号喔 (kinit admin)! 然后这样做:
[vbird@ldap ~]$ ipa config-show Maximum username length: 32 Maximum hostname length: 64 Home directory base: /home Default shell: /bin/sh Default users group: ipausers Default e-mail domain: server.vbird Search time limit: 2 Search size limit: 100 User search fields: uid,givenname,sn,telephonenumber,ou,title Group search fields: cn,description Enable migration mode: False Certificate Subject base: O=SERVER.VBIRD Password Expiration Notification (days): 4 Password plugin features: AllowNThash, KDC:Disable Last Success SELinux user map order: guest_u:s0$xguest_u:s0$user_u:s0$staff_u:s0-s0:... Default SELinux user: unconfined_u:s0-s0:c0.c1023 Default PAC types: MS-PAC, nfs:NONE IPA masters: ldap.server.vbird IPA master capable of PKINIT: ldap.server.vbird IPA CA servers: ldap.server.vbird IPA CA renewal master: ldap.server.vbird
跟帐号设置比较有关的如上头特殊字体部份。我们想要修改缺省的家目录成为 /rhome ,那可以使用底下的方式来修改喔!
[vbird@ldap ~]$ ipa help config-mod ... --homedirectory=STR Default location of home directories ... [vbird@ldap ~]$ ipa config-mod --homedirectory=/rhome Maximum username length: 32 Maximum hostname length: 64 Home directory base: /rhome Default shell: /bin/sh Default users group: ipausers Default e-mail domain: server.vbird ....
这样就改好了!相当简单易用!另外,如果你有想要知道的 ipa 指令用途,只要用『 ipa help command 』格式去找就好啰!
先来看看我们有多少群组与多少用户,在刚刚创建好 FreeIPA 的这个时刻:
# 先来看看目前有几个群组 [vbird@ldap ~]$ ipa group-find ---------------- 4 groups matched ---------------- Group name: admins Description: Account administrators group GID: 915600000 Group name: editors Description: Limited admins who can edit other users GID: 915600002 Group name: ipausers Description: Default group for all users Group name: trust admins Description: Trusts administrators group ---------------------------- Number of entries returned 4 ---------------------------- # 再来看看,那有几个用户呢? [vbird@ldap ~]$ ipa user-find -------------- 1 user matched -------------- User login: admin Last name: Administrator Home directory: /home/admin Login shell: /bin/bash Principal alias: admin@SERVER.VBIRD, root@SERVER.VBIRD UID: 915600000 GID: 915600000 Account disabled: False ---------------------------- Number of entries returned 1 ---------------------------- # 那么来看看 admin 这个用户的重要信息: [vbird@ldap ~]$ ipa user-show admin User login: admin Last name: Administrator Home directory: /home/admin Login shell: /bin/bash Principal alias: admin@SERVER.VBIRD, root@SERVER.VBIRD UID: 915600000 GID: 915600000 Account disabled: False Password: True Member of groups: trust admins, admins Kerberos keys available: True
看起来缺省有 4 个群组,以及 1 个用户,用户名称就是权力无限大的 admin 这样。现在,先让我们来随便创建个一般用户, 用户名称为 amanda 好了~最简单处理的方式如下:
# 用缺省的方式创建一个 amanda 用户 [vbird@ldap ~]$ ipa user-add amanda First name: Amanda Last name: Tsai ------------------- Added user "amanda" ------------------- User login: amanda First name: Amanda Last name: Tsai Full name: Amanda Tsai Display name: Amanda Tsai Initials: AT Home directory: /rhome/amanda GECOS: Amanda Tsai Login shell: /bin/bash Principal name: amanda@SERVER.VBIRD Principal alias: amanda@SERVER.VBIRD Email address: amanda@server.vbird UID: 915600003 GID: 915600003 Password: False Member of groups: ipausers Kerberos keys available: False
FreeIPA 的缺省 UID/GID 似乎是在 915600000 开始这样,总之,这样就增加了一个用户!如果你要查找这个用户的相关信息, 除了使用『 ipa user-shwo amanda 』之外,也可以直接通过 LDAP 的查找方式处理,也就是『 ldapsearch -x uid=amanda 』! 但是目前这个用户没有密码喔!创建密码的最简单方式,可以这样处理看看:
# 使用管线命令直接带入密码的方式: [vbird@ldap ~]$ echo MyPassW04d | ipa user-mod amanda --password ---------------------- Modified user "amanda" ---------------------- User login: amanda First name: Amanda Last name: Tsai Home directory: /rhome/amanda Login shell: /bin/bash Principal name: amanda@SERVER.VBIRD Principal alias: amanda@SERVER.VBIRD Email address: amanda@server.vbird UID: 915600003 GID: 915600003 Account disabled: False Password: True Member of groups: ipausers Kerberos keys available: True
现在,让我们来仿真基础学习篇里面提到的帐号管理方式,假设我们需要创建三个用户,信息分别如下;
[vbird@ldap ~]$ echo MyPassW04d | ipa user-add alex --first=Alex --last=Tsai --password [vbird@ldap ~]$ echo MyPassW04d | ipa user-add melody --first=Melody --last=Tsai --password [vbird@ldap ~]$ echo MyPassW04d | ipa user-add ponda --first=Ponda --last=Lin --password
接下来,这三个用户得要加入一个群组,假设群组名称为 studygroup,那么加入这三个用户到此群组当中的流程, 应该就是这样的:
# 1. 先创建需要的群组 [vbird@ldap ~]$ ipa group-add studygroup ------------------------ Added group "studygroup" ------------------------ Group name: studygroup GID: 915600007 # 2. 加入三个用户到此群组内 [vbird@ldap ~]$ ipa help group-add-member [vbird@ldap ~]$ ipa group-add-member studygroup --user={alex,melody,ponda} Group name: studygroup GID: 915600007 Member users: alex, melody, ponda ------------------------- Number of members added 3 ------------------------- [vbird@ldap ~]$ ipa group-show studygroup Group name: studygroup GID: 915600007 Member users: alex, melody, ponda
前面讲这么多,都是在介绍 FreeIPA cli, LDAP 等等的管理上面,如果你仔细去看一下 /rhome,那根本就没有创建目录! 对啊!原本上面的工作,都仅只是在 LDAP 的数据节点上面进行修改而已!不过, FreeIPA 也很厉害, 其实也帮我们修订了 sssd 这个系统认证的服务了!来看看系统验证服务选择了哪些?接下来都是 Linux 系统操作了, 所以,不能再用一般帐号啰~请转成 root 处理!
[root@ldap ~]# authselect list - minimal Local users only for minimal installations - sssd Enable SSSD for system authentication (also for local users only) - winbind Enable winbind for system authentication [root@ldap ~]# authselect current Profile ID: sssd Enabled features: - with-sudo
目前就是使用 sssd 这个服务喔!那这个服务是什么?来看看这个服务先:
[root@ldap ~]# systemctl status sssd ● sssd.service - System Security Services Daemon Loaded: loaded (/usr/lib/systemd/system/sssd.service; enabled; preset: enabled) Active: active (running) since Sat 2024-04-20 23:37:03 CST; 16h ago Main PID: 22524 (sssd) Tasks: 8 (limit: 12337) Memory: 57.8M CPU: 2.499s CGroup: /system.slice/sssd.service ├─22524 /usr/sbin/sssd -i --logger=files ....
原来全名是『 System Security Services Daemon 』啊!系统资安服务!主要目的就是进行身份验证! 来看看主要的设置档:
[root@ldap ~]# cat /etc/sssd/sssd.conf [domain/server.vbird] id_provider = ipa ipa_server_mode = True ipa_server = ldap.server.vbird ipa_domain = server.vbird ipa_hostname = ldap.server.vbird auth_provider = ipa chpass_provider = ipa access_provider = ipa cache_credentials = True ldap_tls_cacert = /etc/ipa/ca.crt krb5_store_password_if_offline = True [sssd] services = nss, pam, ifp, ssh, sudo domains = server.vbird [nss] homedir_substring = /home memcache_timeout = 600
上面就是 sssd 这个服务查找数据的流程~在 [sssd] 的规范中,使用到的服务 (services) 那个 nss 与 pam 就是本机的帐号机制! 而 domains 就会去找 [domains/规范的领域] 有关的设置!因此,sssd 缺省还是会先找本机 /etc/passwd 里面有的帐号来呈现, 若找不到,就会再去找 domains 的规范~而上述 domains 的规范当中,主要就是通过 ipa_server 来验证~并使用 LDAP 的 TLS 加密机制! 加密密钥则放置于 /etc/ipa/ca.crt 这个文件内!
有了上面的服务以及相关的设置之后,我们就可以来查找 Linux 系统需要的帐号了!
[root@ldap ~]# id alex
uid=915600004(alex) gid=915600004(alex) groups=915600004(alex),915600007(studygroup)
这样我们就将 LDAP 集成到 Linux 帐号验证环境中了!最后,就让我们来瞧一瞧 IPA 运作的服务有哪些!
# 底下这个指令需要使用 root 的身份喔! [root@ldap ~]# ipactl status Directory Service: RUNNING krb5kdc Service: RUNNING kadmin Service: RUNNING httpd Service: RUNNING ipa-custodia Service: RUNNING pki-tomcatd Service: RUNNING ipa-otpd Service: RUNNING ipa: INFO: The ipactl command was successful
我们在 11.1.3 小节当中的图标,有提到 Linux 用户端想要使用 LDAP 进行身份验证,需要设置 LDAP 与 sssd 才行! 所以,底下我们就依序来处理一下这两个环节吧!让 Linux 系统的终端帐号,也能使用 LDAP server 提供的帐号!
使用 LDAP 用户端,亦即我们在 Linux 上面直接使用 ldapsearch 等指令时,可以即时的到 LDAP server 去查找数据的意思! 如前一小节提到的,我们的 LDAP server 目前仅提供 TLS 支持的 port 636 端口口~亦即是 ldaps:// 这个协定! 知道这个情况之后,再来让我们实验一下啰!记得在 11.1.4 我们有激活一个 linux client 吧~连接上这部使用 dhcp 取得网络参数的系统, 开始进行如下的实验:
# 1. 先安装所有需要的 openldap 与 sssd 的软件 [root@client001 ~]# yum install sssd-ipa sssd-ldap openldap-clients sssd-tools # 2. 开始设置 openldap 用户端数据 [root@client001 ~]# vim /etc/openldap/ldap.conf URI ldaps://ldap.server.vbird BASE dc=server,dc=vbird SASL_MECH GSSAPI TLS_CACERT /etc/openldap/certs/ca.crt # 缺省的情况下, LDAP 的 TLS 凭证会建议放在 /etc/openldap/certs 中 # 而且,该文件来自于 ldap.server.vbird 喔! # 3. 拷贝 ldap.server.vbird 的 ca.crt 凭证数据 [root@client001 ~]# scp ldap:/etc/ipa/ca* /etc/openldap/certs/ # 4. 使用 ldapsearch -x uid=admin 测试查找结果 [root@client001 ~]# ldapsearch -x uid=admin # admin, users, compat, server.vbird dn: uid=admin,cn=users,cn=compat,dc=server,dc=vbird objectClass: posixAccount objectClass: ipaOverrideTarget objectClass: top gecos: Administrator cn: Administrator uidNumber: 915600000 gidNumber: 915600000 loginShell: /bin/bash homeDirectory: /home/admin .....
通过简单的几个步骤,我们就在 Linux 端创建好帐号查找的数据了!LDAP client 的设置就完成啦!相当容易吧! 只是,当你使用『 id admin 』时,却发现没有这个用户!这是因为我们只设置了 LDAP 而尚未设置 sssd 服务之故! 接下来,让我们继续处理吧!
跟 ldap.server.vbird 不同,我们是 LDAP 用户端而不是 FreeIPA 用户端,因此许多设置我们只引用 LDAP 的机制! 所以,现在这么做看看:
# 1. 进行 sssd.conf 的设置 [root@client001 ~]# vim /etc/sssd/sssd.conf [sssd] services = nss, pam domains = server.vbird [nss] [domain/server.vbird] ldap_id_use_start_tls = True id_provider = ldap auth_provider = ldap chpass_provider = ldap ldap_uri = ldaps://ldap.server.vbird ldap_search_base = dc=server,dc=vbird cache_credentials = True ldap_tls_cacertdir = /etc/openldap/certs ldap_tls_reqcert = demand [root@client001 ~]# chmod 600 /etc/sssd/sssd.conf [root@client001 ~]# sssctl config-check Issues identified by validators: 0 Messages generated during configuration merging: 0 Used configuration snippet files: 0 [root@client001 ~]# systemctl restart sssd # 2. 使用 sssd 当成验证的来源 [root@client001 ~]# authselect select sssd --force Backup stored at /var/lib/authselect/backups/2024-04-21-12-32-41.YdRLPb Profile "sssd" was selected. The following nsswitch maps are overwritten by the profile: - passwd - group - netgroup - automount - services Make sure that SSSD service is configured and enabled. See SSSD documentation for more information. # 3. 测试仅在 LDAP 上面出现的帐号 [root@client001 ~]# id admin uid=915600000(admin) gid=915600000(admins) groups=915600000(admins) [root@client001 ~]# id melody uid=915600005(melody) gid=915600005(melody) groups=915600005(melody),915600007(studygroup) # 4. 尝试使用一般用户切换成为 LDAP 的帐号看看 [vbird@client001 ~]$ su - melody Password: su: warning: cannot change directory to /rhome/melody: No such file or directory [melody@client001 vbird]$ whoami melody [melody@client001 vbird]$ exit
很快的就建置好 client 端的身份验证功能!一切如此美好!只是...为啥没有家目录?这是因为我们尚未创建正确的家目录啦~ 远程用户的家目录,理论上也应该在远程~这个我们在后续章节再来处理啰!
FreeIPA 也有提供 windows 用户使用 LDAP 登录的处理方式。只是这些方式最终在用户端输入的数据,都需要是『 melody@server.vbird 』 这样的登录帐号名称,同时,还得要改机码,而且恐怕也无法取得 Windows 管理员身份的问题。所以,这个小节当中, 我们改介绍 pGina 这套软件!你同时得要注意,我们的环境中,LDAP server 仅提供 SSL/TLS 的连接验证 (port 636),并不提供明码的 port 389 查找!在这个练习中,我们仅使用 SSL 进行 LDAP 的验证与查找,并不使用 TLS 喔!
准备来安装 pGina,不过得要留意喔~pGina 官网最新稳定版本停止在 2013 年,该版本并没有支持 SSL/TLS 加密! 找了找 github 的好心人,找到底下这个网站,该网站的主程序也是从 pGina 官网 fork 出来的~目前 (2024/04) 最新版本也来到 3.9.9.12。 虽然还是旧了点 (最新版日期 2018/03),不过鸟哥实验过,确实是能支持 LDAP SSL 喔!所以应该还是能用的才对!
下载完毕之后,直接双击该软件,就可以直接安装~安装流程就不再一一介绍,反正,就是一直下一步与同意就对了!到最后的画面, 先点击『 No, I will restart the computer later 』项目,等我们设置妥当再重新开机即可。接下来,请到开始程序集选择『 pGina 』项目, 就可以启动 pGina 的设置画面了!
在出现的设置窗口中,选择左上角的『 Plugin Selection 』页面,然后点击 LDAP 项目的 Authentication (认证) 、Authorization (授权) 与 Gateway 等勾菜单,之后再点击『 Configure 』项目,流程有点像底下这样:
在如下的画面中,你应该要修改的项目有:
如上两个图标,很快的设置好 LDAP 相关的数据,然后按下『Save』后,就会回到前一个画面~然后,请点击 LDAP 底下的『 Local Machine 』项目, 点击 configure 之后,在出现的窗口中,勾选『Always authenticate local users』、『Mirror groups from local user』, 然后右侧 Gateway 的部份,增加 Administrators 群组,处理完毕之后,就可以按下『 Save 』了!如下图所示:
回到原始画面当中,按下右下角『Apply』按钮,然后按下『Save』离开。接下来就可以尝试重新开机。如果一切顺利的话,那么你的 windows 就会出现如下的画面:
上图中左下角的环境,你可以选择通过本机的帐号登录,也可以选择 pGina 登录,如果选择本机帐号,那就应用到本机的登录功能, 如果使用 pGina 的话,就可以使用 LDAP server 上面的用户帐号密码,这样就可以登录系统啦!而且,登录之后的所有用户, 缺省都会是管理员身份!这是合在小型企业的环境中~大型企业或者是控管比较严格的单位内,就不要让一般用户加入 Administrators 群组喔! 特别注意!特别注意!如果你登录系统并且查看一下帐户信息,就可以看到『系统管理员』字样喔!