我有一个从文件服务器导出的 NFS 树,该文件服务器使用 Kerberos 进行保护,并使用 LDAP 进行身份验证和 uid/gid 管理。对于每台客户端计算机和每个用户来说,一切都运行顺利,但我不知道如何向守护进程授予对共享部分内容的访问权限。
守护进程通常使用本地系统帐户的 setuid 运行,因此服务器上没有任何特定凭据。如果我可以进入并弄乱源代码,我通常可以让它们在启动时使用 kerberos 中存在的用户的 keytab 文件调用 kinit,但这并不总是可行的。
我们的环境禁止我通过使它们变得全世界可读来破解一切,或者禁止我完全从 NFS 中删除 Kerberos。
/etc/exports
我尝试过用all_squash
和setanonuid=...
添加子树anongid=...
,但这只是让它对每台客户端机器都是可读的。它只需要对某台机器可访问。
我曾经尝试使用 samba,但是我们有一些守护进程采用“NFS 或破坏”方法来处理共享(例如,任何涉及 mercurial 的东西)。
我们的大多数服务器运行 Ubuntu 10.04 LTS,但该问题也影响我们的 12.04 LTS 客户端。
有没有办法可以向整个系统授予特定 Kerberos 用户的系统范围票证,以便该系统上的任何用户始终可以访问共享?或者是否有其他方法可以实现这种访问权限,我可以研究一下?
答案1
一个“正确”的方法是重写初始化脚本来利用k5开始在守护进程模式和每个守护进程的密钥表。这将确保正在运行的守护进程在运行时可以访问有效的凭据缓存。
您可能想要 daemon/hostname.domain.tld 样式的原则。它们更容易跟踪,也更容易管理密钥表。将密钥添加到密钥表会自动增加密钥版本号 (KVNO) 并随机化该主体的“密码”。
答案2
如果您正在运行 gssproxy,并且具有标准 nfs-client 配置,例如:
[service/nfs-client]
mechs = krb5
cred_store = keytab:/etc/krb5.keytab
cred_store = ccache:FILE:/var/lib/gssproxy/clients/krb5cc_%U
cred_store = client_keytab:/var/lib/gssproxy/clients/%U.keytab
cred_usage = initiate
allow_any_uid = yes
trusted = yes
euid = 0
您可以将服务的密钥表放在 /var/lib/gssproxy/clients/%UID%.keytab 中,gssproxy 将为您处理创建票证。这比使用 k5start 更好,因为 k5start 可能会干扰 SELinux 转换。