Samba організація доступу до підпапках через єдину точку входу

Завдання: забезпечити такий загальний доступ до файлів за допомогою 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-ах, а то і суперечать їм.