Вопрос или проблема
Я настраиваю файловый сервер с общим каталогом. Внутри находятся папки для каждого пользователя, которые доступны для чтения всем пользователям, и общий каталог, который доступен для чтения и записи всем пользователям. Папки для каждого пользователя довольно просты. Однако у меня есть некоторые проблемы с общим каталогом. Я выполнил стандартную процедуру создания каталога с установленным GID:
# chown root shared
# chmod -R ug+rwX shared
# chgrp -R users shared
# find shared -type d -exec chmod g+s "{}" \;
# find shared -type d -exec setfacl -m "default:group::rwx" "{}" \;
После того как я убедился, что все пользователи находятся в группе ‘users’, это прекрасно работает через прямой вход в консоль, ssh, rsync и т.д. Однако есть некоторые проблемы с samba.
При стандартной конфигурации samba бит SGID и GID распространяются, но новые файлы и папки не имеют установленного разрешения на запись для группы. Это, кажется, происходит потому, что ACL игнорируется. Согласно Samba игнорирует POSIX ACL, решение заключается в добавлении vfs objects = acl_xattr
в smb.conf. Когда я это установил, разрешение на запись для группы было установлено правильно. Однако группа затем устанавливается как основная группа пользователя вместо группы родительского каталога, что в значительной степени подрывает цель установки бита GID. Я пробовал другие корректировки smb.conf, указанные в ссылке (map acl inherit = yes
, store dos attributes = yes
и inherit acls = yes
), но это не дало результата. Как правильно это сделать?
Чтобы установить группу, пользователя и разрешения для новых файлов и папок, я использую эту конфигурацию на сервере (в smb.conf
):
[shared-folder]
writeable = yes
force user = "user"
force group = "users"
create mask = 0664
force create mode = 0664
directory mask = 0775
force directory mode = 0755
Вы могли бы обрабатывать общий каталог таким образом, через отдельный общий каталог.
Примечание: как указано в комментариях, эта настройка может быть несовместима с ACL. Я рекомендую делать это только если вы собираетесь полагаться исключительно на UNIX-разрешения.
Если vfs objects = acl_xattr
, то автоматически inherit acls = yes
, в соответствии с мануалами, описывающими inherit acls
в smb.conf
:
Обратите внимание, что использование VFS модулей acl_xattr или acl_tdb, которые сохраняют
родные Windows как метаданные, автоматически включит эту опцию для
любого общего ресурса, для которого они загружены, так как они требуют этой опции для
правильной эмуляции Windows ACL.
И как только inherit acls
включен,unix-режим, используемый для создания новых файлов/каталогов, будет 0777 (по сути, обнуляя бит setgid
):
Включение этой опции устанавливает unix-режим на 0777, тем самым гарантируя,
что стандартные ACL каталогов пропагируются.
Явное указание inherit acls = no
вместе с vfs objects = acl_xattr
кажется работающим, но, вероятно, они не предназначены для совместного использования таким образом и могут иметь неизвестные или скрытые побочные эффекты.
Ответ или решение
Проблема с папкой Samba с установленным битом SGID
Настройка общего доступа к файлам через Samba может вызывать сложности, особенно в контексте управления правами доступа с использованием битов SGID и ACL. Эта статья осветит ваши проблемы и предложит рекомендации по их устранению.
Текущая ситуация
Вы создали файловый сервер с общей директорией, в которой находятся пер-user папки и общая папка, доступная для чтения и записи. Однако возникли проблемы с настройкой общей папки: после установки битов SGID новосозданные файлы не унаследовали правильные права доступа и группу.
Причины проблемы
При настройке Samba в базовой конфигурации, применение битов SGID и GID происходит, но права на запись для группы не устанавливаются. Это связано с тем, что ACL игнорируются. Ваша попытка включить vfs objects = acl_xattr
исправила некоторые аспекты, но вызвала проблему с назначением группы по умолчанию для пользователей.
Рекомендации по конфигурации Samba
Для правильной работы с правами доступа и совместного использования папок вам стоит изменить конфигурацию Samba следующим образом:
-
Измените smb.conf:
[shared-folder] path = /путь/к/вашей/shared browsable = yes writable = yes force user = "user" force group = "users" create mask = 0664 directory mask = 0775 vfs objects = acl_xattr inherit acls = no
Здесь мы фактически отключаем
inherit acls
, так как это может привести к неочевидным последствиям, как вы уже упоминали. -
Проверьте группы пользователей:
Убедитесь, что все пользователи, которые должны иметь доступ к общей папке, находятся в группе
users
. Вы можете использовать командуgroups имя_пользователя
для проверки. -
Настройте права доступа на уровне системы:
Если вы применяете POSIX ACL, проверьте, правильно ли они настроены на вашей файловой системе. Например, для установки прав по умолчанию на папку:
setfacl -R -m "g:users:rwx" /путь/к/вашей/shared setfacl -R -d -m "g:users:rwx" /путь/к/вашей/shared
Проверка результатов
После внесенных изменений остановите и запустите Samba:
sudo systemctl restart smb nmb
Затем протестируйте доступ через Samba с различных учетных записей пользователей, чтобы убедиться, что права на файлы создаются корректно и пользователи могут видеть и изменять файлы в соответствии с вашими требованиями.
Заключение
Правильная настройка прав доступа в Samba с использованием SGID и ACL может быть сложной задачей. Следуя предложенным рекомендациям, вы сможете обеспечить надежный доступ к общим ресурсам для всех пользователей. Если проблема не будет устранена, стоит обратиться к документации Samba или проконсультироваться с сообществом пользователей для более глубокого анализа.