我正在使用 Linux、ZFS 和 Samba 构建备份服务器。除我之外的所有客户端都将使用 Windows 10,因此我的重点是正确支持 Windows 10,但这并不意味着应该允许 Linux 端的权限不安全(即世界可读可写)。
错误地删除了所有文件上的 POSIX ACL 后,认为它们最初设置为允许组访问,但 Windows 端文件上的所有权限都被破坏了。
通过查看手册中的每个选项并重新进行配置,我解决了这个问题,我弄清楚了要设置哪些选项才能获得我想要的行为,即仅在 Windows 端设置权限,同时保证 UNIX 权限的安全,但是仍然有两件事我不明白 Samba 如何处理 UNIX 权限。
设置acl_xattr:ignore system acls = no
会导致 UNIX 权限成为 Windows ACL(CREATOR、GROUP 和 EVERYONE 条目)中的条目,这是我不希望的,但是当设置为 时yes
,所有者、组和权限似乎仍然会影响 Windows 端的权限,它们仍然由 Samba 强制执行。如果目录具有root:backup 0660
权限,则随机Domain User
将无权访问该目录,即使 Windows ACL 有 的条目Domain Users
。将组从 更改为backup
映射到 NT 组,然后它就会起作用。因此显然 UNIX 权限仍然得到强制执行。users
users
Domain Users
是否有设置可以让 Windows ACL 否决其余权限,即如果 Windows ACL 允许Domain Users
,则无论 UNIX 权限如何,它们都将被允许?或者我是否可以使用 UNIX 权限禁用 Samba?
另一个问题是 Samba 如何存储 UNIX 权限。在新配置中,我拥有inherit owner = yes
。这似乎在 Windows 和 UNIX 上都按预期工作,除非我尝试将 UNIX 组更改为其他组。最初,在共享上设置了 setgid 位john
作为其组,认为inherit owner
这只影响所有者,而不影响组。但是,当从共享中删除 setgid 位并将组更改为 时users
,使用inherit owner = yes
Windows 10 客户端创建的新文件和目录仍然使用组创建john
。目录树中没有john
剩余组的目录,我尝试重新启动 Windows 客户端和 Samba 服务器以防万一,但这并没有改变任何东西。
Samba 是否将 UNIX 权限存储在其他地方,因此我直接从文件系统更改 UNIX 组不会影响 Samba 跟踪的组?或者 Samba 仍然将此旧组用于新文件和目录的原因是什么?
下面您可以找到 Samba 版本 4.7.6 配置中可能相关的选项。如果需要更多信息,请告诉我。
[global]
access based share enum = yes
acl group control = no
acl map full control = yes
acl_xattr:ignore system acls = yes
acl_xattr:default acl style = windows
create mask = 0775
directory mask = 0775
dos filemode = yes
dos filetime resolution = no
dos filetimes = yes
ea support = no
force create mode = 0600
force directory mode = 0600
force unknown acl user = no
guest account = nobody
guest ok = no
guest only = no
inherit acls = no
inherit owner = unix only
inherit permissions = no
invalid users = root
map acl inherit = yes
map archive = no
map hidden = no
map readonly = no
map system = no
map to guest = never
nt acl support = yes
obey pam restrictions = no
read only = yes
restrict anonymous = 2
security = user
server role = active directory domain controller
store dos attributes = yes
unix extensions = yes
vfs objects = dfs_samba4 acl_xattr shadow_copy2
[backups]
create mask = 0660
directory mask = 0770
ea support = yes
path = /mnt/pool/backups
read only = no
答案1
Samba 是否将 UNIX 权限存储在其他地方,因此我直接从文件系统更改 UNIX 组不会影响 Samba 跟踪的组?或者 Samba 仍然将此旧组用于新文件和目录的原因是什么?
我只找到了第二个问题的答案。在我使用 进行实验期间,inherit owner
我一度想知道作为 NT ACL 的一部分存储的值是什么,因此我检查了一个目录,samba-tool ntacl get /path/to/dir
令我惊讶的是,我看到旧 GID 是 的值group_sid
。由于我在文件系统中的其他任何地方都不再有对旧 GID 的任何其他引用,这似乎是 Samba 保留旧 UNIX 组的可能原因,特别是因为每当我将继承所有者设置为unix only
或 时no
,它都不会拥有旧 UNIX 组。因此显然设置inherit owner
为yes
(即unix and windows
)会导致 Samba 将 UNIX 组设置为存储在 NT ACL 中的组。
我仍然希望得到第一个问题的答案,但我已经找到了一种解决方法,那就是找到一种方法来将 NT 组映射Domain Users
到我的首选 UNIX 组并通过 POSIX ACL 将其他人的权限设置为 0 setfacl -Rm d:o:---,o:--- /my/share
:。