我有一个基于 Ubuntu 18.04 的 Samba 服务器,由 Windows 10 机器访问。办公室里有几个普通用户和一个管理员用户。由于我想保留文件夹结构并防止用户意外删除或移动文件夹,因此将根文件夹的权限设置为750
,以便只有所有者(管理员用户)才能更改目录结构。
只要 Samba 服务器独立运行(Ubuntu 16.04),此方法就有效。我最近升级到了 18.04,现在 Samba 服务器作为主域控制器 (PDC) 运行,这意味着扩展属性 ( acl_xattr
) 默认启用,无法禁用。
自从强制迁移到 Samba 作为 PDC 以来acl_xattr
,发生了一些奇怪的事情:普通用户仍然无法创建文件夹,这必须由管理员用户完成。但是,普通用户可以删除文件夹,即使父文件夹的访问权限仍然正确设置为750
:
drwxr-x--- 30 admin_user user_group 4096 Jan 2 11:45 data
我感到很困惑,因为有了这些访问权限,就不可能从这个文件夹中删除任何东西,除了admin_user
和root
。我怀疑 Samba 在尝试删除内容时以某种方式覆盖了缺失的写访问权限,但我无法调试这一点。我遗漏了什么?
PS:这是我的 share 的定义smb.conf
[Data]
comment = Data
path = /srv/data
browseable = yes
writeable = yes
create mask = 0770
directory mask = 0770
force create mode = 0770
force directory mode = 0770
force group = user_group
hide files = /?esktop.ini/?umbs.db/
guest ok = no
wide links = yes
更新 2020-01-05:
以下是[global]
我的部分smb.conf
。设置已完成曾蒂亚尔。
[global]
workgroup = company
realm = COMPANY.LAN
netbios name = server_name
server string = Zentyal Server
server role = dc
server role check:inhibit = yes
server services = -dns
server signing = auto
dsdb:schema update allowed = yes
ldap server require strong auth = no
drs:max object sync = 1200
idmap_ldb:use rfc2307 = yes
winbind enum users = yes
winbind enum groups = yes
template shell = /bin/bash
template homedir = /home/%U
rpc server dynamic port range = 49152-65535
interfaces = lo,eth0
bind interfaces only = yes
map to guest = Bad User
unix extensions = no
答案1
愿意分享您的[global]
部分内容smb.conf
吗?这将确认您是否正在运行 PDC 或 AD DC,以及是否添加了任何不应该添加的行。
如果它是 AD DC,那么您的共享应该是这样的:
[Data]
comment = Data
path = /srv/data
read only = no
然后从 Windows 设置 ACL。注意:我们不建议使用 Samba AD DC 作为文件服务器,但如果您这样做,则必须遵守规则。
答案2
因此,经过近一年的时间,这个问题的浏览量已达到一千次。由于没有其他答案,我将很快在此处发布我的解决方案,也许这对某些人有帮助。
看起来不可能像这样配置 Samba 文件夹。原因可能是 Samba 试图尽可能地复制 Windows 正在做的事情,而且,事实上,如果用户任何一个有权删除文件夹中的文件或者或删除的权利从父文件夹。由于 Unix 不区分写入和删除,因此有写入权限的用户也可以删除。
我自己想出了一个解决方法:我将基本目录配置为750
,这样只有管理员才能创建新文件夹。新子文件夹770
通过 Samba 获取。我使用(附加标志)阻止删除子文件夹chattr +a
,这样用户就无法删除文件夹。这已经没问题了(阻止删除),但现在只有 Linux 管理员才能删除或移动文件夹。
为了让“普通” Samba 管理员能够删除或重命名子文件夹,我创造了一些魔法(/root/lock_directory
):
#!/bin/bash
folder=$1
attr=$(lsattr -d "$folder")
if [ -d "$folder/New Folder" ]; then
if [ "${attr:5:1}" = "a" ]; then
echo "Unlocking folder $folder"
chattr -a "$folder"
fi
fi
if [ ! -d "$folder/New Folder" ]; then
if [ "${attr:5:1}" = "-" ]; then
echo "Locking folder $folder"
chattr +a "$folder"
fi
fi
当管理员创建新文件夹(Windows 默认名为“新文件夹”)时,此脚本将解锁目录。只要“新文件夹”存在,管理员就可以执行操作(并且用户可以意外删除子文件夹)。一旦管理员删除“新文件夹”,基本目录将再次被锁定。
现在,为了自动执行此操作,我使用incron
,这就是我的/etc/incron.d/incrontab
样子:
/srv/data IN_CREATE,IN_DELETE /root/lock_directory "/srv/data"
每当在我的基本目录中创建或删除文件时,都会自动运行锁定/解锁脚本。我认为这是最接近的了。