为 Linux 客户端设置基于 Kerberos 身份验证的 NFS 服务器 - 第 7 部分
在本系列的上一篇文章中,我们回顾了如何在可能包含多种操作系统的网络上设置 Samba 共享。现在,如果您需要为类 Unix 客户端组设置文件共享,您会自动想到网络文件系统(简称NFS)。
在本文中,我们将引导您完成使用基于 Kerberos 的身份验证进行NFS共享的过程。假设您已经设置了 NFS 服务器和客户端。如果没有,请参阅安装和配置 NFS 服务器- 其中将列出需要安装的必要软件包,并解释如何在继续操作之前在服务器上执行初始配置。
此外,您还需要配置SELinux和Firewalld,以允许通过 NFS 进行文件共享。
以下示例假定您的NFS共享位于box2中的/nfs中:
# semanage fcontext -a -t public_content_rw_t "/nfs(/.*)?" # restorecon -R /nfs # setsebool -P nfs_export_all_rw on # setsebool -P nfs_export_all_ro on
(其中-P标志表示重启后仍然存在)。
最后,别忘了:
创建 NFS 组并配置 NFS 共享目录
1.创建一个名为nfs的组,并将nfsnobody用户添加到该组,然后将/nfs目录的权限更改为0770,并将其组所有者更改为nfs。 因此,nfsnobody (映射到客户端请求) 将对共享具有写权限),并且您无需在/etc/exports文件中使用no_root_squash。
# groupadd nfs # usermod -a -G nfs nfsnobody # chmod 0770 /nfs # chgrp nfs /nfs
2.修改导出文件 ( /etc/exports ),如下所示,仅允许使用Kerberos安全性 ( sec=krb5 ) 从box1进行访问。
注意: anongid的值已设置为我们之前创建的nfs组的GID :
/nfs box1(rw,sec=krb5,anongid=1004)
3.重新导出(-r)所有(-a) NFS 共享。在输出中添加详细信息(-v)是个好主意,因为如果出现问题,它将提供有用的信息来排除服务器故障:
# exportfs -arv
4.重新启动并启用 NFS 服务器和相关服务。请注意,您不必启用nfs-lock和nfs-idmapd,因为它们将在启动时由其他服务自动启动:
# systemctl restart rpcbind nfs-server nfs-lock nfs-idmap # systemctl enable rpcbind nfs-server
测试环境和其他先决条件
在本指南中,我们将使用以下测试环境:
- 客户端机器 [ box1: 192.168.0.18 ]
- NFS/Kerberos 服务器[box2:192.168.0.20](又称密钥分发中心,简称KDC)。
注意:Kerberos服务对于身份验证方案至关重要。
如您所见,为了简单起见, NFS服务器和KDC托管在同一台机器上,但如果有更多可用机器,您可以将它们设置在单独的机器上。两台机器都是域的成员mydomain.com
。
最后但同样重要的一点是,Kerberos至少要求客户端和服务器中都存在名称解析的基本模式和网络时间协议服务,因为 Kerberos 身份验证的安全性部分基于票证的时间戳。
为了设置名称解析,我们将在客户端和服务器中使用/etc/hosts文件:
192.168.0.18 box1.mydomain.com box1 192.168.0.20 box2.mydomain.com box2
在RHEL 7中,chrony是用于NTP同步的默认软件:
# yum install chrony # systemctl start chronyd # systemctl enable chronyd
为了确保chrony确实将您的系统时间与时间服务器同步,您可能需要发出以下命令两到三次,并确保偏移量接近零:
# chronyc tracking
安装和配置 Kerberos
要设置KDC ,请在服务器和客户端上安装以下软件包(省略客户端中的服务器包):
# yum update && yum install krb5-server krb5-workstation pam_krb5
安装完成后,编辑配置文件(/etc/krb5.conf和/var/kerberos/krb5kdc/kadm5.acl)并将example.com的所有实例(小写和大写)替换为mydomain.com
以下内容。
现在创建Kerberos数据库(请注意,这可能需要一段时间,因为它需要系统中一定程度的熵。为了加快速度,我打开了另一个终端并运行ping -f localhost 30-45 秒):
# kdb5_util create -s
接下来,通过防火墙启用Kerberos并启动/启用相关服务。
重要提示:客户端上也必须启动并启用nfs-secure :
# firewall-cmd --permanent --add-service=kerberos # systemctl start krb5kdc kadmin nfs-secure # systemctl enable krb5kdc kadmin nfs-secure
接下来,使用kadmin.local工具为 root 创建管理员主体:
# kadmin.local # addprinc root/admin
并将Kerberos服务器添加到数据库:
# addprinc -randkey host/box2.mydomain.com
客户端 ( box1 ) 和服务器 ( box2 ) 的NFS服务相同。请注意,在下面的屏幕截图中,我在退出之前忘记对box1执行此操作:
# addprinc -randkey nfs/box2.mydomain.com # addprinc -randkey nfs/box1.mydomain.com
输入quit并按 Enter退出:
然后获取并缓存 root/admin 的 Kerberos 票证授予票证:
# kinit root/admin # klist
实际使用Kerberos之前的最后一步是将授权使用 Kerberos 身份验证的主体存储到keytab文件中(在服务器中):
# kadmin.local # ktadd host/box2.mydomain.com # ktadd nfs/box2.mydomain.com # ktadd nfs/box1.mydomain.com
最后,挂载共享并执行写入测试:
# mount -t nfs4 -o sec=krb5 box2:/nfs /mnt # echo "Hello from Example.com" > /mnt/greeting.txt
现在让我们卸载共享,在客户端中重命名keytab文件(以模拟它不存在)并尝试再次挂载共享:
# umount /mnt # mv /etc/krb5.keytab /etc/krb5.keytab.orig
现在您可以使用基于 Kerberos身份验证的NFS共享。
概括
在本文中,我们解释了如何使用Kerberos身份验证设置NFS。由于该主题涉及的内容太多,我们无法在一篇指南中全部介绍,因此请随时查看在线Kerberos 文档。由于 Kerberos 至少可以说有点棘手,如果您遇到任何问题或需要测试或实施方面的帮助,请随时使用下面的表单给我们留言。