У меня есть сервер Samba на основе Ubuntu 18.04, к которой получают доступ машины 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: Вот определение доли в моем 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
Обновление 05.01.2020:
Вот [global]
часть моего smb.conf
. Установка была сделана с Zentyal.
[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
Итак, спустя почти год этот вопрос набрал тысячу просмотров. Поскольку дополнительных ответов не поступило, я быстро опубликую свое решение здесь, может быть, оно кому-то поможет.
Похоже, так настроить папки Samba невозможно. Причина, вероятно, в том, что Samba пытается максимально точно воспроизвести то, что делает Windows, и, действительно, 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"
Это автоматически запускает блокировать/разблокировать скрипт всякий раз, когда файл создается или удаляется в моем базовом каталоге. Я думаю, что это так близко, как вы можете получить.
Хотите совместно использовать Ваш [global]
часть Вашего smb.conf
? Это подтвердило бы, выполняете ли Вы PDC или AD DC и если Вы добавили любые строки, Вы не должны иметь.
Если это - AD DC, то Ваша доля должна просто быть этим:
[Data]
comment = Data
path = /srv/data
read only = no
Вы затем устанавливаете ACLs из Windows.Примечание: Мы не рекомендуем использовать Samba DC AD в качестве файлового сервера, но если Вы делаете, необходимо следовать правилам.