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 被转换。但我想更进一步:
解决方案和问题
Samba 提供了cifsacl需要设置cifs.idmap和winbindd. 两者都已安装,我已经阅读了两个手册页并尝试配置它们,但它不起作用。新的挂载命令现在是:
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 需要运行吗?我需要在防火墙中打开端口吗?
背景资料
股份结构
共享目录有几个子目录,一些公用的和一些“私有的”(尽管私有的实际上是每个人都可以读取的)。每个用户需要不时访问公共空间以及其他用户私有目录,但主要/通常是他们自己的目录。
技术数据
小智 6
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是域(非本地)用户并拒绝访问。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)
注意事项和陷阱:
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>之后,如果您具有文件服务器上共享的访问权限,您应该能够访问该共享。
注意事项和陷阱:
<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在测试后删除该选项以减少日志记录的冗长性。optional为required以强制使用文件服务器进行身份验证。session required pam_keyinit.sodebug。/etc/pam.d/sshd, /etc/pam.d/xdm, ...到目前为止,对共享上的文件和文件夹的访问权限由FILESERVER. Linux端显示的权限、用户名、组名完全错误。为了正确获取它们,请添加挂载选项cifsacl并设置身份映射。然而,这可能需要设置 Winbind 服务等。其他信息可以在联机帮助页中找到mount.cifs(8)。
您可能需要使用 samba (winbind) 中的用户名映射功能才能使映射正常工作,以便 winbind 了解每个 Linux 用户的 AD 帐户。我相信用户名映射可以接受命令和列表(以及一些模式转换),但是如果 Linux 用户名可以匹配 AD 用户名(例如使用 pam_winbind),那就容易得多。我想当映射工作时,您实际上可以开始验证共享是否也工作。
| 归档时间: |
|
| 查看次数: |
19006 次 |
| 最近记录: |