Samba не уважает полномочия группы: пользователи не могут создать, но удалить файлы в папке

У меня есть сервер 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
0
задан 5 January 2020 в 17:27

2 ответа

Итак, спустя почти год этот вопрос набрал тысячу просмотров. Поскольку дополнительных ответов не поступило, я быстро опубликую свое решение здесь, может быть, оно кому-то поможет.

Похоже, так настроить папки 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"

Это автоматически запускает блокировать/разблокировать скрипт всякий раз, когда файл создается или удаляется в моем базовом каталоге. Я думаю, что это так близко, как вы можете получить.

0
ответ дан 9 December 2020 в 07:08

Хотите совместно использовать Ваш [global] часть Вашего smb.conf ? Это подтвердило бы, выполняете ли Вы PDC или AD DC и если Вы добавили любые строки, Вы не должны иметь.

Если это - AD DC, то Ваша доля должна просто быть этим:

[Data]
comment = Data
path = /srv/data
read only = no

Вы затем устанавливаете ACLs из Windows.Примечание: Мы не рекомендуем использовать Samba DC AD в качестве файлового сервера, но если Вы делаете, необходимо следовать правилам.

1
ответ дан 11 January 2020 в 09:44

Другие вопросы по тегам:

Похожие вопросы: