在RHEL 7上设置Kerberised NFS服务器

时间:2020-03-21 11:45:57  来源:igfitidea点击:

我们将设置一个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