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

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

语境

我们有一台带有 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.idmapwinbindd。两者都已安装,我已阅读了两个手册页并尝试配置它们,但它不起作用。新的 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 堆栈中的每个案例中都执行这两行。(配置文件中的条目顺序)
  • 您可以替换optionalrequired以强制对文件服务器进行身份验证。
  • 在第二行之前,应确保存在永久会话密钥环。 如果有疑问,请在第二行之前立即添加以下行:session required pam_keyinit.so
  • 使用该选项时,两条线路都应在系统日志中留下消息debug
  • 其他 PAM-Aware 登录程序的配置也应进行相同的修改,例如/etc/pam.d/sshd,,/etc/pam.d/xdm...

到目前为止,共享上的文件和文件夹的访问权限由 强制执行FILESERVER。Linux 端显示的权限、用户名和组名完全错误。为了正确获取它们,请添加挂载选项cifsacl并设置标识映射。但是,这可能需要设置 Winbind 服务等。更多信息可以在手册页中找到mount.cifs(8)

相关内容