如何将 Windows ACL 映射到 CIFS 共享上的 Linux ACL?

Huy*_*ens 5 linux windows cifs access-control-list

语境

我们有一个带有 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]
Run Code Online (Sandbox Code Playgroud)

或多或少是可以的。我的 Linux 用户被映射到共享上的所有文件,并且一些 ACL 被转换。但我想更进一步:

  • 超过一个用户连接到 Linux box
  • 每个 Linux 用户都有一个专用的 Active Directory 帐户
  • 我希望每个 Windows 所有者都映射到相应的 Linux 所有者(如果存在)

解决方案和问题

Samba 提供了cifsacl需要设置cifs.idmapwinbindd. 两者都已安装,我已经阅读了两个手册页并尝试配置它们,但它不起作用。新的挂载命令现在是:

sudo mount -t cifs //server/share /mnt/share -o user=[act-dir user],domain=[domain],cifsacl
Run Code Online (Sandbox Code Playgroud)

但是一切都映射到 root:root,这意味着无法执行 cifs.idmap。

实际上,我并不感到惊讶,因为我不知道在哪里写实际映射,所以我应该在哪里写 Windows userX 实际上映射到 Linux userY?而且我不确定 winbindd 配置是否正确,最小参数集应该是什么,smbd 和/或 nmbd 需要运行吗?我需要在防火墙中打开端口吗?

背景资料

股份结构

共享目录有几个子目录,一些公用的和一些“私有的”(尽管私有的实际上是每个人都可以读取的)。每个用户需要不时访问公共空间以及其他用户私有目录,但主要/通常是他们自己的目录。

技术数据

  • RHEL 6、桑巴 3.5.6
  • Ubuntu 12.04,桑巴 3.6.3

小智 6

如何设置 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 事件日志)
  • 您可能需要添加挂载选项noperm以禁用客户端的权限检查。无论如何,权限都是由服务器强制执行的。

步骤 3:使用以下选项再次安装multiuser

umount /mnt
mount.cifs //FILESERVER/SHARE /mnt -v -o multiuser,domain=FILESERVER,username=CIFS_GUEST
Run Code Online (Sandbox Code Playgroud)

验证是否multiuser已使用:

mount | grep cifs
Run Code Online (Sandbox Code Playgroud)

步骤 4:创建用于自动、非交互式安装的凭据文件。保护它免受所有非 root 访问。

文件内容/etc/cifs.SHARE.cred

username=CIFS_GUEST
password=<pass>
Domain=FILESERVER
Run Code Online (Sandbox Code Playgroud)

然后执行:

chown root /etc/cifs.SHARE.cred
chmod 600 /etc/cifs.SHARE.cred
Run Code Online (Sandbox Code Playgroud)

注意事项和陷阱:

  • 使用 UTF-8 编码时,请确保凭据文件不包含字节顺序标记 (BOM)。否则,您可能会收到来自 的虚假“凭据格式不正确”消息mount.cifs

步骤 5:尝试使用凭据文件挂载共享。现在这应该是完全非交互式的:

umount /mnt
mount.cifs //FILESERVER/SHARE /mnt -v -o multiuser,credentials=/etc/cifs.SHARE.cred
Run Code Online (Sandbox Code Playgroud)

如果这有效,您可以将安装添加到/etc/fstab

...
//FILESERVER/SHARE /mnt cifs rw,auto,multiuser,credentials=/etc/cifs.SHARE.cred 0 0
...
Run Code Online (Sandbox Code Playgroud)

注意事项和陷阱:

  • auto添加了用于自动安装共享的选项。

第 6 步:现在以普通用户身份登录 Linux 机器。尝试访问已安装的共享,例如

cd /mnt
ls
Run Code Online (Sandbox Code Playgroud)

应拒绝该许可。

然后,手动将 CIFS 凭据存储在会话密钥环中:

cifscreds add FILESERVER -u <username>
Run Code Online (Sandbox Code Playgroud)

系统将提示您输入密码。<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
...
Run Code Online (Sandbox Code Playgroud)

第一行捕获登录时的密码。密码将被存储,直到创建会话为止。创建会话后,第二行会将记录放入密钥环中。无需致电cifscreds,登录后即可立即访问共享。

注意事项和陷阱:

  • 您可能希望debug在测试后删除该选项以减少日志记录的冗长性。
  • 确保在 PAM 堆栈中的每种情况下都执行这两行。(配置文件中的条目顺序)
  • 您可以将 替换optionalrequired以强制使用文件服务器进行身份验证。
  • 在第二行之前,应确保永久会话密钥环的存在。如果有疑问,请在第二行之前添加以下行:session required pam_keyinit.so
  • 使用该选项时,这两行都应在系统日志中留下消息debug
  • 还应对其他 PAM-Aware 登录程序的配置进行相同的修改,例如/etc/pam.d/sshd, /etc/pam.d/xdm, ...

到目前为止,对共享上的文件和文件夹的访问权限由FILESERVER. Linux端显示的权限、用户名、组名完全错误。为了正确获取它们,请添加挂载选项cifsacl并设置身份映射。然而,这可能需要设置 Winbind 服务等。其他信息可以在联机帮助页中找到mount.cifs(8)


myc*_*oes 1

您可能需要使用 samba (winbind) 中的用户名映射功能才能使映射正常工作,以便 winbind 了解每个 Linux 用户的 AD 帐户。我相信用户名映射可以接受命令和列表(以及一些模式转换),但是如果 Linux 用户名可以匹配 AD 用户名(例如使用 pam_winbind),那就容易得多。我想当映射工作时,您实际上可以开始验证共享是否也工作。