我已经成功设置了 NFS/Keberos,但是当 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
server #: cat <<EOF >>/etc/exports
/srv/nfs/philip 192.168.10.0/24(rw,nohide,insecure,no_subtree_check,sync,no_root_squash)
EOF
server #: service nfs-kernel-server restart
设置客户端
client #: apt-get -y update
client #: apt-get -y install nfs-common
client #: mkdir -p /mnt/philip
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 共享:
/srv/nfs/philip 192.168.10.0/24(sec=krb5p,rw,nohide,insecure,no_subtree_check,sync)
注意:我no_root_squash
在这里删除了。
并导出:
server #: exportfs -ra
server #: showmount -e
现在设置 Kerberos 服务器:
server #: apt install krb5-kdc krb5-admin-server #enter realm in full caps, enter fqdn for hostnames
server #: cat /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]
继续设置...
server #: krb5_newrealm
server #: vi /etc/krb5kdc/kadm5.acl # uncomment /*admin *
server #: systemctl restart krb5-kdc krb5-admin-server
server #: kadmin.local -q "addprinc admin/[email protected]"
# setup principal for NFS Service on NFS Server
server #: kadmin.local -q "addprinc -randkey nfs/[email protected]"
server #: kadmin.local -q "ktadd -k /etc/krb5.keytab nfs/[email protected]"
设置客户端
仍在服务器上:
server #: kadmin.local -q "addprinc -randkey nfs/[email protected]"
server #: kadmin.local -q "ktadd -k /etc/krb5.client.keytab nfs/[email protected]"
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/[email protected]
client #: klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: nfs/[email protected]
Valid starting Expires Service principal
11/27/2023 14:49:54 11/28/2023 00:49:54 krbtgt/[email protected]
renew until 11/28/2023 14:49:44
我现在可以使用 Kerberos 身份验证挂载 NFS 共享:
mount -a
请注意,我已经nfs.mydomain.net:/srv/nfs/philip /mnt/philip nfs sec=krb5p 0 0
在我的了/etc/fstab
。
如果失败,你可能需要:
systemctl restart rpc-gssd
地位
NFS 现在通过 Kerberos 安装在客户端计算机上
设置 philip 访问 NFS/Keberos 共享
# setup principal for Philip
server #: kadmin.local -q "addprinc -randkey philip/[email protected]"
server #: kadmin.local -q "ktadd -k /etc/krb5.philip.keytab philip/[email protected]"
server #: scp /etc/krb5.philip.keytab client:
然后验证:
philip@client $: kinit -k -t krb5.philip.keytab philip/[email protected]
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 甚至无法写入该目录。
如果我chmod 777 /srv/nfs/philip
可以写,那么这表明我是一个other
用户。
从这往哪儿走?
我很感激任何能帮助解决此问题的帮助。
答案1
addprinc -randkey philip/[email protected]
Kerberos 主体到 Unix 帐户的默认映射仅知道 1 个组件主体名称;即,服务器知道如何映射[email protected]
到您的 Unix 帐户philip
,但是它没有对使用实例的主体的内置支持1 – 因此主体会被映射到nobody
。
一般来说,不除非您明确知道需要这样做,否则不要使用实例主体作为用户帐户。在大多数情况下,[email protected]
这是您应该为用户帐户创建的(并且通常使用常规密码而不是密钥表)。但是如果您做需要具有实例名称的用户主体,然后您需要为它们定义映射规则。
(与服务主体不同,除了某些自定义设置外,使用 FQDN 作为用户帐户实例没有特殊含义。更常见的是,用户主体的实例将是类似philip/admin
或/cron
- 任意字符串而不是主机名。)
NFS 中的身份验证发生在 SunRPC 层,因此主体→用户名转换有效与 'idmapd' 分开(仅用于用户名⇆UID 转换,且仅用于 NFS“有效负载”,如 中所示的 UID/GID ls -l
);相反,转换是在“gssproxy”(或较旧的“rpc.svcgssd”)中根据 中定义的标准 libkrb5 映射规则完成的/etc/krb5.conf
。
因此,如果您必须使用带有实例的用户主体,那么对于 MIT Kerberos 来说它将如下所示:
[realms]
MYDOMAIN.NET = {
# Example rule for the "/admin" instance -> "root" user
auth_to_local = RULE:[2:$1;$2@$0](.*;admin@MYDOMAIN\.NET$)s/.*/root/
# Example rule for any instance -> 1st component
auth_to_local = RULE:[2:$1;$2@$0](.*@MYDOMAIN\.NET$)s/;.*@.*$//
auth_to_local = DEFAULT
}
(...意思是“如果主体有2
组成部分,则将它们组合成' $1;$2@$0
'并与正则表达式/ .*@MYDOMAIN\.NET$
/匹配;如果匹配,则用' '执行正则表达式替换/ @.*$
/ ,结果就是用户名”。)
这不仅涵盖 NFS,还包括 SSH 和大多数其他基于 Kerberos 的服务(使用gss_localname()
或krb5_aname_to_localname()
功能的任何服务)。
基于主机的实例的一个问题是,您需要一个通用规则,该规则不可避免地也将适用于服务主体,例如,每个“host / foo.example.com”现在都将映射到用户“host”。
1(可能是因为 Kerberos 无法轻易区分用户主体与来自服务使用完全相同语法的主体——或者也许实例化用户主体的使用几乎总是与非-某种默认映射。)