使用 Kerberos 票证挂载 Samba 共享

使用 Kerberos 票证挂载 Samba 共享

我有一台 Samba 服务器(即域控制器)和一台 Ubuntu 14.04 客户端,该客户端已登录用户,该用户通过 Kerberos 进行身份验证(该客户端通过 Likewise 加入域)。用户想要使用以下命令访问网络共享:

mount.cifs //域/路径/主页/用户/路径 -o sec=krb5

但是,无论是否使用“sec”参数,mount 命令都会提示输入密码。如果我输入密码,我可以挂载共享,但我想不使用密码挂载。

我该如何使用有效的 Kerberous 票来做到这一点?

答案1

如果您以 Windows 域用户身份登录,则已请求 Kerberos 票证。您可以通过执行来测试它klist

要重复使用此票,您必须将选项添加usercruid您的装载订单中。这样您就不必再次输入任何凭据。

sudo mount -t cifs -o user=$USER,cruid=$USER,sec=krb5 //domain/path /home/path

要以您的用户作为所有者(从而具有写权限)挂载共享,请添加giduid选项。

sudo mount -t cifs -o user=$USER,cruid=$USER,sec=krb5,gid=$GID,uid=$UID //domain/path /home/path

您可以$GID通过跑步获得您的id -g $USER,并$UID通过获得您的id -u $USER

您可能必须apt-get install keyutils这样做才能让它工作。

答案2

首先,尝试一下-o vers=1。内核的 SMB2 客户端只有最近获得了 Kerberos 支持 – 在 Ubuntu 14.04 中,只有 4.4.x 内核才拥有它。

其次,检查request-keycifs.upcall二进制文件是否已安装,以及后者是否在/etc/request-key.conf(或/etc/request-key.d/)中提及:

create cifs.spnego * * /usr/bin/cifs.upcall %k

最后,检查系统日志(/var/log/debugjournalctl -b)中是否有来自 cifs.upcall 的消息,并确保它在正确的位置查找您的票证。它实际上并不知道哪个进程正在访问共享以及它具有什么 $KRB5CCNAME,因此它需要猜测几个常见的地方。

事实上,如果你mount通过 sudo 运行,安装过程(以 uid 0 运行)将不会有任何sudo kinit默认为门票;可能需要单独购买。

答案3

还有一个提示。使用 Kerberos 自动挂载共享需要在 Kerberos 缓存中加载/更新所需的密钥。我发现最可靠的方法是在挂载之前使用 Systemd 单元刷新缓存。创建的文件/etc/systemd/system/kinit.service

[Unit]
Description=Refresh Kerberos Token
After=syslog.target network.target
Before=mnt-backup.mount
Before=mnt-backup.automount

[Service]
ExecStart=/bin/kinit -R -kt /etc/krb5.keytab '[email protected]'

[Install]
WantedBy=multi-user.target
WantedBy=mnt-backup.mount
WantedBy=mnt-backup.automount

然后发出

systemctl daemon-reload systemctl enable kinit.service systemctl restart remote-fs.target

相关内容