Debian环境下NFS结合MIT Kerberos挂载后权限异常问题求助
大家好,我已经成功搭建了NFS+Kerberos环境,但Kerberos认证后的用户执行写入操作时遇到了权限问题,具体报错如下:
philip@client $: touch /mnt/philip/testfile.txt touch: cannot touch '/mnt/philip/test': Permission denied
下面是我完整的安装和配置过程(mydomain.net是占位符):
NFS服务器初始搭建
server #: apt-get -y update server #: apt-get -y install nfs-kernel-server nfs-common server #: mkdir -p /srv/nfs/philip
编辑/etc/exports添加共享目录:
server #: cat <<EOF >>/etc/exports /srv/nfs/philip 192.168.10.0/24(rw,nohide,insecure,no_subtree_check,sync,no_root_squash) EOF
重启NFS服务:
server #: service nfs-kernel-server restart
NFS客户端初始搭建
client #: apt-get -y update client #: apt-get -y install nfs-common client #: mkdir -p /mnt/philip
编辑/etc/fstab添加挂载项:
client #: cat <<EOF >>/etc/fstab nfs.mydomain.net:/srv/nfs/nfs-001 /mnt/philip nfs defaults 0 0 EOF
执行挂载:
client #: mount -a
初始测试
NFS共享成功挂载到/mnt/philip,这一步是正常工作的!
Kerberos配置(服务器端)
首先更新/etc/exports,启用Kerberos认证(移除了no_root_squash):
/srv/nfs/philip 192.168.10.0/24(sec=krb5p,rw,nohide,insecure,no_subtree_check,sync)
重新导出共享:
server #: exportfs -ra server #: showmount -e
接下来安装并配置Kerberos服务器:
server #: apt install krb5-kdc krb5-admin-server # 此处需输入大写格式的域,以及主机的完整域名
/etc/krb5.conf配置内容:
[libdefaults] default_realm = MYDOMAIN.NET # The following krb5.conf variables are only for MIT Kerberos. kdc_timesync = 1 ccache_type = 4 forwardable = true proxiable = true rdns = false # The following libdefaults parameters are only for Heimdal Kerberos. fcc-mit-ticketflags = true [realms] MYDOMAIN.NET = { kdc = nfs.mydomain.net admin_server = nfs.mydomain.net } [domain_realm] # 此处后续配置省略
初始化Kerberos域:
server #: krb5_newrealm
编辑/etc/krb5kdc/kadm5.acl,取消注释/*admin *这一行,然后重启服务:
server #: systemctl restart krb5-kdc krb5-admin-server
添加管理员主体:
server #: kadmin.local -q "addprinc admin/admin@MYDOMAIN.NET"
为NFS服务添加主体并生成密钥表:
server #: kadmin.local -q "addprinc -randkey nfs/nfs.mydomain.net@MYDOMAIN.NET" server #: kadmin.local -q "ktadd -k /etc/krb5.keytab nfs/nfs.mydomain.net@MYDOMAIN.NET"
Kerberos配置(客户端)
先在服务器端为客户端NFS服务生成密钥表:
server #: kadmin.local -q "addprinc -randkey nfs/client.mydomain.net@MYDOMAIN.NET" server #: kadmin.local -q "ktadd -k /etc/krb5.client.keytab nfs/client.mydomain.net@MYDOMAIN.NET" server #: scp /etc/krb5.client.keytab client:/etc/krb5.keytab
然后在客户端操作:
client #: apt update client #: apt install krb5-user
使用密钥表获取票据:
client #: kinit -k -t /etc/krb5.keytab nfs/client.mydomain.net@MYDOMAIN.NET client #: klist
执行klist后输出如下:
Ticket cache: FILE:/tmp/krb5cc_0 Default principal: nfs/client@MYDOMAIN.NET Valid starting Expires Service principal 11/27/2023 14:49:54 11/28/2023 00:49:54 krbtgt/MYDOMAIN.NET@MYDOMAIN.NET renew until 11/28/2023 14:49:44
此时可以通过Kerberos认证挂载NFS共享,我已经把/etc/fstab里的挂载项更新为:
nfs.mydomain.net:/srv/nfs/philip /mnt/philip nfs sec=krb5p 0 0
执行挂载:
client #: mount -a
如果挂载失败,可能需要重启rpc-gssd服务:
systemctl restart rpc-gssd
当前状态
NFS已经通过Kerberos认证成功挂载到客户端。
用户Philip的权限配置
在服务器端为Philip添加主体并生成密钥表:
server #: kadmin.local -q "addprinc -randkey philip/client.mydomain.net@MYDOMAIN.NET" server #: kadmin.local -q "ktadd -k /etc/krb5.philip.keytab philip/client.mydomain.net@MYDOMAIN.NET" server #: scp /etc/krb5.philip.keytab client:
在客户端用Philip身份认证:
philip@client $: kinit -k -t krb5.philip.keytab philip/client.hyvanix.net@HYVANIX.NET
查看共享目录权限:
philip@client $: ls -ls /mnt/philip total 12 drwxr-xr-x 2 philip philip 4096 Dec 26 07:30 . drwxr-xr-x 7 root root 4096 Dec 26 09:34 ..
但执行写入操作时报错:
philip@client $: touch /mnt/philip/test touch: cannot touch '/mnt/philip/test': Permission denied
查看服务器端共享目录的权限:
server #: ls -la /srv/nfs/ total 16 drwxr-xr-x 4 root root 4096 Dec 26 06:35 . drwxr-xr-x 3 root root 4096 Dec 22 14:35 .. drwxr-xr-x 2 philip philip 4096 Dec 26 07:30 philip
甚至root用户都无法写入这个目录。如果我把/srv/nfs/philip权限改成777,Philip就能正常写入了,这说明Kerberos认证后,用户被识别成了“其他用户”(other)。
现在我卡在这一步了,有没有大佬能帮忙排查下问题?非常感谢!
备注:内容来源于stack exchange,提问作者cumulus.ws

