У меня настроен общий доступ к файлам SMB / CIFS на сервере OmniOS с модулем ядра Solaris, который использует списки контроля доступа NFSv4, которые должны правильно работать с клиентами Windows.
Я хочу создать общий каталог со следующими целями: пользователь (скажем, alice
) должен иметь возможность создавать и изменять файлы, но не удалять их. Также следует предотвратить создание подкаталогов. Должен быть разрешен доступ для чтения.
Я пробовал следующий ACL, который в основном работает:
/usr/bin/chmod A=\
user:root:rwxpdDaARWcCos:fd-----:allow,\ # root has full access
user:alice:rwx---a-R-c--s:-------:allow,\ # dir: create files, read everything
user:alice:rwxp--aARWc--s:f-i----:allow \ # files: wpAW is needed for full file write access, everything is only inherited to files
/pool/share
Но если alice
просматривает Безопасность вкладка недавно добавленных файлов в проводнике Windows, она может предоставить себе полный доступ и впоследствии удалить файл, даже если у нее нет Co
прав.
Как объяснить такое поведение? И как его изменить, чтобы нельзя было изменять ACL?
Изменить: вывод ls
вроде нормально:
# /usr/bin/ls -v
total 1
-rwx------+ 1 alice staff 3 2016-03-21 test.txt
0:user:root:read_data/write_data/append_data/read_xattr/write_xattr
/execute/delete_child/read_attributes/write_attributes/delete
/read_acl/write_acl/write_owner/synchronize:inherited:allow
1:user:alice:read_data/write_data/append_data/read_xattr
/write_xattr/execute/read_attributes/write_attributes/read_acl
/synchronize:inherited:allow
# /usr/bin/ls -V
total 1
-rwx------+ 1 alice staff 3 2016-03-21 test.txt
user:root:rwxpdDaARWcCos:------I:allow
user:alice:rwxp--aARWc--s:------I:allow
Выход ls
для самого каталога:
# /usr/bin/ls -Vd
drwx------+ 3 root root 4 2016-03-21 .
user:root:rwxpdDaARWcCos:fd-----:allow
user:alice:rwx---a-R-c--s:-------:allow
user:alice:rwxp--aARWc--s:f-i----:allow
# /usr/bin/ls -vd
drwx------+ 3 root root 4 2016-03-21 .
0:user:root:list_directory/read_data/add_file/write_data
/add_subdirectory/append_data/read_xattr/write_xattr/execute
/delete_child/read_attributes/write_attributes/delete/read_acl
/write_acl/write_owner/synchronize:file_inherit/dir_inherit:allow
1:user:alice:list_directory/read_data/add_file/write_data
/read_xattr/execute/read_attributes/read_acl/synchronize:allow
2:user:alice:list_directory/read_data/add_file/write_data
/add_subdirectory/append_data/read_xattr/write_xattr/execute
/read_attributes/write_attributes/read_acl/synchronize
:file_inherit/inherit_only:allow
Файловая система общего ресурса - ZFS. Наиболее интересные свойства, отличные от значений по умолчанию, следующие:
NAME PROPERTY VALUE SOURCE
pool/share type filesystem -
pool/share compression lz4 inherited from pool
pool/share atime off local
pool/share aclmode restricted local
pool/share aclinherit passthrough local
pool/share version 5 -
pool/share utf8only on -
pool/share normalization formD -
pool/share casesensitivity insensitive -
pool/share nbmand on local
pool/share sharesmb name=testshare local
Разрешения общего ресурса CIFS настроены так, чтобы предоставить всем полный доступ, поэтому должны применяться только права доступа к файлу.
Обновить:
Эта ветка очень похожа на мою проблему, хотя решение с уменьшением списков ACL в /pool/share/.zfs/shares/testshare
к modify_set
для всех (или отказать пользователям в определенных разрешениях на удаление), похоже, не работает в моем случае, и я не знаю, почему.
После игнорирования этой проблемы в течение недели, теперь она внезапно срабатывает ... Я не знаю, что ее вызвало, но она работает ... Я попробовал предложение от этот блог, но изменил его, чтобы включить AW
как человека. Затем я снова протестировал его, на этот раз только с моими старыми правилами запрета (полностью перезаписав новые), которые также сработали. Наконец, я использовал самые первые настройки из моего собственного вопроса, которые никогда не работали, но теперь они сработали.
После некоторого дополнительного тестирования, я думаю, это произошло из-за того, что служба SMB не была перезапущена раньше, а общие списки управления доступом не распознавались правильно. Их изменение было единственным способом восстановить прежнее (и неправильное) поведение.
Итак, для справки в будущем решение состоит в том, чтобы определить обычные разрешения для самих файлов и не разрешать Co
разрешения на уровне общего ресурса:
Примените следующие правила ACL к каталогу и (унаследованные) ко всем вновь созданным файлам:
/usr/bin/chmod A=\
user:root:rwxpdDaARWcCos:fd-----:allow,\ # root has full access
user:alice:rwx---a-R-c--s:-------:allow,\ # dir: create files, read everything
user:alice:rwxp--aARWc--s:f-i----:allow \ # files: wpAW is needed for full file write access, everything is only inherited to files
/pool/share
Примените следующие правила ACL к скрытому общему каталогу набора данных ZFS (это необходимо, чтобы владелец не мог изменять списки ACL, подробности см. В ответе @ embedded и связанной публикации serverfault):
/usr/bin/chmod A=\
user:root:full_set:-------:allow,\ # root has full access
everyone@:modify_set:-------:allow \ # anyone else cannot modify permissions
/pool/share/.zfs/shares/testshare
Перезагрузите SMB-сервер (необходимо обновить измененные списки управления доступом к общим ресурсам, см. эта тема):
svcadm restart svc:/network/smb/server:default # restart service
svcs -xv svc:/network/smb/server:default # check if the startup date has changed
Теперь новые файлы можно создавать и записывать, но нельзя удалять, а также пользователи Windows не могут давать себе дополнительные права. Это решение отлично подходит для моей ситуации, но я вижу два небольших недостатка:
alice
может перезаписывать символы или строки в текстовом документе. Я думаю, это связано с тем, что приложению, которое я использую, нужны права добавления и записи, и нет ACL, который проверяет "только начальную запись" или что-то подобное.ИМХО все становится действительно запутанным, если вы удалите тривиальные ACL для пользователя, группы, всех. Что следует учитывать:
Итак, мой подход состоит в том, чтобы изменить тривиальные ACL в соответствии с потребностями (использовать режим запрета), а затем добавить нетривиальные ACL для всех особых случаев использования. Имейте это в виду:
Если не знаю, что такое OmniOS, но эти документы помогли мне понять NFS ACL. Мы используем Solaris с ZFS https://docs.oracle.com/cd/E53394_01/html/E54801/ftyxi.html#scrolltoc