Kerberos 设置

Kerberos 设置

我已经成功设置了 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 无法轻易区分用户主体与来自服务使用完全相同语法的主体——或者也许实例化用户主体的使用几乎总是与-某种默认映射。)

相关内容