NFS 权限被 sec=krb5p 拒绝

NFS 权限被 sec=krb5p 拒绝

sec=krb5p我正在两个运行 Debian 11 (Bullseye) 的 Hyper-V VM 上使用 MIT Kerberos ( ) 设置 NFSv4.2 。当我使用基于机器的身份验证 ( sec=sys) 时,一切正常。使用 Kerberos ( sec=krb5p),我可以在客户端上安装共享,但当Permission denied我尝试访问共享时我会看到。我在下面详细记录了所有这些,包括想到的所有相关配置信息。我有点超出了我的深度。我错过了什么或做错了什么?

NFS 与sec=sys

服务器上的 /etc/exports:

/exports/ned 192.168.1.0/24(sec=sys,rw,no_subtree_check)

客户端上的 /etc/fstab:

test-debian-server:/exports/ned /imports/ned nfs sec=sys 0 0

测试共享:

ned@test-debian-desktop:/imports$ su - -c "nfsstat -m"
Password:
/imports/ned from test-debian-server:/exports/ned
 Flags: rw,relatime,vers=4.2,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.63,local_lock=none,addr=192.168.1.62

ned@test-debian-desktop:/imports$ id
uid=2001(ned) gid=2001(ned) groups=2001(ned)
ned@test-debian-desktop:/imports$ ls -l
total 4
drwxr-xr-x 2 ned ned 4096 Jan 26 17:57 ned
ned@test-debian-desktop:/imports$ cd ned
ned@test-debian-desktop:/imports/ned$ ls
ned@test-debian-desktop:/imports/ned$ touch test.txt
ned@test-debian-desktop:/imports/ned$ ls
test.txt

在服务器上验证 test.txt:

ned@test-debian-server:/exports$ id
uid=2001(ned) gid=2001(ned) groups=2001(ned)
ned@test-debian-server:/exports$ ls -l
total 4
drwxr-xr-x 2 ned ned 4096 Jan 26 19:11 ned
ned@test-debian-server:/exports$ ls -l ned
total 0
-rw-r--r-- 1 ned ned 0 Jan 26 19:11 test.txt

权限被拒绝sec=krb5p

服务器配置

/etc/主机:

127.0.0.1       localhost
127.0.1.1       test-debian-server.test test-debian-server
192.168.1.63    test-debian-desktop
192.168.1.62    test-debian-server

/etc/default/nfs-kernel-server:

RPCNFSDCOUNT=8
RPCNFSDPRIORITY=0
RPCMOUNTDOPTS="--manage-gids"
NEED_SVCGSSD=""
RPCSVCGSSDOPTS=""

/etc/default/nfs-common:

NEED_STATD=
STATDOPTS=
NEED_IDMAPD=
NEED_GSSD=

/etc/导出:

/exports/ned 192.168.1.0/24(sec=krb5p,rw,no_subtree_check)

/etc/krb5.conf(大量删节):

[libdefaults]
        default_realm = TEST

        kdc_timesync = 1
        ccache_type = 4
        forwardable = true
        proxiable = true

[realms]
        TEST = {
                kdc = test-debian-server
                admin_server = test-debian-server
        }

Kerberos 原则:

root@test-debian-server:~# kadmin.local listprincs
K/M@TEST
host/test-debian-desktop@TEST
host/test-debian-server@TEST
kadmin/admin@TEST
kadmin/changepw@TEST
kadmin/test-debian-server@TEST
kiprop/test-debian-server@TEST
krbtgt/TEST@TEST
nfs/test-debian-desktop@TEST
nfs/test-debian-server@TEST

Kerberos 密钥表:

root@test-debian-server:~# klist -ke
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   2 nfs/test-debian-server@TEST (aes256-cts-hmac-sha1-96)
   2 nfs/test-debian-server@TEST (aes128-cts-hmac-sha1-96)
   2 host/test-debian-server@TEST (aes256-cts-hmac-sha1-96)
   2 host/test-debian-server@TEST (aes128-cts-hmac-sha1-96)

NFS有效域:

root@test-debian-server:~# nfsidmap -d
test

导出权限:

root@test-debian-server:~# ls -ld /exports /exports/*
drwxr-xr-x 3 root root 4096 Jan 26 17:58 /exports
drwxr-xr-x 2 ned  ned  4096 Jan 26 19:11 /exports/ned

客户端配置

/etc/主机:

127.0.0.1       localhost
127.0.1.1       test-debian-desktop.test        test-debian-desktop
192.168.1.63    test-debian-desktop
192.168.1.62    test-debian-server

/etc/default/nfs-common:与服务器相同。

/etc/fstab:

test-debian-server:/exports/ned /imports/ned nfs sec=krb5p 0 0

/etc/krb5.conf:与服务器相同。

Kerberos 密钥表:

root@test-debian-desktop:~# klist -ke
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
   3 nfs/test-debian-desktop@TEST (aes256-cts-hmac-sha1-96)
   3 nfs/test-debian-desktop@TEST (aes128-cts-hmac-sha1-96)
   2 host/test-debian-desktop@TEST (aes256-cts-hmac-sha1-96)
   2 host/test-debian-desktop@TEST (aes128-cts-hmac-sha1-96)

NFS有效域:

root@test-debian-desktop:~# nfsidmap -d
test

导入权限(卸载共享后):

root@test-debian-desktop:~# umount /imports/ned
root@test-debian-desktop:~# ls -ld /imports /imports/*
drwxr-xr-x 3 root root 4096 Jan 26 19:08 /imports
drwxr-xr-x 2 root root 4096 Jan 26 17:02 /imports/ned

(注:我得到相同的结果,当我chown ned:ned /imports/ned。我认为root:root是正确的,以防止ned挂载失败时意外写入本地磁盘?)

没有权限

重启服务器和客户端后:

ned@test-debian-desktop:/imports$ su -c "nfsstat -m"
Password:
/imports/ned from test-debian-server:/exports/ned
 Flags: rw,relatime,vers=4.2,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=krb5p,clientaddr=192.168.1.63,local_lock=none,addr=192.168.1.62

ned@test-debian-desktop:/imports$ ls -l
total 4
drwxr-xr-x 2 ned ned 4096 Jan 26 19:11 ned
ned@test-debian-desktop:/imports$ cd ned
bash: cd: ned: Permission denied
ned@test-debian-desktop:/imports$

有时ned可以列出最初的共享ls -l但无法cd进入,如上面的会话所示;一分钟后,如果ned尝试这样做ls -l,他们将看到文件夹属性的Permission denied问号。ned发生这种情况时,我可以执行以下操作:

ned@test-debian-desktop:/imports$ ls -l
ls: cannot access 'ned': Permission denied
total 0
d????????? ? ? ? ?            ? ned
ned@test-debian-desktop:/imports$ su -c "ls -l /imports"
Password:
total 4
drwxr-xr-x 2 ned ned 4096 Jan 26 19:11 ned
ned@test-debian-desktop:/imports$ ls -l
total 4
drwxr-xr-x 2 ned ned 4096 Jan 26 19:11 ned
ned@test-debian-desktop:/imports$

这似乎是由于属性缓存过期所致:如果我noac在客户端上的 /etc/fstab 中禁用属性缓存并重新挂载,nedPermission denied在调用ls -l.

我尝试过的

在客户端和服务器上,我都有:

  • 设置Verbosity = 4/etc/idmapd.conf
  • 用于rpcdebug设置nfsnfsdnlm和的所有标志rpc
  • 在 systemd 日志中搜索相关信息(重新启动并尝试访问共享后)。

我已检查systemctl status并验证以下单位是否正确active,并且我已通读了每个单位列出的最近日记条目(并没有发现明显的错误迹象):

  • 服务器:
    • krb5-管理服务器
    • krb5-kdc
    • nfs 内核服务器
    • nfs-idmapd
    • nfs挂载
    • nfs 服务器
    • rpc-svcgssd
    • rpc-gssd
  • 客户:
    • rpc-gssd
    • 进口-ned.mount

据我所知,Kerberos 的身份验证正确。

我已经阅读了我能找到的所有相关手册页和在线手册以及 StackExchange 上似乎相关的每个问题,但我无法解决问题或让客户端或服务器生成错误消息来告诉我为什么许可被拒绝。

编辑以根据以下内容添加Kerberos 主体host/test-debian-desktop和密钥host/test-debian-serverUnix 应用服务器 - MIT Kerberos 文档

我错过了什么

所选答案很好地解释了我的配置不起作用的原因。如果有人遇到同样的情况,这里是我所缺少的详细信息 - 请阅读下面的答案以了解原因。

Kerberos 对个人用户进行身份验证(由于某种原因我认为它没有)。因此,为了ned进行连接,Kerberos 必须有一个主体,并且客户端 PC 上的ned@TESTLinux 用户必须获得该主体的票证授予票证 (TGT)。然后一切都会很顺利。为了或多或少地自动化此操作,我执行了以下操作:nedkinit

/etc/krb5/user/<uid>/client.keytab:保存ned和 的密钥只有 ned 可读!我使用了0600权限,所有者和组均为ned.

有了这个密钥表,我可以简单地调用kinit -ki登录,而无需输入密码。我自动化此操作的快速而肮脏的方法是将其添加到 ~/.gnomerc、~/.bashrc 和 ~/.zshrc (因为我使用 Gnome、Bash 和 Zsh)。

此外,由于我通过 Ansible 部署这些配置,并且有一些共享点文件但不需要 NFS 访问的系统,所以我对 Bash 和 Zsh 更感兴趣,只有kinit在它和客户端密钥表存在时才运行:

〜/ .bashrc:

# Grab or renew a Kerberos ticket.
if type -t kinit >/dev/null && [[ -r /etc/krb/user/$(id -u)/client.keytab ]]
then
  kinit -ki
fi

〜/ .zshrc:

# Grab or renew a Kerberos ticket.
if type kinit >/dev/null && [[ -r /etc/krb/user/$(id -u)/client.keytab ]]
then
  kinit -ki
fi

答案1

您收到“权限被拒绝”的原因是因为您的凭证缓存中没有 Kerberos TGT(票据授予票据),正如您在klist.您必须运行kinit该帐户并输入密码。一旦您通过身份验证并缓存了 TGT 票证,您就可以使用此票证向 NFS 服务器进行身份验证。

您需要记住,Kerberos 身份验证的整体思想是您需要向 NFS 服务器(或任何其他相关服务)“证明”您的身份。您可以通过向命令输入密码(只有您知道)来提供您生成的缓存 TGT 来“证明”这一点kinit。所以通常这就是它应该工作的方式。您可以更改krb5//中的到期和续订时间,sssd以使您的票证在到期前持续更长时间,但最终在某些时候您需要以一种或另一种方式重新进行身份验证。

当然,您始终可以为您的帐户创建密钥表。不要将其添加到客户端的密钥表中!客户端密钥表用于客户独自的。您需要在新文件中创建新的密钥表你的帐户并以最低权限保持此文件的安全和私密性,并使用此密钥表在凭证缓存中生成 TGT,而无需交互式键入密码。理论上,您甚至可以创建一个crontab定期为您执行此操作的密钥表,但这不太安全,因为有人可能会在某些时候窃取您的密钥表(例如,如果他具有 root 访问权限)并冒充您提供其他服务,但那是为了您的考虑。

另外,如果您要走密钥表之路,请不要忘记,每次更改帐户密码时,您还需要更新密钥表。

相关内容