故障排除
以下是我在此过程中遇到的一些问题以及我如何解决这些问题。
密钥表问题
在尝试挂载 NFS 挂载点时,我收到此错误:
[jack@onitroad ~]# mount -t nfs -o sec=krb5p 192.168.1.13:/opt/mnt /mnt mount.nfs: access denied by server while mounting 192.168.1.13:/opt/mnt
检查 /var/log/krb5kdc.log 日志文件后,我发现了以下条目:
-Jun 11 22:39:48 kdc.exmaple.com krb5kdc[12079](info): TGS_REQ (6 etypes {18 17 16 23 25 26}) 192.168.1.14: LOOKING_UP_SERVER: authtime 0, nfs/jack@onitroad for nfs/jack@onitroad, Server not found in Kerberos database
我仍然不确定为什么会发生这种情况,但是我通过返回 kadmin.local 并添加 nfs/kdc 原则来修复它,我不确定我的 nfs/kdc.example.com 是否被忽略或者也需要。
时间同步
在我的测试过程中,有一次我将我的一个虚拟机回滚到一个较早的快照,这打破了它的时间,我想指出这一点,因为 Kerberos 要求每个服务器的时间在另一个服务器的 5 分钟内才能正常工作。
尝试执行挂载后,在 /var/log/krb5kdc.log 文件中发现以下错误消息。
Jun 11 22:42:12 kdc.exmaple.com krb5kdc[12079](info): TGS_REQ (6 etypes {18 17 16 23 25 26}) 192.168.1.14: ISSUE: authtime 1465648677, etypes {rep=18 tkt=18 ses=18}, nfs/jack@onitroad for nfs/jack@onitroad
这很明显,因为问题已提示和“authtime”有关,我发现我的一台服务器设置为 AEST 时区,而另一台设置为 PDT,在将它们放在同一时区后,问题消失。
示例环境
这是我们将要测试的服务器列表,它们都运行 CentOS 7.
- Kerberos 服务器 (KDC):192.168.1.13 - 此 Linux 服务器将充当我们的 KDC 并提供 Kerberos 票证。它也是我们的 NFS 服务器。
- Kerberos 客户端:192.168.1.14 - 此 Linux 客户端将从 KDC 请求 Kerberos 票证。它也是我们的 NFS 客户端,将从上面的服务器挂载。
准备工作
为了使 Kerberos 正常运行,必须首先在两台服务器上配置以下内容。
- 为了将 Kerberos 用于 NFS,我们必须首先进行 KDC 设置,其中客户端加入领域。
- 我们还应该已经有一个可以工作的 NFS 服务器和客户端设置。
- 服务器和客户端都应该安装了“nfs-utils”包。
默认情况下,NFS 不是很安全,没有真正的身份验证,并且根据主机名或者 IP 地址授予访问权限,信息以纯文本形式通过网络发送,而且伪造 UID/GID 也相当容易。
通过使用 Kerberos,我们可以保护 NFS,因为它提供身份验证、加密和完整性。
设置客户端
现在密钥表文件已放置到客户端服务器上,我们可以启动 nfs-secure 服务。
该服务读取密钥表文件,这就是我们在启动它之前复制它的原因。
systemctl enable nfs-secure systemctl start nfs-secure
此时,我们可以在客户端运行一些基本测试,以确认我们可以使用 nfs 原理获取 Kerberos 票证。
[jack@onitroad ~]# kinit -k -t /etc/krb5.keytab nfs/client.example.com [jack@onitroad ~]# klist Ticket cache: KEYRING:persistent:0:0 Default principal: nfs/jack@onitroad Valid starting Expires Service principal 06/11/2014 23:01:41 06/12/2014 23:01:41 krbtgt/jack@onitroad
太好了,所以我们确实可以拿到票。
此时,值得重新启动客户端和服务器上的服务,以确保一切正常运行并保持最新状态。
如果我没有执行这些重新启动,我会在尝试挂载 NFS 时收到错误“mount.nfs:挂载 192.168.1.13:/opt/mnt 时服务器拒绝访问”。
服务器:
[jack@onitroad ~]# systemctl restart nfs-server [jack@onitroad ~]# systemctl restart nfs-secure-server
客户:
[jack@onitroad ~]# systemctl restart nfs-secure
我们现在应该能够执行挂载到我们的 NFS 服务器,如下所示。
-o 标志用于指定 sec 选项,请注意,这应该与 NFS 服务器上的 /etc/exports 文件中定义的设置相同。
[jack@onitroad ~]# mount -t nfs -o sec=krb5 192.168.1.13:/opt/mnt /mnt [jack@onitroad ~]# df -h /mnt Filesystem Size Used Avail Use% Mounted on 192.168.1.13:/opt/mnt 18G 4.3G 14G 25% /mnt
请注意,为了使挂载工作不需要运行 kinit,我们可以通过运行“kdestroy”来销毁所有 Kerberos 票证、卸载 NFS 挂载然后再次挂载它来测试这一点。
如图所示,我们已经成功地使用 Kerberos 执行了安全的 NFS 挂载。
设置服务器
在这个例子中,NFS 服务器和 KDC 都运行在同一个 CentOS 7 系统上。
我们假设我们已经在此处设置了 KDC 和 NFS 服务器,如果我们需要这样做,请参阅准备工作部分中的链接。
除了上面链接的 NFS 帖子中提供的信息之外,还需要启用并启动一些其他服务来支持 Kerberos,即“nfs-secure-server”。
systemctl enable nfs-secure-server nfs-server systemctl start nfs-secure-server nfs-server
如果我们在启用或者启动这些服务中的任何一个时遇到任何错误,请在完全配置完后尝试再次执行此操作。
有了这个,我们需要修改 /etc/exports 中的 NFS 导出以指定 Kerberos 选项。
/opt/mnt 192.168.1.14(rw,sec=krb5p)
如图所示,可以使用 'sec' 选项指定 Kerberos 选项,下面的列表概述了可用的选项。
- sys:这是默认选项,它信任客户端发送的 UID/GID。使用标准的 Linux 权限,NFS 客户端的 UID/GID 映射到服务器上的相同的 UID/GID,这可能不理想,因为我们可能会收到一些其他用户的 UID/GID。
- krb5:此选项仅提供身份验证,使用 Kerberos 密钥表文件确认客户端身份。
- krb5i:除了 krb5 选项提供的所有内容之外,此选项还提供通信完整性。
- krb5p:除了 krb5i 选项提供的所有功能外,此选项还提供加密。由于开销,这里可能会对性能产生很小的影响,但这是最安全的选择。
现在在 KDC 服务器上,我们将使用 kadmin.local 并为 NFS 服务器和客户端创建主机和 nfs 原则。
在此示例中,KDC 还充当 NFS 服务器,这就是我们为 kdc.example.com 创建主机/nfs 原则的原因
[jack@onitroad ~]# kadmin.local Authenticating as principal root/jack@onitroad with password. kadmin.local: addprinc -randkey host/kdc.example.com WARNING: no policy specified for host/jack@onitroad; defaulting to no policy Principal "host/jack@onitroad" created. kadmin.local: addprinc -randkey host/client.example.com WARNING: no policy specified for host/jack@onitroad; defaulting to no policy Principal "host/jack@onitroad" created. kadmin.local: addprinc -randkey nfs/kdc.example.com WARNING: no policy specified for nfs/jack@onitroad; defaulting to no policy Principal "nfs/jack@onitroad" created. kadmin.local: addprinc -randkey nfs/client.example.com WARNING: no policy specified for nfs/jack@onitroad; defaulting to no policy Principal "nfs/jack@onitroad" created. kadmin.local: addprinc -randkey nfs/kdc WARNING: no policy specified for nfs/jack@onitroad; defaulting to no policy Principal "nfs/jack@onitroad" created.
现在我们将在 NFS 服务器上创建一个包含 KDC 原理的本地密钥表文件。
kadmin.local: ktadd nfs/kdc.example.com Entry for principal nfs/kdc.example.com with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab. Entry for principal nfs/kdc.example.com with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab. Entry for principal nfs/kdc.example.com with kvno 2, encryption type des3-cbc-sha1 added to keytab FILE:/etc/krb5.keytab. Entry for principal nfs/kdc.example.com with kvno 2, encryption type arcfour-hmac added to keytab FILE:/etc/krb5.keytab. Entry for principal nfs/kdc.example.com with kvno 2, encryption type camellia256-cts-cmac added to keytab FILE:/etc/krb5.keytab. Entry for principal nfs/kdc.example.com with kvno 2, encryption type camellia128-cts-cmac added to keytab FILE:/etc/krb5.keytab. Entry for principal nfs/kdc.example.com with kvno 2, encryption type des-hmac-sha1 added to keytab FILE:/etc/krb5.keytab. Entry for principal nfs/kdc.example.com with kvno 2, encryption type des-cbc-md5 added to keytab FILE:/etc/krb5.keytab. kadmin.local: ktadd host/kdc.example.com Entry for principal host/kdc.example.com with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab. Entry for principal host/kdc.example.com with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab. Entry for principal host/kdc.example.com with kvno 2, encryption type des3-cbc-sha1 added to keytab FILE:/etc/krb5.keytab. Entry for principal host/kdc.example.com with kvno 2, encryption type arcfour-hmac added to keytab FILE:/etc/krb5.keytab. Entry for principal host/kdc.example.com with kvno 2, encryption type camellia256-cts-cmac added to keytab FILE:/etc/krb5.keytab. Entry for principal host/kdc.example.com with kvno 2, encryption type camellia128-cts-cmac added to keytab FILE:/etc/krb5.keytab. Entry for principal host/kdc.example.com with kvno 2, encryption type des-hmac-sha1 added to keytab FILE:/etc/krb5.keytab. Entry for principal host/kdc.example.com with kvno 2, encryption type des-cbc-md5 added to keytab FILE:/etc/krb5.keytab. kadmin.local: ktadd nfs/kdc Entry for principal nfs/kdc with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab. Entry for principal nfs/kdc with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab. Entry for principal nfs/kdc with kvno 2, encryption type des3-cbc-sha1 added to keytab FILE:/etc/krb5.keytab. Entry for principal nfs/kdc with kvno 2, encryption type arcfour-hmac added to keytab FILE:/etc/krb5.keytab. Entry for principal nfs/kdc with kvno 2, encryption type camellia256-cts-cmac added to keytab FILE:/etc/krb5.keytab. Entry for principal nfs/kdc with kvno 2, encryption type camellia128-cts-cmac added to keytab FILE:/etc/krb5.keytab. Entry for principal nfs/kdc with kvno 2, encryption type des-hmac-sha1 added to keytab FILE:/etc/krb5.keytab. Entry for principal nfs/kdc with kvno 2, encryption type des-cbc-md5 added to keytab FILE:/etc/krb5.keytab.
接下来,我们将使用 kadmin.local 中的“ktadd -k”来指定要写入的密钥表文件,在此示例中,我们创建 /root/client.keytab ,其中包含 client.example.com 的主机和 nfs 原则和然后将此文件传输到客户端服务器。
[jack@onitroad ~]# kadmin.local Authenticating as principal root/jack@onitroad with password. kadmin.local: ktadd -k /root/client.keytab host/client.example.com Entry for principal host/client.example.com with kvno 3, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/root/client.keytab. Entry for principal host/client.example.com with kvno 3, encryption type aes128-cts-hmac-sha1-96 added to keytab WRFILE:/root/client.keytab. Entry for principal host/client.example.com with kvno 3, encryption type des3-cbc-sha1 added to keytab WRFILE:/root/client.keytab. Entry for principal host/client.example.com with kvno 3, encryption type arcfour-hmac added to keytab WRFILE:/root/client.keytab. Entry for principal host/client.example.com with kvno 3, encryption type camellia256-cts-cmac added to keytab WRFILE:/root/client.keytab. Entry for principal host/client.example.com with kvno 3, encryption type camellia128-cts-cmac added to keytab WRFILE:/root/client.keytab. Entry for principal host/client.example.com with kvno 3, encryption type des-hmac-sha1 added to keytab WRFILE:/root/client.keytab. Entry for principal host/client.example.com with kvno 3, encryption type des-cbc-md5 added to keytab WRFILE:/root/client.keytab. kadmin.local: ktadd -k /root/client.keytab nfs/client.example.com Entry for principal nfs/client.example.com with kvno 5, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/root/client.keytab. Entry for principal nfs/client.example.com with kvno 5, encryption type aes128-cts-hmac-sha1-96 added to keytab WRFILE:/root/client.keytab. Entry for principal nfs/client.example.com with kvno 5, encryption type des3-cbc-sha1 added to keytab WRFILE:/root/client.keytab. Entry for principal nfs/client.example.com with kvno 5, encryption type arcfour-hmac added to keytab WRFILE:/root/client.keytab. Entry for principal nfs/client.example.com with kvno 5, encryption type camellia256-cts-cmac added to keytab WRFILE:/root/client.keytab. Entry for principal nfs/client.example.com with kvno 5, encryption type camellia128-cts-cmac added to keytab WRFILE:/root/client.keytab. Entry for principal nfs/client.example.com with kvno 5, encryption type des-hmac-sha1 added to keytab WRFILE:/root/client.keytab. Entry for principal nfs/client.example.com with kvno 5, encryption type des-cbc-md5 added to keytab WRFILE:/root/client.keytab. kadmin.local: quit [jack@onitroad ~]# scp /root/client.keytab 192.168.1.14:/etc/krb5.keytab jack@onitroad's password: client.keytab 100% 1226 1.2KB/s 00:00