解决方案
根据整体维护策略,可以使用以下技术之一。
1. 强制用户或者组所有权
在文件 /etc/samba/smb.conf 中,我们可以使用指令:
force user = [user] force group = [group]
这将覆盖文件或者目录访问的正常文件所有权属性。
默认情况下,使用有效的用户凭据。
通过使用上述指令中的一个(或者两个),可以将关联的凭据强制为特定值。
因此,将执行所有文件访问,就好像访问进程正在使用指定的凭据运行一样。
如果指令采用以下形式:
force group = +[group]
那么只有已经是 [group] 成员的 Linux 用户才会在访问期间将他们的主要组更改为 [group]。
不是 [group] 成员的 Linux 用户不受此指令的影响。
2. 使用目录访问权限
考虑 /tmp 目录:它是一个暂存器,允许多个用户创建、修改或者删除文件。
为了防止用户 A 删除用户 B 拥有的文件,该目录设置了粘滞位:
$ ls -ld /tmp drwxrwxrwt 14 root root 360 Mar 19 08:25 /tmp
注意权限的 t 标志:这表示为目录设置了“粘性”位。
任何用户都可以在此目录中创建文件,但只有拥有用户才能删除该条目;没有粘性位,任何人都可以删除任何文件,因为该目录具有全局读/写/执行权限。
- 规避此问题的一种方法是让共享 SAMBA 目录归 SAMBA 用户所有:
# /bin/mkdir [/path/to/SAMBA/share] # /bin/chown -R [user]:[group] -R [/path/to/SAMBA/share]
- 接下来,打开目录的 setgid 位以强制任何目录条目的组凭据与该目录的组凭据匹配:
# /bin/chmod g+s [/path/to/SAMBA/share] # /bin/ls -ld [/path/to/SAMBA/share] drwxrws--- 1 [user] [group] 0 Mar 19 09:07 [/path/to/SAMBA/share]
- 现在以 root 用户身份在 [/path/to/SAMBA/share] 中创建一个文件。
该文件将由 root 所有,但其组将是 [group] 组:
# /bin/mkdir /example # /bin/chown root:oracle /example # /bin/chmod g+s /example # /bin/ls -ld /example drwxr-sr-x 2 root oracle 4096 Mar 19 10:03 /example
- 最后,以 root 用户身份在 /example 中创建一个文件:
# id uid=0(root) gid=0(root) groups=0(root) # touch /example/file # ls -ld /example /example/file drwxrws--- 2 root oracle 4096 Mar 19 10:09 /example -rw-r--r-- 1 root oracle 0 Mar 19 10:09 /example/file
请注意,虽然用于创建文件的凭据是 root:root,但为该文件保存的访问凭据是 root:oracle;组所有权自动设置为目录的组。
说明
如果改为使用 setuid 位,则上述 setgid 方法也有效。
在 chmod 步骤中,改为执行以下操作:
# chmod u+s [/path/to/SAMBA/share]
我们还可以像这样覆盖文件所有权和组成员身份:
# chmod u+s,g+s [/path/to/SAMBA/share]
尽管这是一项令人着迷的能力,但这可能具有有限的效用。
3. 使用访问控制列表 (ACL)
访问控制列表或者 ACL 是文件系统功能,除了正常的 Linux 文件所有者/组/其他权限之外,还存储了一组另外的文件属性。
使用 ACL 允许对授予给定访问类型的确切访问类型进行非常细粒度的控制。
Linux 上的 SAMBA 文件系统实现支持访问控制列表,但必须通过 acl mount 属性显式启用该功能。
可以动态启用此功能,如:
# mount -o remount,acl [/path/to/samba/mount/point]
例如,假设我们有一个共享 /samba/office/,我们允许任何用户其中写入文件,但组凭据应该被强制为 office。
我们可以使用以下命令:
# mount -o remount,acl /group # setfacl -R -d -m u::rwx,g:office:rwx,o::r-x /samba/office
# /bin/getfacl /samba/office # file: samba/office/ # owner: root # group: office user::rwx group::rwx other::rwx default:user::rwx default:group:office:rwx default:mask::rwx default:other::r-x
当我们为目录建立此 ACL 时,它适用于其包含的文件和子目录。
问题
我们有一个在 Linux 和 Microsoft Windows 客户端之间共享的磁盘目录。
多个用户需要访问此目录共享,但是当从 Linux 客户端创建或者修改文件时,Linux 文件权限会被应用,从而使 Windows 客户端难以或者不可能访问这些文件。
我们希望以同构方式共享这些磁盘资源。