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-内核服务器:
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 中禁用属性缓存并重新挂载,ned
则Permission denied
在调用ls -l
.
我试过的
在客户端和服务器上,我都有:
- 设置
Verbosity = 4
在/etc/idmapd.conf
- 用于
rpcdebug
设置nfs
、nfsd
、nlm
和的所有标志rpc
- 搜索 systemd 日志以获取相关信息(在重新启动并尝试访问共享之后)。
我已经检查systemctl status
以确认以下单位是active
,并且我已经阅读了为每个单位列出的最近的日记条目(并没有发现明显的错误迹象):
- 服务器:
- krb5-管理服务器
- krb5-kdc
- nfs 内核服务器
- nfs-idmapd
- nfs-mountd
- nfs 服务器
- rpc-svcgssd
- rpc-gssd
- 客户:
- rpc-gssd
- 进口-ned.mount
据我所知,Kerberos 正在正确地进行身份验证。
我已经阅读了我可以找到的所有相关联机帮助页和在线手册,以及 StackExchange 上似乎相关的每个问题,但我无法解决问题或让客户端或服务器生成错误消息来告诉我为什么权限被拒绝。
编辑以根据Unix 应用程序服务器添加host/test-debian-desktop
和Kerberos 主体和密钥- MIT Kerberos 文档host/test-debian-server
我错过了什么
选择的答案很好地解释了我的配置不起作用的原因。如果有人遇到同样的情况,以下是我所缺少的详细信息 - 请阅读下面的答案以了解原因。
Kerberos 对单个用户进行身份验证(出于某种原因,我认为它没有)。因此,ned
要进行连接,Kerberos 必须有一个主体,并且客户端 PC 上ned@TEST
的 Linux 用户必须为该主体获取一个 Ticket-Granting Ticket (TGT)。然后一切都很好。为了或多或少自动化,我做了以下事情:ned
kinit
/etc/krb5/user/<uid>/client.keytab:保存密钥,ned
并且只能由 ned 读取!我使用0600
了权限,所有者和组都为ned
.
使用此密钥表,我可以简单地调用kinit -ki
登录而无需输入密码。我自动化它的快速而简单的方法是将它添加到 ~/.gnomerc、~/.bashrc ~/.zshrc(因为我使用 Gnome、Bash 和 Zsh)。
此外,由于我通过 Ansible 部署这些配置并且有一些共享点文件但不需要 NFS 访问的系统,因此我对 Bash 和 Zsh 有了一些兴趣,只有kinit
在它和客户端 keytab 存在时才运行:
〜/ .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
您得到“权限被拒绝”的原因是您的凭据缓存中没有 Kerberos TGT(ticket-granting-ticket),正如您在
klist
. 您必须运行kinit
该帐户并输入您的密码。一旦您通过身份验证并缓存了 TGT 票证,您就可以使用此票证对 NFS 服务器进行身份验证。您需要记住,Kerberos 身份验证的整个想法是您需要向 NFS 服务器(或任何其他服务)“证明”您的身份。您通过向命令输入密码(只有您知道)生成缓存的 TGT 来“证明”它
kinit
。所以通常这就是它应该工作的方式。您可以在krb5
/sssd
/whatever 中更改到期和续订时间,以使您的票证在到期前持续更长时间,但最终在某些时候您需要以一种或另一种方式重新进行身份验证。当然,您始终可以为您的帐户创建一个密钥表。不要将其添加到客户端的密钥表中!客户端密钥表仅适用于客户端。您将需要在您的帐户的新文件中创建新的密钥表,并以最低权限保持此文件的安全和私密,并使用此密钥表在您的凭证缓存中生成 TGT,而无需交互输入密码。从理论上讲,您甚至可以创建一个
crontab
定期为您执行此操作的工具,但这不太安全,因为有人可能会在某个时候窃取您的密钥表(例如,如果他具有 root 访问权限)并假装为您提供其他服务,但那是为了你的考虑。此外,如果您要使用密钥表,请不要忘记,每次更改帐户密码时,您还需要更新您的密钥表。