Вопрос или проблема
У меня есть сервер Samba на FreeBSD и ZFS и клиент Linux, которому нужно смонтировать общую папку Samba. Чтобы избежать проблем с совместимостью, она должна быть смонтирована так, чтобы соблюдались и поддерживались права Unix на стороне клиента. Согласно моему исследованию, при монтировании общей папки Samba с помощью драйвера CIFS для Linux есть 5 возможных способов обработки прав Unix:
-
Монтирование через
uid=,gid=,dir_mode=,file_mode=
.Права Unix не поддерживаются в базовом протоколе CIFS/SMB, их нельзя использовать на обычном сервере SMB без каких-либо расширений. Следовательно, указание этих параметров заставит драйвер CIFS для Linux использовать стандартных владельцев, группы и режимы для всех файлов, и их нельзя изменить.
-
Включение расширения Unix для SMBv1 через
unix extensions = yes
на SambaВ прошлом HP определила расширение Unix для SMBv1. Когда используется расширение Unix для SMBv1, информация о владельце, группе и режиме автоматически передается от сервера к драйверу CIFS клиента Linux. Пока UID и GID совпадают на сервере и клиенте, это должно вести себя как локальная файловая система Unix.
К сожалению, SMBv1 небезопасен и был отменен много лет назад, что делает этот вариант неприемлемым. Возможно, его все еще можно использовать в пределах частной VPN, но я действительно не хочу использовать этот устаревший вариант.
-
Включение расширения POSIX для SMBv3 через
smb3 unix extensions = yes
, монтирование черезposix
Недавно были проведены работы по разработке нового расширения POSIX для SMBv3, которое позволяет использовать права Unix и другие функции. К сожалению, хотя опция
posix
уже была добавлена в драйвер CIFS для Linux, поддержка Samba остается экспериментальной и требует сборки для разработки, поэтому ее нельзя использовать в производственных системах. -
Отображение прав ACL через
cifsacl
, принудительно на сервере. -
Отображение прав в стиле NFS через
idsfromsid
,modefromsid
, принудительно на клиенте.
Согласно различным презентациям разработчиков с 2020 года, драйвер CIFS для Linux поддерживает варианты 4 и 5 для включения прав Unix через отображение из ACL или SID, управляемое параметрами монтирования cifsacl
, idsfromsid
и modefromsid
. Утверждается, что эти функции готовы к использованию в производстве. Некоторые посты также упоминали, что cifsacl
принудительно на сервере и часто используется вместе с idmap
, в то время как idsfromsid
и modefromsid
используют модель разрешений, принудительно применяемую клиентом в стиле NFS, которая является более простой опцией для общего доступа для одного пользователя.
К сожалению, похоже, что почти нет документации для cifsacl
, idsfromsid
и modefromsid
, хотя эти функции были разработаны 4 года назад. Есть только несколько упоминаний об этих опциях из презентаций на конференциях разработчиков, но общественностью о них известно очень мало. Например, официальная документация kernel.org имеет только загадочное заявление, но без какого-либо объяснения о том, как правильно их использовать:
Рекомендации: для повышения безопасности диалект SMB2.1 или более поздний (обычно будет SMB3.1.1) теперь является новым по умолчанию. […] Есть дополнительные параметры монтирования, которые могут быть полезны для SMB3, чтобы получить улучшенное поведение POSIX (Примечание: можно использовать vers=3 для принуждения к SMB3 или более позднему, никогда 2.1): mfsymlinks и либо cifsacl, либо modefromsid (обычно с idsfromsid)
Когда я попробовал добавить idsfromsid
и modefromsid
в параметры монтирования, это, похоже, не сработало. Если команда mount
выполняется от имени root, все файлы внутри точки монтирования все равно принадлежать root
, а не фактическому пользователю на сервере. Режимы для этих файлов нельзя изменить, даже от имени root. Поведение кажется идентичным обычному CIFS/SMB без каких-либо расширений.
Вопрос
- Как работает
cifsacl
в CIFS/SMB? - Как работают
idsfromsid
иmodefromsid
в CIFS/SMB? - Как правильно их использовать? Меня особенно интересует использование метода
idsfromsid
иmodefromsid
, так как он выглядит проще.
Библиография
-
Руководство пользователя и администратора ядра Linux » CIFS » Использование
-
Расширения протокола SMB3.1.1 POSIX: Резюме и текущее состояние реализации
-
Доступ Linux к облаку и NAS воскрес: Недавний прогресс в SMB3.1.1
-
Будущее удаленного доступа к файлам из Linux: обновление SMB3.1.1
-
[Samba] Как включить расширения POSIX для SMB3 на сервере Samba?
Читая исходный код ядра Linux, мне кажется, я решил одну часть головоломки.
Как работают
idsfromsid
иmodefromsid
в CIFS/SMB?
В SMB у каждого пользователя или группы есть свой собственный SID, который используется для контроля доступа. Эти пользователи управляются инструментами Samba, такими как pdbedit
или smbpasswd
. Это отличается от аккаунтов Unix, управляемых инструментами Unix, такими как passwd
или useradd
.
С помощью Samba можно просмотреть ACL файла или каталога через:
$ smbcacls //server/share /dir -U user
Например, следующая команда перечисляет ACL корневого каталога //server/share
. ACL Samba хранятся как ACL файловой системы Unix (черновик POSIX ACL или NFSv4 ACL) подлежащей файловой системе, которая может не иметь смысл под Unix. Но всегда есть три специальных записи ACL для Пользователя, Группы и Всех, которые соответствуют правам Unix.
$ smbcacls //server/share / -U user
Пароль для [WORKGROUP\user]:
REVISION:1
CONTROL:SR|DP
OWNER:SERVER\user
GROUP:Unix Group\user
ACL:SERVER\user:ALLOWED/0x0/0x001e01ff
ACL:Unix Group\user:ALLOWED/0x0/READ
ACL:Everyone:ALLOWED/0x0/READ
В выводе OWNER:SERVER\user
означает, что владельцем файла является пользователь Samba, а GROUP:Unix Group\user
означает, что группой файла является группа Unix. Почему есть разница?
Когда пользователь Unix имеет соответствующий аккаунт Samba, сервер Samba автоматически сопоставляет аккаунт Unix с этим аккаунтом Samba. Но когда пользователь или группа неизвестны Samba, специальные SID используются как заполнители для несопоставленных аккаунтов Unix.
Это можно наглядно показать, проверив сырые SID в числовом формате:
$ smbcacls //server/share / -U user --numeric
Пароль для [WORKGROUP\user]:
REVISION:1
CONTROL:0x8004
OWNER:S-1-5-21-3329942186-90701280-2335022555-1001
GROUP:S-1-22-2-1002
ACL:S-1-5-21-3329942186-90701280-2335022555-1001:0/0x0/0x001e01ff
ACL:S-1-22-2-1002:0/0x0/0x001200a9
ACL:S-1-1-0:0/0x0/0x001200a9
Обратите внимание, что Owner
является реальным SID S-1-5-21-3329942186-90701280-2335022555-1001
, 1001 соответствует ID пользователя Samba в pdbedit -L -v
. Но Group
имеет специальный заполнитель SID S-1-22-2-1002
, 1002 соответствует действительному ID группы Unix.
В другом примере давайте рассмотрим файл, контролируемый пользователем и группой Unix, о которых Samba ничего не знает:
# smbcacls //server/share / -U user --numeric
Пароль для [WORKGROUP\user]:
REVISION:1
CONTROL:0x8004
OWNER:S-1-22-1-1009
GROUP:S-1-22-2-1010
ACL:S-1-22-1-1009:0/0x0/0x001e01ff
ACL:S-1-22-2-1010:0/0x0/0x001200a9
ACL:S-1-1-0:0/0x0/0x001200a9
Таким образом, становится очевидным, что:
-
SID
S-1-22-1-uid
является зарезервированным SID Samba для представления несопоставленного пользователя Unix. -
SID
S-1-22-2-gid
является зарезервированным SID Samba для представления несопоставленной группы Unix.
Это именно то, как работает idsfromsid
. Согласно исходному коду Linux, когда idsfromsid
установлен, драйвер CIFS сопоставит все файлы на удаленном сервере с SID S-1-22-1-uid
и S-1-22-1-gid
с локальным пользователем Unix с тем же uid
и gid
. Также распознаются другие конвенции, изначально использовавшиеся Windows: S-1-5-88-1-uid
/ S-1-5-88-2-gid
.
/* См. http://technet.microsoft.com/en-us/library/hh509017(v=ws.10).aspx */
static void setup_owner_group_sids(char *buf)
{
struct owner_group_sids *sids = (struct owner_group_sids *)buf;
/* Заполните поля владельца пользователей S-1-5-88-1 */
sids->owner.Revision = 1;
sids->owner.NumAuth = 3;
sids->owner.Authority[5] = 5;
sids->owner.SubAuthorities[0] = cpu_to_le32(88);
sids->owner.SubAuthorities[1] = cpu_to_le32(1);
sids->owner.SubAuthorities[2] = cpu_to_le32(current_fsuid().val);
/* Заполните поля группы-владельца S-1-5-88-2 */
sids->group.Revision = 1;
sids->group.NumAuth = 3;
sids->group.Authority[5] = 5;
sids->group.SubAuthorities[0] = cpu_to_le32(88);
sids->group.SubAuthorities[1] = cpu_to_le32(2);
sids->group.SubAuthorities[2] = cpu_to_le32(current_fsgid().val);
}
Кроме того, согласно исходному коду ядра Linux, modefromsid
работает аналогично. Он использует зарезервированный SID S-1-5-88-3-mode
для записи прав Unix. Эта запись ACL читается и переводится в права Unix клиентом CIFS для Linux, и она также обновляется, когда права Unix файла изменяются.
Способ обхода
Когда я попробовал добавить idsfromsid и modefromsid в мои параметры монтирования, это, похоже, не сработало. Если команда монтирования выполняется от имени root, все файлы внутри точки монтирования все равно принадлежат root, а не фактическому пользователю на сервере. Режимы для этих файлов нельзя изменить, даже от имени root. Поведение кажется идентичным обычному CIFS/SMB без каких-либо расширений.
После того как я узнал теорию работы idsfromsid
, я также нашел корень проблемы. Проблема возникает, если сервер Samba знает об аккаунте Unix. В этом случае реальные SID Samba, а не заполнители, будут получать разрешения в ACL (ручное изменение владельца на зарезервированный SID через smbcacls
не кажется работающим, поскольку он все равно сопоставляется обратно с реальным SID Samba). В этом случае ядро Linux не может сопоставить SID как локальный аккаунт Unix, и idsfromsid
не срабатывает.
Это можно подтвердить, включив отладку на клиенте CIFS:
# echo "module cifs +p" > /sys/kernel/debug/dynamic_debug/control
# echo "module cifs/* +p" > /sys/kernel/debug/dynamic_debug/control
# echo 7 > /proc/fs/cifs/cifsFYI
# dmesg | grep cifsacl
CIFS: fs/smb/client/cifsacl.c: sid_to_id: Не удается сопоставить SID os:S-1-5-21-3329942186-90701280-2335022555-1002 с uid
CIFS: fs/smb/client/cifsacl.c: Unix UID 1009, возвращенный от SID
Таким образом, после того как я узнал о теории работы, я нашел один способ использования idsfromsid
с помощью следующего хакерского метода:
- Создайте пользователя Samba
user
. - Измените разрешения файловой системы общей директории на несвязанный пользователь и группу Unix, о которых Samba ничего не знает, например
unixuser
,unixgroup
. - Используйте
force user unixuser
иforce group unixgroup
вsmb.conf
, чтобы все файлы, создаваемые в этой общей директории, оставались принадлежатьunixuser
иunixgroup
(вам также могут понадобиться дополнительные разрешения на уровне файловой системы для предоставления доступа кunixuser
иunixgroup
). - Создайте тех же
unixuser
иunixgroup
на клиенте CIFS для Linux, вручную измените UID и GID, чтобы они соответствовали серверу Samba. - Смонтируйте общую папку с помощью учетной записи Samba
user
, с опциейidsfromsid
, затем используйте файл внутри нее какunixuser
(на клиенте). Теперь все владельцы файлов и группы должны автоматически сопоставляться правильно.
modefromsid работать. Права Unix на файлы не уважаются и не могут быть изменены.
Конечно, этот хак (в частности, шаги 2 и 3) зловреден и, вероятно, не то, что имели в виду разработчики. Но из-за отсутствия документации это лучшее, что я мог сделать…
Надеюсь, однажды сообщество все это документирует должным образом…
Ответ или решение
Как работают cifsacl, idsfromsid и modefromsid в CIFS/SMB?
CIFS (Common Internet File System) и SMB (Server Message Block) представляют собой протоколы файлового обмена, которые позволяют пользователям предоставлять доступ к файлам и ресурсам в сети. Однако из-за различий в подходах к управлению разрешениями между Unix и Windows, возникли проблемы с совместимостью. Параметры cifsacl
, idsfromsid
и modefromsid
разрабатывались с целью улучшения работы фильтров разрешений, обеспечивая поддержку Unix-разрешений на Samba-серверах.
Как работает cifsacl
Параметр cifsacl
позволяет управлять ACL (Access Control List) на сервере Samba, при этом настройки разрешений применяются на стороне сервера. Это означает, что Samba автоматически сопоставляет разрешения файлов с владельцами и группами пользователей на сервере, основываясь на информациях, хранящихся в ACL. Например, если на Samba-сервере настроено правильное сопоставление UID и GID с учетными записями Unix, тогда команды, выполняемые на CIFS/SMB, будут корректно отображать разрешения как для владельца, так и для группы.
При установлении соединения Samba использует cifsacl
для передачи информации о разрешениях файлов по сети. Это важно для организаций, которые одновременно используют пользователей Windows и Unix, поскольку неверные настройки могут привести к проблемам с доступом и безопасностью.
Как работают idsfromsid и modefromsid
idsfromsid
и modefromsid
представляют собой методы клиентского сопоставления разрешений, основанные на SIDs (Security Identifiers). Каждый пользователь и группа в Samba имеют свои уникальные SIDs. С помощью параметра idsfromsid
CIFS-клиент переводит SIDs на сервере в соответствующие UID и GID на клиентском устройстве. Это позволяет пользователям устанавливать права доступа к файлам и директориям так, как они бы это делали на локальной файловой системе.
Параметр modefromsid
аналогичным образом обеспечивает перевод прав файлов, зафиксированных в SID, в Unix-разрешения при помощи специального SID, который указывает владельца, группы и права доступа. Таким образом, без необходимости дополнительных настроек на стороне сервера, CIFS-клиент может правильно обрабатывать права доступа к удалённым файлам.
Как правильно использовать idsfromsid и modefromsid
Чтобы использовать idsfromsid
и modefromsid
для настройки Unix-разрешений на Samba-сервере и обеспечить согласованность между сервером и клиентом, выполните следующие шаги:
-
Настройка Samba-сервера:
- Убедитесь, что в конфигурации Samba (
smb.conf
) установлены нужные параметры, включаяcifsacl
,idsfromsid
, иmodefromsid
.
- Убедитесь, что в конфигурации Samba (
-
Сопоставление UID и GID:
- Убедитесь, что UID и GID на сервере Samba и клиенте Linux совпадают. Это критически важно, поскольку несоответствие приведет к неправильному назначению разрешений.
-
Настройка прав доступа:
- Проверьте и настройте права доступа к файлам на стороне сервера, убедившись, что желаемая схема доступа правильно отражена в ACL.
-
Монтирование CIFS-Share:
- На клиенте выполняйте команду монтирования с параметрами:
mount -t cifs //server/share /mnt/share -o uid=<ваш_uid>,gid=<ваш_gid>,idsfromsid,modefromsid
- На клиенте выполняйте команду монтирования с параметрами:
-
Тестирование разрешений:
- Проверьте права доступа к смонтированным файлам и директориям, убедитесь, что они соответствуют ожиданиям.
Заключение
Методы cifsacl
, idsfromsid
, и modefromsid
представляют собой мощные инструменты для упрощения управления разрешениями в средах, где используются как Unix, так и Windows-системы. Однако для их успешной настройки необходимы внимание и точность в управлении идентификаторами пользователей и групп. Поскольку документация по этим параметрам часто скудна, важно внимательно следить за тренировочными материалами и обновлениями в данной области, чтобы быть в курсе изменений и улучшений в протоколах CIFS/SMB.