Задача: обеспечить такой общий доступ к файлам с помощью SAMBA, чтобы люди с других машин могли через специальную папку common заходить в только им разрешённые подпапки этой директории folderA и folderB, причём и у файлов и у папок требовалось обеспечить права по маске 770. То есть пользователи одной папки должны были иметь право работать со всеми документами в этой папке, независимо от того, кто их создал. Требовалось также запретить прямой доступ к подпапкам минуя основную с внешних компьютеров.
Таким образом, иерархия папок выгядит следующим образом:
common
- folderA
- folderB
В процессе решения задачи оказалось, что со вложенными папками SAMBA работает по только ей ведомым алгоритмам и всё то, что понаписано в манах, к ним практически не применимо за небольшими исключениями. Тем не менее, постом и молитвою удалось сотворить работоспособный конфиг, в котором выполняются все вышеуказанные требования.
Вот этот конфиг (/etc/samba/smb.conf):
[global]
workgroup = WORKGROUP
security = user
guest ok = no
[common]
path = /var/samba
valid users = @everybody
force group = +everybody
writeable = yes
create mask = 0660
force create mode = 0110
directory mask = 0770
[folderA]
path = /var/samba/folderA
valid users = @users_folderA
force group = +users_folderA
browseable = no
[folderB]
path = /var/samba/folderB
valid users = @users_folderB
force group = +users_folderB
browseable = no
Здесь три группы пользователей: everybody, users_folderA и users_folderB.
Пользователей, допустим, тоже 3: den, sam и alex.
Пользователям den и sam разрешено пользоваться только папкой users_folderA, а пользователю alex — только папкой users_folderB. Путь в эти подпапки лежит через папку common (/var/samba), поэтому все пользователи включены в отдельную группу everybody. Она является своего рода точкой начального входа для уполномоченных пользователей.
Сохраняем конфиг, проверяем его и перезапускаем SAMBA:
# testparm
# service smbd restart
# service nmbd restart
Теперь разберёмся с организацией папок и прав на них.
Права необходимо выставить следующие:
# chown root:everybody /var/samba
# chmod 770 /var/samba
# chown root:users_folderA /var/samba/folderA
# chmod 2770 /var/samba/folderA
# chown root:users_folderB /var/samba/folderB
# chmod 2770 /var/samba/folderB
Тем самым мы запрещаем всем кроме членов уполномоченной группы everybody просматривать и создавать файлы в папке common и всех её подпапках как с внешних узлов, так и из внутреннего шелла.
При этом, как ни странно, права при создании файлов и подпапок во внутрених папках folderA и folderB наследуются из прав, прописанных в секции [common] для родительской папки. Более того, их уже не обязательно явно указывать в подсекциях [folderA] и [folderB] — они просто игнорируются.
Права 2770, выставленные на папки folderA и folderB гарантируют, что все файлы и подпапки, находящиеся в них, будут всегда создаваться с соответствующими подгруппами этих родительских папок, что предоставляет пользователям подгрупп полный доступ к любым документам и подпапкам, даже если они созданы другими пользователями.
Директива force create mode = 0110 необходима для того, чтобы дополнтельно выставить на вновь создаваемые файлы executable бит для владельца и группы, который не выставляется директивой create mask. Директива force create mode действует по принципу ИЛИ с основной маской доступа, и выставляет бит в том случае, если он не выставлен директивой create mask.
Директива force group = +подгруппа запрещает доступ к папкам всем, кто не входит в эту подгруппу. Честно говоря, не понимаю, каким образом пользователь, не входящий в подгруппу, вообще мог бы получить какой-либо доступ к соответствующей подпапке, однако лишняя предосторожность не помешает.
Директива writable = yes в главной секции разрешает запись в основную папку common, но в то же время жёстко задаёт права записи и в подпапки этой папки, которые невозможно переопределить во внутренних секциях. Это странное наследование правил записи разрешает запись в подпапках folderA и folderB только в том случае, если вы пришли к ним через родительскую папку common. Если же попытаться обратиться к подпапкам напрямую, то они окажутся доступными только для чтения и даже уполномоченные пользователи подгрупп ничего не смогут сделать с содержимым этих подпапок.
Директива browsable = no вообще скрывает подпапки из прямой видимости извне. Поэтому, когда вы просматриваете сетевое окружение с других компьютеров, вы увидите только папку common.
Таким образом, задача полностью решена, однако некоторые особенности SAMBA никак не соотносятся с тем, что написано в её man-ах, а то и противоречат им.