我有一台 Samba 服务器(即域控制器)和一台 Ubuntu 14.04 客户端,该客户端已登录用户,该用户通过 Kerberos 进行身份验证(该客户端通过 Likewise 加入域)。用户想要使用以下命令访问网络共享:
mount.cifs //域/路径/主页/用户/路径 -o sec=krb5
但是,无论是否使用“sec”参数,mount 命令都会提示输入密码。如果我输入密码,我可以挂载共享,但我想不使用密码挂载。
我该如何使用有效的 Kerberous 票来做到这一点?
答案1
如果您以 Windows 域用户身份登录,则已请求 Kerberos 票证。您可以通过执行来测试它klist
。
要重复使用此票,您必须将选项添加user
到cruid
您的装载订单中。这样您就不必再次输入任何凭据。
sudo mount -t cifs -o user=$USER,cruid=$USER,sec=krb5 //domain/path /home/path
要以您的用户作为所有者(从而具有写权限)挂载共享,请添加gid
和uid
选项。
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-key
和cifs.upcall
二进制文件是否已安装,以及后者是否在/etc/request-key.conf
(或/etc/request-key.d/
)中提及:
create cifs.spnego * * /usr/bin/cifs.upcall %k
最后,检查系统日志(/var/log/debug
或journalctl -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