在 Samba 共享上,如何强制设置用户/组拥有文件的所有权
www. On IT Road .com

解决方案

根据整体维护策略,可以使用以下技术之一。

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 标志:这表示为目录设置了“粘性”位。
任何用户都可以在此目录中创建文件,但只有拥有用户才能删除该条目;没有粘性位,任何人都可以删除任何文件,因为该目录具有全局读/写/执行权限。

  1. 规避此问题的一种方法是让共享 SAMBA 目录归 SAMBA 用户所有:
# /bin/mkdir [/path/to/SAMBA/share]
# /bin/chown -R [user]:[group] -R [/path/to/SAMBA/share]
  1. 接下来,打开目录的 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]
  1. 现在以 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
  1. 最后,以 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 客户端难以或者不可能访问这些文件。

我们希望以同构方式共享这些磁盘资源。

日期:2020-09-17 00:13:39 来源:oir作者:oir