我在网络上有一台 FreeNAS 服务器,该服务器配有 OSX 和 Windows 客户端。当 OSX 客户端与服务器上的 SMB/CIFS 共享交互时,它们会给所有其他客户端带来权限问题。
更新:由于我们放弃了该项目,我无法再验证任何答案,但请随时为未来的访问者发布任何帮助。
此行为的细节似乎还取决于客户端运行的 OSX 版本。对于这个问题,我们假设客户端运行的是 10.8.2。
当我在 OSX 客户端上安装 CIFS 共享并在其上创建新目录时,将创建具有权限的目录。这是不可取的,因为它不允许除我之外的任何人写入目录。我的组中还有其他用户也应该具有写入权限。即使服务器上drwxr-x-rx
存在以下设置,也会发生此行为:smb.conf
[global]
create mask
= 0666
directory mask
= 0777
[share]
force directory mode
= 0775
force create mode
= 0660
我以为这些设置应该至少确保目录是具有rwxrwxr-x
权限创建的。但我猜,这并不能阻止客户端改变权限后创建目录。
当我从 Windows 客户端在同一共享上创建文件夹时,新文件夹将具有所需的访问权限(rwxrwxrwx
),所以我目前假设问题出在 OSX 客户端上。
我想如果您可以轻松更改所创建目录的权限,那么这不会成为问题,但您不能。在 Finder 中打开目录信息时,我收到旧的“您有自定义访问权限”通知,无法进行任何更改。
我假设这是因为我们在共享上使用 Windows ACL 造成的,但这只是一个猜测。
通过终端更改组的写权限可以正常工作,但这对于部署来说是不切实际的,并且期望任何人都这样做也是不合理的。
这是完整的smb.conf
:
[global]
encrypt passwords = yes
dns proxy = no
strict locking = no
read raw = yes
write raw = yes
oplocks = yes
max xmit = 65535
deadtime = 15
display charset = LOCALE
max log size = 10
syslog only = yes
syslog = 1
load printers = no
printing = bsd
printcap name = /dev/null
disable spoolss = yes
smb passwd file = /var/etc/private/smbpasswd
private dir = /var/etc/private
getwd cache = yes
guest account = nobody
map to guest = Bad Password
obey pam restrictions = Yes
# NOTE: read smb.conf.
directory name cache size = 0
max protocol = SMB2
netbios name = freenas
workgroup = COMPANY
server string = FreeNAS Server
store dos attributes = yes
hostname lookups = yes
security = user
passdb backend = ldapsam:ldap://ldap.company.local
ldap admin dn = cn=admin,dc=company,dc=local
ldap suffix = dc=company,dc=local
ldap user suffix = ou=Users
ldap group suffix = ou=Groups
ldap machine suffix = ou=Computers
ldap ssl = off
ldap replication sleep = 1000
ldap passwd sync = yes
#ldap debug level = 1
#ldap debug threshold = 1
ldapsam:trusted = yes
idmap uid = 10000-39999
idmap gid = 10000-39999
create mask = 0666
directory mask = 0777
client ntlmv2 auth = yes
dos charset = CP437
unix charset = UTF-8
log level = 1
[share]
path = /mnt/zfs0
printable = no
veto files = /.snap/.windows/.zfs/
writeable = yes
browseable = yes
inherit owner = no
inherit permissions = no
vfs objects = zfsacl
guest ok = no
inherit acls = Yes
map archive = No
map readonly = no
nfs4:mode = special
nfs4:acedup = merge
nfs4:chown = yes
hide dot files
force directory mode = 0775
force create mode = 0660
答案1
为了防止 OS X 客户端更改权限,您需要添加
unix extensions = no
到 smb.conf 的 [Global] 部分
或者添加类似
force security mode = 0660
force directory security mode = 02770
您的共享定义以保留组写入权限。
答案2
更改您的共享定义以仅包含以下内容:
path = /path/to/folder
browseable = yes
writeable = yes
inherit permissions = yes
现在,直接更改文件夹的权限:
# chown user:group -R /path/to/folder
# chmod 2770 -R /path/to/folder (or 2775 for public read only)
上述 CHMOD 命令将应用“特殊”权限,允许放入文件夹中的文件夹自动获得父级权限。要使此操作生效:
/etc/init.d/samba reload
该reload
交换机不会重新启动samba(踢掉当前用户),而是重新加载配置文件。
此外,记录在FreeNAS 维基:
如果权限对 Windows 用户有效但不对 OS X 用户有效,请尝试禁用 Unix 扩展并重新启动 CIFS 服务。
答案3
如果你在 Terminal.app 中创建这些文件夹,那么可以将系统范围的 umask 设置为 002(777 - umask = 可执行文件和文件夹的掩码 666 - umask = 文件的掩码)而不是 022。
答案4
我的设置不太顺利unix extensions = no
—— 可能是因为我正在使用 VFS 模块vfs_fruit
来增强与 macOS 客户端的互操作性。
如果您正在使用vfs_fruit
,则以下设置可以解决问题:
fruit:nfs_aces = no
这将阻止 macOS 客户端编写自己的 ACL 并干扰 UNIX 权限。
[global]
这是我的章节的相关部分smb.conf
:
fruit:metadata = stream
fruit:model = MacSamba
fruit:posix_rename = yes
fruit:veto_appledouble = no
fruit:wipe_intentionally_left_blank_rfork = yes
fruit:delete_empty_adfiles = yes
fruit:time machine = yes
fruit:nfs_aces = no
inherit permissions = yes
inherit acls = yes
acl group control = yes
vfs objects = catia fruit streams_xattr
请注意,这是默认unix extensions
设置。yes
在共享中,目录具有drwxrwsr-x
(即设置了 SETGID 位)权限,并且属于应该具有访问权限的共同用户组。此外,目录还具有 ACL default:group::rwx
(使用 设置setfacl -m default:group::rwx $dirname
)。