在RHEL 7上设置Kerberised NFS服务器
我们将设置一个Kerberised NFSv4服务器。
要求
要在NFS客户端和主机之间建立Kerberized会话,需要做一些事情(贷记给Sander van Vugt)。
/etc/krb5.keytab:此文件包含NFS服务器(作为NFS客户端)的安全主体,并且需要加入Kerberos领域。
在“ /etc/krb5.keytab”文件中,包含主机主体,NFS主体或者这两个主体。
Kerberized用户会话:在针对Kerberos服务器配置了远程身份验证之后,登录过程已经被Kerberized了,并且不需要任何其他操作。
共享定义和挂载选项中的sec = method选项。
这将启用所需的Kerberos方法。
可以使用以下选项:none,sys,krb5,krb5i和krb5p。
NFS服务器和NFS安全服务器服务必须在NFS服务器上处于活动状态。
我们必须手动加载这些服务并在RHEL 7.0上启用它们。
必须在客户端上加载nfs-secure服务。
我们必须在RHEL 7.0上手动加载并启用此服务。
实验室
我们的实验室中有三台RHEL 7.0服务器(未安装更新):
ipa.rhce.local(10.8.8.70)FreeIPA服务器,提供DNS,LDAP,NTP和Kerberos服务,
srv1.rhce.local(10.8.8.71)将配置为Kerberised NFS服务器,
srv2.rhce.local(10.8.8.72)将被配置为NFS客户端。
所有这三台服务器都将SELinux设置为强制模式。
我们的FreeIPA服务器设置可以在这里找到。
已使用sssd为srv1和srv2服务器配置了LDAP和Kerberos身份验证,有关详细信息,请查看此教程 文章。
在未安装任何更新的RHEL 7.0上,我们必须在srv1和srv2服务器上导入Kerberos密钥选项卡,运行nfs-secure-server和nfs-secure并使用sec = krb5p挂载共享。
保持时间同步
要使Kerberos运行,NTP同步和主机名解析必须正常工作。
NFS服务器srv1和NFS客户端srv2都是必需的。
我们的FreeIPA服务器提供NTP和DNS服务。
时间同步可以通过使用ntpd或者chronyd来实现。
我们在本文中使用后者。
在srv1和srv2上都安装软件包:
# yum install -y chrony
打开“ /etc/chrony.conf”并添加指向我们的NTP服务器的行:
server ipa.rhce.local iburst
启用并启动服务:
# systemctl enable chronyd && systemctl start chronyd
启用基于NTP的网络时间同步:
# timedatectl set-ntp true
查看:
# chronyc sources 210 Number of sources = 1 MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* ipa.rhce.local 3 6 17 41 -1761ns[ +10us] +/- 83ms
基本NFS服务器设置
本节中的所有命令都在服务器srv1上运行。
本文中使用的nfs-utils软件包版本为1.3.0。
软件包,服务和防火墙
# yum install -y nfs-utils # systemctl enable nfs-server && systemctl start nfs-server
我们可以选择启用rpcbind守护程序,以将RPC程序编号转换为地址,NFSv3会使用它,但NFSv4不需要。
# systemctl enable rpcbind && systemctl start rpcbind
在RHEL 7.0上,我们必须启用nfs-secure-server服务:
# systemctl enable nfs-secure-server
这些是RHEL 7.0上可用的与nfs相关的服务:
# ls -lon /usr/lib/systemd/system/|grep " nfs-" -rw-r--r--. 1 0 286 Mar 26 2014 nfs-blkmap.service -rw-r--r--. 1 0 265 Mar 26 2014 nfs-idmap.service -rw-r--r--. 1 0 491 Mar 26 2014 nfs-lock.service lrwxrwxrwx. 1 0 16 Jun 3 21:02 nfslock.service -> nfs-lock.service -rw-r--r--. 1 0 228 Mar 26 2014 nfs-mountd.service -rw-r--r--. 1 0 263 Mar 26 2014 nfs-rquotad.service -rw-r--r--. 1 0 332 Mar 26 2014 nfs-secure-server.service -rw-r--r--. 1 0 279 Mar 26 2014 nfs-secure.service -rw-r--r--. 1 0 650 Mar 26 2014 nfs-server.service lrwxrwxrwx. 1 0 18 Jun 3 21:02 nfs.service -> nfs-server.service lrwxrwxrwx. 1 0 18 Jun 3 21:02 rpcgssd.service -> nfs-secure.service lrwxrwxrwx. 1 0 17 Jun 3 21:02 rpcidmapd.service -> nfs-idmap.service lrwxrwxrwx. 1 0 25 Jun 3 21:02 rpcsvcgssd.service -> nfs-secure-server.service
在RHEL 7.1和RHEL 7.2上,nfs-secure-server服务变为静态服务,无法启用。
假定系统上存在文件“ /etc/krb5.keytab”,它会由nfs-server服务自动启动。
这些是RHEL 7.1和RHEL 7.2上可用的与nfs相关的服务:
# ls -lon /usr/lib/systemd/system/|grep " nfs-" -rw-r--r--. 1 0 345 Jan 23 2014 nfs-blkmap.service -rw-r--r--. 1 0 215 Jan 23 2014 nfs-blkmap.target -rw-r--r--. 1 0 477 Jan 23 2014 nfs-client.target -rw-r--r--. 1 0 144 Jan 23 2014 nfs-config.service -rw-r--r--. 1 0 240 Jan 23 2014 nfs-idmapd.service lrwxrwxrwx. 1 0 18 Jun 23 12:41 nfs-idmap.service -> nfs-idmapd.service lrwxrwxrwx. 1 0 17 Jun 23 12:41 nfs-lock.service -> rpc-statd.service -rw-r--r--. 1 0 300 Jan 23 2014 nfs-mountd.service lrwxrwxrwx. 1 0 19 Jun 23 12:41 nfs-secure-server.service -> rpc-svcgssd.service lrwxrwxrwx. 1 0 16 Jun 23 12:41 nfs-secure.service -> rpc-gssd.service -rw-r--r--. 1 0 881 Jan 23 2014 nfs-server.service lrwxrwxrwx. 1 0 18 Jun 23 12:41 nfs.service -> nfs-server.service -rw-r--r--. 1 0 567 Jan 23 2014 nfs-utils.service
请注意,nfs-idmap服务变成了指向nfs-idmapd的符号链接。
在RHEL 7.0上,请不要启动nfs-secure-server,因为没有创建密钥表文件。
没有它,安全的NFS服务器将失败。
配置防火墙:
# firewall-cmd --permanent --add-service=nfs # firewall-cmd --reload
请注意,只有NFSv3才需要rpc-bind和mountd服务,并且在设置NFSv4服务器时可以将其跳过。
# firewall-cmd --permanent --add-service={mountd,rpc-bind} # firewall-cmd --reload
配置NFS导出
我们将创建三个不同的出口,如下所述:
'/srv/nfs_pub'与'all_squash'的公共NFS共享,
“/srv/nfs_group”用于小组协作的共享,
'/srv/nfs_secure'安全的Kerberized NFS共享。
创建目录:
# mkdir -m 0755 /srv/nfs_{pub,group,secure}
更改公共NFS共享的所有权。
所有用户都将被压缩。
我们会将所有uid和gid映射到NFS匿名用户,在这种情况下为nfsnobody帐户:
# chown nfsnobody:nfsnobody /srv/nfs_pub
配置组共享的协作:
# groupadd devops # chgrp devops /srv/nfs_group # chmod 2770 /srv/nfs_group
对于以kerberized化的NFS共享,我们将使LDAP用户alice成为共享的所有者,以便我们可以轻松地测试身份验证:
# chown alice /srv/nfs_secure
让我们检查默认的SELinux上下文:
# ls -Z /srv drwxrws---. root devops unconfined_u:object_r:var_t:s0 /srv/nfs_group drwxr-xr-x. alice root unconfined_u:object_r:var_t:s0 /srv/nfs_secure drwxr-xr-x. nfsnobody nfsnobody unconfined_u:object_r:var_t:s0 /srv/nfs_pub
对于公共共享,我们要使用public_content_rw_t上下文类型。
对于其他共享,nfs_t类型应足够。
# yum install -y policycoreutils-python # semanage fcontext -a -t public_content_rw_t "/srv/nfs_pub(/.*)?" # semanage fcontext -a -t nfs_t "/srv/nfs_group(/.*)?" # semanage fcontext -a -t nfs_t "/srv/nfs_secure(/.*)?"
请注意,标有public_content_t类型的文件允许它们被FTP,Apache,Samba和rsync读取。
标有public_content_rw_t类型的文件需要设置布尔值,然后服务才能写入标有public_content_rw_t类型的文件。
为了允许NFS服务器修改用于公共文件传输服务的公共文件,我们必须打开nfsd_anon_write布尔值:
# setsebool -P nfsd_anon_write=1
恢复SELinux上下文:
# restorecon -Rv /srv/nfs_*
检查确认:
# ls -Z /srv drwxrws---. root devops unconfined_u:object_r:nfs_t:s0 nfs_group drwxr-xr-x. nfsnobody nfsnobody unconfined_u:object_r:public_content_rw_t:s0 nfs_pub drwxr-xr-x. alice root unconfined_u:object_r:nfs_t:s0 nfs_secure
打开文件“/etc/exports”并添加以下行:
/srv/nfs_pub 10.8.8.0/24(sec=sys,rw,sync,root_squash,all_squash) /srv/nfs_group 10.8.8.0/24(sec=sys,rw,sync,root_squash) /srv/nfs_secure srv2.rhce.local(sec=krb5p,rw,sync)
我们可以看到仅允许从服务器srv2访问安全共享。
整个局域网都允许访问其他两个共享。
导出股票:
# exportfs -rav exporting srv2.rhce.local:/srv/nfs_secure exporting 10.8.8.0/24:/srv/nfs_group exporting 10.8.8.0/24:/srv/nfs_pub
检查启用了哪些NFS协议:
# cat /proc/fs/nfsd/versions -2 +3 +4 +4.1 -4.2
默认情况下,NFS挂载具有SELinux上下文nfs_t,而与它们在NFS服务器上具有的SELinux上下文无关。
通过切换到NFS版本4.2,可以强制NFS服务器正确导出共享的SELinux上下文。
请注意,此选项需要显式打开。
通过将以下行添加到文件“/etc/sysconfig/nfs”来启用NFS v4.2:
RPCNFSDARGS="-V 4.2"
在客户端,必须将mount -o vers = 4.2指定为mount选项。
要检查的另一件事是,默认情况下,启用了nfs_export_all_ro和nfs_export_all_rw SELinux布尔值:
# getsebool -a | grep nfs_ex nfs_export_all_ro --> on nfs_export_all_rw --> on
这允许NFS守护程序读取和写入几乎所有文件。
禁用布尔值以锁定功能。
Kerberos密钥表文件
有两种创建密钥表文件'/etc/krb5.keytab'的方法。
如果我们知道IPA管理员凭据,则可以获取Kerberos票证,并使用ipa-getkeytab命令。
# yum install -y ipa-client
获取Kerberos票证并验证:
# kinit admin # klist
获取我们的Kerberos NFS主体的密钥表:
# ipa-getkeytab -s ipa.rhce.local -p nfs/srv1.rhce.local -k /etc/krb5.keytab Keytab successfully retrieved and stored in: /etc/krb5.keytab
验证:
# klist -k 2 nfs/Hyman@theitroad 2 nfs/Hyman@theitroad 2 nfs/Hyman@theitroad 2 nfs/Hyman@theitroad 2 nfs/Hyman@theitroad 2 nfs/Hyman@theitroad
现在,如果我们没有Kerberos管理员凭据,则可以选择通过FTP下载服务器的密钥表文件(假设该文件在Kerberos服务器上可用):
# wget -O /etc/krb5.keytab ftp://ipa.rhce.local/pub/srv1.keytab # chmod 0600 /etc/krb5.keytab # restorecon -v /etc/krb5.keytab
检查确认:
klist -k 3 nfs/Hyman@theitroad 3 nfs/Hyman@theitroad 3 nfs/Hyman@theitroad 3 nfs/Hyman@theitroad 3 nfs/Hyman@theitroad 3 nfs/Hyman@theitroad
创建密钥表后,启动nfs-secure-server服务:
# systemctl start nfs-secure-server
检查NFS服务器状态是否有任何错误。
对于冗长的日志记录,请打开文件'/etc/sysconfig/nfs',将-vvv字符串分配给RPCGSSDARGS变量,然后重新启动nfs-secure-server服务。
在继续进行客户端配置之前,请重新引导NFS服务器。
重新启动后,请确保两个服务都在运行:
# systemctl status nfs-server nfs-secure-server
NFS客户端安装
本节中的所有命令都在服务器srv2上运行。
配套和服务
# yum install -y nfs-utils
在RHEL 7.0上,启用nfs-secure服务:
# systemctl enable nfs-secure
在RHEL 7.1和RHEL 7.2上,nfs-secure是静态服务,无法启用。
它由nfs-client.target服务启动,假定系统上存在文件“ /etc/krb5.keytab”:
# systemctl enable nfs-client.target
挂载以Kerberized方式存储的NFS共享
如果NFSv3服务器已将防火墙配置为允许挂载和rpcbind通信,则可以使用showmount命令来验证客户端可以看到共享:
# showmount -e srv1.rhce.local Export list for srv1.rhce.local: /srv/nfs_group 10.8.8.0/24 /srv/nfs_pub 10.8.8.0/24 /srv/nfs_secure srv2.rhce.local
由于NFSv4不使用mountd守护程序,因此showmount将不会返回有关版本4装载的信息。
与NFS服务器一样,如果我们知道Kerberos管理员凭据,则可以使用ipa-client获取密钥表:
# yum install -y ipa-client
获取Kerberos票证并验证:
# kinit admin # klist
获取我们的Kerberos NFS主体的密钥表:
# ipa-getkeytab -s ipa.rhce.local -p nfs/srv2.rhce.local -k /etc/krb5.keytab Keytab successfully retrieved and stored in: /etc/krb5.keytab
验证:
# klist -k Keytab name: FILE:/etc/krb5.keytab KVNO Principal ---- ------------------------------------------------------------------------- 4 nfs/Hyman@theitroad 4 nfs/Hyman@theitroad 4 nfs/Hyman@theitroad 4 nfs/Hyman@theitroad 4 nfs/Hyman@theitroad 4 nfs/Hyman@theitroad
正如我们在上面看到的那样,我们的密钥表不包含主机凭证,因为在设置FreeIPA服务器时尚未创建主机凭证。
因此,至关重要的是,我们的NFS客户端配置为进行Kerberos身份验证(使用authconfig-tui f.e.),否则我们将无法挂载以kerberized方式存储的NFS共享,并且rpc.gssd会抱怨很多:
ERROR: gssd_refresh_krb5_machine_credential: no usable keytab entry found in keytab /etc/krb5.keytab for connection with host srv1.rhce.local
如果Kerberos凭据不可用,我们可以从FTP获取密钥表(因为我们已经为系统配置了密钥表)。
从Kerberos服务器下载keytab文件:
# wget ftp://ipa.rhce.local/pub/srv2.keytab -O /etc/krb5.keytab # chmod 0600 /etc/krb5.keytab # restorecon -v /etc/krb5.keytab
# klist klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_0)
# klist -k Keytab name: FILE:/etc/krb5.keytab KVNO Principal ---- ------------------------------------------------------------------------- 5 nfs/Hyman@theitroad 5 nfs/Hyman@theitroad 5 nfs/Hyman@theitroad 5 nfs/Hyman@theitroad 5 nfs/Hyman@theitroad 5 nfs/Hyman@theitroad
启动nfs-secure服务:
# systemctl start nfs-secure
对于冗长的日志记录,请打开文件'/etc/sysconfig/nfs',将-vvv字符串分配给RPCGSSDARGS变量,然后重新启动nfs-secure服务。
如果遇到问题,可能会需要它。
挂载共享:
# mkdir /mnt/nfs_secure # mount -t nfs4 -o vers=4.2,sec=krb5p srv1.rhce.local:/srv/nfs_secure /mnt/nfs_secure
如果收到错误消息“ mount.nfs:指定了错误的安装选项”,请检查是否在客户端上启动了nfs-secure守护程序,并在服务器上启动了nfs-secure-server。
检查确认:
# mount | grep secure srv1.rhce.local:/srv/nfs_secure on /mnt/nfs_secure type nfs (rw,relatime,seclabel,vers=4.2,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=krb5p,clientaddr=10.8.8.72,local_lock=none,addr=10.8.8.71)
要在启动时挂载,请将以下内容添加到'/etc/fstab'中:
srv1.rhce.local:/srv/nfs_secure /mnt/nfs_secure nfs4 rw,vers=4.2,sec=krb5p 0 0
注意,挂载NFSv4共享不需要_netdev选项。
据我了解,在NFSv3(挂载类型为nfs)下,_netdev选项告诉系统等待挂载,直到网络可用为止。
使用nfs4的安装类型时,_netdev选项将被忽略,因为remote-fs.target将拉远安装。
但是,Sander van Vugt建议所有需要通过'/etc/fstab'挂载的远程文件系统都包括_netdev和x-systemd.automount挂载选项。
_netdev挂载选项可确保挂载被延迟,直到网络完全可用为止。
x-systemd.automount选项可确保与systemd的最佳集成,并将确保安装速度大大提高。
测试Kerberos,更改为用户alice以访问共享:
# su - alice Last login: Wed Jan 18 16:06:51 BST 2015 on pts/2 su: warning: cannot change directory to /home/alice: No such file or directory id: cannot find name for group ID 1219400005 $touch /mnt/nfs_secure/file touch: cannot touch ‘/mnt/nfs_secure/file’: Permission denied $kinit Password for Hyman@theitroad: $touch /mnt/nfs_secure/file $ls -l /mnt/nfs_secure/file -rw-r--r--. 1 alice 1219400005 0 Jun 3 20:57 /mnt/nfs_secure/file $kdestroy $exit
挂载非基于Kerberized的NFS共享
创建安装点:
# mkdir /mnt/nfs_{pub,group}
挂载公共共享和组共享,因为它们不需要Kerberos配置:
# mount -t nfs4 -o vers=4.2,sec=sys srv1.rhce.local:/srv/nfs_pub /mnt/nfs_pub # mount -t nfs4 -o vers=4.2,sec=sys srv1.rhce.local:/srv/nfs_group /mnt/nfs_group
密钥版本号存在问题
有时,KDC使用的密钥版本号(KVNO)与系统托管的服务的“ /etc/krb5.keytab”中存储的服务主体密钥不匹配。
在KDC上创建一组新的密钥而不用新的密钥更新密钥表文件时,KVNO可能会失去同步。
要进行诊断,请列出密钥表条目:
# klist -k Keytab name: FILE:/etc/krb5.keytab KVNO Principal ---- ------------------------------------------------------------------------- 3 nfs/Hyman@theitroad 3 nfs/Hyman@theitroad 3 nfs/Hyman@theitroad 3 nfs/Hyman@theitroad 3 nfs/Hyman@theitroad 3 nfs/Hyman@theitroad
通过使用主机密钥获取Kerberos票证:
# kinit -k
或者使用管理员凭据:
# kinit admin
检查KDC使用的KVNO:
# kvno nfs/srv2.rhce.local nfs/Hyman@theitroad: kvno = 4