Samba 似乎忽略了 setgid 位,并在不应该创建可执行文件的情况下创建了可执行文件

Samba 似乎忽略了 setgid 位,并在不应该创建可执行文件的情况下创建了可执行文件

这似乎经常出现(比如这里这里)但仍然没有找到有效且令人满意的解决方案。

问题如下:

  • Linux和Windows混合环境; Linux用户通过NFS访问,Windows用户使用SMB访问;它是一个 AD 域,Kerberos 工作正常;

  • 这个想法是让子树由组拥有,就像在带有 setgid 目录的普通 POSIX 上一样;文件系统支持 EA 和 POSIX ACL。例如我有这个目录:

drwxrws---+ 1 vntmsm tecnico-acl 2868 giu 16 12:07 Foto
# file: Foto
# owner: vntmsm
# group: tecnico-acl
# flags: -s-
user::rwx
group::rwx
other::---
default:user::rwx
default:group::rwx
default:other::---

我希望“tecnico-acl”组中的任何用户都可以在该子树中工作。例如,创建一个文件将执行以下操作:

-rw-rw---- 1 vntmsm tecnico-acl 911922 apr 13  2021 Foto/Valigia.jpg
# file: Foto/Valigia.jpg
# owner: vntmsm
# group: tecnico-acl
user::rw-
group::rw-
other::---

作为参考,这是 smbcacls 关于该目录和文件的说法

# This is the directory
REVISION:1
CONTROL:SR|DP
OWNER:PROXIND\vntmsm
GROUP:PROXIND\tecnico-acl
ACL:PROXIND\vntmsm:ALLOWED/0x0/FULL
ACL:PROXIND\tecnico-acl:ALLOWED/0x0/FULL
ACL:Everyone:ALLOWED/0x0/
ACL:Creator Owner:ALLOWED/OI|CI|IO/FULL
ACL:Creator Group:ALLOWED/OI|CI|IO/FULL
ACL:Everyone:ALLOWED/OI|CI|IO/
# This is the file
REVISION:1
CONTROL:SR|DP
OWNER:PROXIND\vntmsm
GROUP:PROXIND\tecnico-acl
ACL:PROXIND\vntmsm:ALLOWED/0x0/RWDPO
ACL:PROXIND\tecnico-acl:ALLOWED/0x0/RWDPO
ACL:Everyone:ALLOWED/0x0/

所以没有时髦的 ACL,只有通常的 setgid 行为。我不是 Windows ACL 方面的专家,但它们看起来至少是合理的。

然而(这就是问题所在)当我通过 Samba 创建文件时(例如从 Windows 或从 smbclient),我得到的结果如下:

-rwxrwx---+ 1 vntmsm Domain Users 377406 giu 16 09:00 Foto/1470307.jpg
# file: Foto/1470307.jpg
# owner: vntmsm
# group: Domain\040Users
user::rwx
user:vntmsm:rwx
group::rwx
group:Domain\040Users:rwx
mask::rwx
other::---

来自 smbcacls:

REVISION:1
CONTROL:SR|SI|DI|DP
OWNER:PROXIND\vntmsm
GROUP:PROXIND\Domain Users
ACL:PROXIND\vntmsm:ALLOWED/I/FULL
ACL:PROXIND\Domain Users:ALLOWED/I/FULL

我在这里看到两个问题:

  • 首先,该文件是可执行的(而且不应该);我不明白 Windows 创建可执行文件的原因(据我所知,它没有执行 ACL 的概念)

  • 主要组是域用户,因此 Samba 显然忽略了 setgid 位并执行其操作

不需要支持 Windows ACL(目前也不支持 POSIX ACL,只是普通的旧文件权限),但我找不到一种方法让 Samba 遵守 setgid 位(也是为什么它会创建可执行文件?)

大多数解决方案都在共享上使用强制组,但这里是不可接受的(我们对不同的组使用不同的子树)

目前我的 smb.conf 在全局部分中有这个(它是成员服务器):

idmap config * : backend = tdb
idmap config * : range = 3000-3999
idmap config DOMAIN : backend = ad
idmap config DOMAIN : range = 0-2999
idmap config DOMAIN : schema_mode = rfc2307
idmap config DOMAIN : unix_nss_info = yes
idmap config DOMAIN : unix_primary_group = yes
inherit acls = yes
inherit permissions = yes
kerberos method = system keytab
load printers = yes
log file = /var/log/samba/log.%m
map acl inherit = yes
max log size = 100000
min print space = 100000
pid directory = /var/lock/samba
printing = lprng
private dir = /etc/samba/private
realm = AD.DOMAIN
rpc_server:spoolss = external
rpc_daemon:spoolssd = fork
security = ADS
show add printer wizard = yes
spoolss:architecture = Windows x64
store dos attributes = yes
unix charset = UTF8
username map script = /bin/echo
utmp = Yes
vfs objects = acl_xattr
winbind enum groups = yes
winbind enum users = yes
winbind nss info = rfc2307
winbind use default domain = yes
workgroup = DOMAIN

在分享中我有这个

[share]
path = /data/share
create mask = 0660
directory mask = 02770
force directory mode = 02000
read only = No

我读到 acl_xattr 与其他选项有一些不兼容或其他问题;实在是不清楚……

有没有办法让 samba 遵守 POSIX 语义?

答案1

终于找到了!

诀窍是使用

nt acl support = no

在全局部分。然后,Samba 恢复为标准 POSIX 语义(并且还将合理的 POSIX ACL 映射到 Windows 的 ACL)。

现在不再有可执行文件并且 setgid 已被正确处理。

相关内容