语境
我们有一台带有 Active Directory 域和网络共享的 Windows 服务器。
我有一台 Linux 机器,我想安装共享。
sudo mount -t cifs //server/share /mnt/share -o user=[act-dir user],domain=[domain],uid=[linux user],gid=[linux group]
或多或少还行。我的 Linux 用户被映射到共享上的所有文件,并且一些 ACL 被转换。但我想更进一步:
- 多个用户连接到 Linux 机器
- 每个 Linux 用户都有一个专用的 Active Directory 帐户
- 我希望每个 Windows 所有者都映射到相应的 Linux 所有者(如果存在)
解决方案和问题
Samba 提供了 mount 选项cifsacl
,需要设置cifs.idmap
和winbindd
。两者都已安装,我已阅读了两个手册页并尝试配置它们,但它不起作用。新的 mount 命令现在是:
sudo mount -t cifs //server/share /mnt/share -o user=[act-dir user],domain=[domain],cifsacl
但是所有内容都映射到 root:root,这意味着无法执行 cifs.idmap。
实际上,我并不感到惊讶,因为我不明白在哪里写入实际映射,那么我应该在哪里写入 Windows userX 实际上映射到 Linux userY?而且我不确定 winbindd 配置是否正确,最小参数集应该是什么,smbd 和/或 nmbd 是否需要运行?我需要在防火墙中打开端口吗?
背景信息
股权结构
共享目录有几个子目录,一些是公共目录,一些是“私有目录”(尽管私有目录实际上每个人都可以读取)。每个用户有时都需要访问公共空间,也需要访问其他用户的私有目录,但主要/经常是他们自己的目录。
技术数据
- RHEL 6,Samba 3.5.6
- Ubuntu 12.04,Samba 3.6.3
答案1
您可能需要使用 samba (winbind) 中的用户名映射功能才能使映射工作,这样 winbind 才能知道每个 Linux 用户的 AD 帐户。我相信用户名映射可以接受命令和列表(以及一些模式转换),但如果 Linux 用户名可以匹配 AD 用户名,例如使用 pam_winbind,那就容易多了。我猜当映射工作时,您实际上可以开始验证共享是否也工作正常。
答案2
如何设置 CIFS 多用户挂载
CIFS 是一种基于会话的协议。这意味着会话以登录 CIFS 会话的用户的权限运行。因此,使用 CIFS 的正常方式是在用户登录时以登录用户的权限挂载共享。这就是该协议的设计目的。
尽管如此,Linux CIFS 驱动程序已经提供了一种在启动时挂载共享的方法。这称为多用户挂载。多用户挂载策略是在启动时以最小权限挂载共享。对于访问共享的每个用户,CIFS 驱动程序将在内部与服务器创建一个单独的 CIFS 会话。
当用户首次访问多用户挂载共享时,CIFS 驱动程序需要为该用户与文件服务器创建 CIFS 会话。这需要安全信息,例如用户名和密码。由于驱动程序无法提示输入登录数据,因此它将查看当前 Linux 用户的内核密钥环。如果可以找到合适的安全信息,则 CIFS 驱动程序将使用它为当前用户与文件服务器创建 CIFS 会话,然后用户可以访问共享。
这篇文章可能看起来像一个指南,但实际上它是可能出现的陷阱的集合。
步骤1:SHARE
在文件服务器上创建共享FILESERVER
,并在文件服务器上创建具有最小权限的本地用户CIFS_GUEST
。必须只允许用户从远程计算机挂载共享。用户的密码必须永不过期。
注意事项和陷阱:
- 用户确实不是需要位于本地的“远程桌面用户”组中
FILESERVER
。 如果份额
SHARE
是所谓的“行政份额",则用户(包括CIFS_GUEST
)必须具有管理权限。建议创建普通、非管理类型的共享。第2步:从你的 Linux 机器挂载共享,例如
mount.cifs //FILESERVER/SHARE /mnt --verbose -o 域=FILESERVER,用户名=CIFS_GUEST
这应该可以正确挂载共享。如果没有,我建议查看手册页mount.cifs(8)
。
注意事项和陷阱:
- 确保指定选项
domain=FILESERVER
。否则,文件服务器可能会假定这CIFS_GUEST
是域(非本地)用户并拒绝访问。 - 如果您在身份验证时遇到问题,请检查服务器的日志(例如,对于 Windows 文件服务器,请检查 Windows 事件日志)
- 您可能希望添加 mount 选项
noperm
以禁用客户端的权限检查。无论如何,权限都是由服务器强制执行的。
步骤3:使用以下选项再次挂载multiuser
:
umount /mnt
mount.cifs //FILESERVER/SHARE /mnt -v -o multiuser,domain=FILESERVER,username=CIFS_GUEST
确认multiuser
已经使用:
mount | grep cifs
步骤4:创建用于自动、非交互式挂载的凭证文件。保护该文件免受所有非 root 访问。
文件内容/etc/cifs.SHARE.cred
:
username=CIFS_GUEST
password=<pass>
Domain=FILESERVER
然后执行:
chown root /etc/cifs.SHARE.cred
chmod 600 /etc/cifs.SHARE.cred
注意事项和陷阱:
- 确保凭证文件确实不是使用 UTF-8 编码时,不能包含字节顺序标记 (BOM)。否则,您可能会收到虚假的“凭据格式不正确”消息
mount.cifs
。
步骤5:尝试使用凭证文件挂载共享。现在这应该完全是非交互式的:
umount /mnt
mount.cifs //FILESERVER/SHARE /mnt -v -o multiuser,credentials=/etc/cifs.SHARE.cred
如果可行,您可以将安装添加到/etc/fstab
:
...
//FILESERVER/SHARE /mnt cifs rw,auto,multiuser,credentials=/etc/cifs.SHARE.cred 0 0
...
注意事项和陷阱:
auto
已添加自动安装共享的选项。
第 6 步:现在以普通用户身份登录 Linux 计算机。尝试访问已挂载的共享,例如
cd /mnt
ls
应拒绝该许可。
然后,手动将 CIFS 凭据存储在会话密钥环中:
cifscreds add FILESERVER -u <username>
<username>
系统将提示您输入密码。之后,如果您有文件服务器上共享的访问权限,您就应该能够访问该共享。
注意事项和陷阱:
- 您可以使用 Windows 资源管理器来验证 是否
<username>
具有共享的访问权限。这样,您就可以排除 上的错误FILESERVER
。 - 如果
cifscreds
给出有关非持久会话密钥环的警告,请输入keyctl session
并重试。 - 您可以使用 显示密钥环的内容
keyctl show -3
。 - 这
cifscreds
不会与文件服务器创建 CIFS 会话。它只是将安全信息放入密钥环中,以便 CIFS 驱动程序可以在您访问共享时使用它来创建 CIFS 会话。这意味着更改密钥环中的密钥cifscreds update ...
将使您以旧用户身份登录(!)。
步骤7:最后,输入密钥环的步骤可以自动化。以 root 身份将以下几行添加到您的 PAM 配置中(例如/etc/pam.d/login
):
...
auth optional pam_cifscreds.so debug
...
session optional pam_cifscreds.so domain=<AD Domain> debug
...
第一行在登录时捕获密码。密码会一直存储,直到创建会话为止。创建会话后,第二行会将记录放入密钥环中。无需调用cifscreds
,登录后即可立即访问共享。
注意事项和陷阱:
- 您可能希望
debug
在测试后删除该选项以减少日志记录的详细程度。 - 确保在 PAM 堆栈中的每个案例中都执行这两行。(配置文件中的条目顺序)
- 您可以替换
optional
为required
以强制对文件服务器进行身份验证。 - 在第二行之前,应确保存在永久会话密钥环。 如果有疑问,请在第二行之前立即添加以下行:
session required pam_keyinit.so
- 使用该选项时,两条线路都应在系统日志中留下消息
debug
。 - 其他 PAM-Aware 登录程序的配置也应进行相同的修改,例如
/etc/pam.d/sshd
,,/etc/pam.d/xdm
...
到目前为止,共享上的文件和文件夹的访问权限由 强制执行FILESERVER
。Linux 端显示的权限、用户名和组名完全错误。为了正确获取它们,请添加挂载选项cifsacl
并设置标识映射。但是,这可能需要设置 Winbind 服务等。更多信息可以在手册页中找到mount.cifs(8)
。