使用 krb5 的 Mount.cifs 在 20.04 LTS 上失败

使用 krb5 的 Mount.cifs 在 20.04 LTS 上失败

我的网络中有一个 Synology NAS 和多个 Ubuntu 客户端。我按照此处的说明在客户端上设置了 Active Directory 集成https://ubuntu.com/server/docs/service-sssd一切运行良好。但是,尝试按照此处的说明在登录时设置挂载操作https://wiki.ubuntu.com/MountWindowsSharesPermanently失败。我按照“使用 libpam_mount (Ubuntu 9.04) 挂载受密码保护的共享”一章中的说明设置挂载。我设置了 .pam_mount.conf.xml 文件并添加了

<?xml version="1.0" encoding="utf-8" ?>
<pam_mount>
<volume options="uid=$USER,gid=100,dmask=0700" user="*" mountpoint="/mnt/shares/pictures" path="Pictures" server="serverIpAddress" >
</pam_mount>

按照调试策略,我尝试手动挂载所有内容,以查看它卡在哪里。我可以使用 sudo 并使用带有用户和密码的默认安全类型挂载共享

sudo mount -t cifs -ousername=myname //myserver/Pictures /media/shares/test

尝试使用 sec=krb5 时

sudo mount -t cifs -osec=krb5 //myserver/Pictures /media/shares/test

它返回非常有用的信息挂载错误(2):没有该文件或目录. Dmesg 显示此信息

CIFS: VFS: Verify user has a krb5 ticket and keyutils is installed
CIFS: VFS: \\myserver Send error in SessSetup = -126
CIFS: VFS: cifs_mount failed w/return code = -2

我花了几个小时在网上搜索,试图在 mount 命令中设置版本、gid、uid、cruid,但都无济于事。据我所知,我还使用 klist 获得了正确的 kerberos 票证。一些帖子建议进行此项检查。

Ticket cache: FILE:/tmp/krb5cc_710201106_e2vIcu
Default principal: [email protected]

Valid starting       Expires              Service principal
12.04.2021 08:52:57  12.04.2021 18:52:57  krbtgt/[email protected]
renew until 13.04.2021 08:52:57

我还使用 smbclient 检查了我是否可以使用 kerberos 票证查看来自我的 NAS 的共享,并且这也能正常工作。

smbclient -k -L myserver.mydomain.locale

有一篇类似的帖子基于 Ubuntu 18.04,我使用的是 20.04 LTS,在这里使用 krb5 的 Mount.cifs 失败,而使用相同 krb5-ticket 的 smbclient 可以运行

我检查了 keyutils 是否已安装,但不知道如何实现有关 keytab 文件的答案,并且我缺乏判断这是否真的是问题的知识(“mount”需要 keytab 文件中指向 kerberos 的相应条目)。

感谢任何可能有助于解决此问题的建议。

答案1

最后我终于让它工作了。我不知道下面的设置是否是唯一需要的更改。我尝试了很多不同的事情,但最后我设法在从终端登录到我的域帐户时使用 pam 挂载共享。

sudo login

这给了我真正需要的反馈。显然需要“nodev”和“nosuid”选项。

我的最终 .pam_mount.conf.xml 如下所示:

<?xml version="1.0" encoding="utf-8" ?>

<pam_mount>

<volume options="nodev,nosuid"
    fstype="cifs"
    server="servername.domainname"
    path="music"
    mountpoint="/home/user@domainname/shares/Music"
    cruid="user@domainname" />
</pam_mount>

其中域名符合 name.locale 语法。

对于那些不知道 cruid 用途的人(来自 mount 手册页):cruid=arg 设置凭据缓存所有者的 uid。这主要适用于 sec=krb5。默认值是执行挂载的进程的真实 uid。设置此参数会指示 upcall 查找该用户拥有的凭据缓存。

5月10日更新,回答 SerG 的问题:我可以使用此命令手动挂载共享:

sudo mount -t cifs -o user=$USER,domain=mydomain.locale,cruid=$USER,gid=xxx,uid=xxx,sec=krb5 //myserver/shareName/home /[email protected]/shares/shareName
enter code here

为了测试目的,我添加了实际的 gid 和 uid 作为数值。您可以在输入时获取这两个值

id

将它挂载在哪里实际上并不重要,但我使用了主目录中的文件夹来排除其他权限问题。

相关内容