Как известно, традиционный для Unix подход в организации прав доступа в виде User:Group:Others вкупе с тремя дополнительными битами SUID, GUID и Sticky Bit не дают той гибкости, которая часто бывает нужна для решения конкретных задач. Слава Богу, для более тонкой настройки прав уже давно существует решение под названием Posix ACL, т.е. расширение прав доступа в соответствии со стандартом Posix. В интернете об этом написано много, поэтому я лишь опишу здесь решение конкретной задачи, которая часто встречается на практике.
Итак, допустим что мы работаем в компании, где есть сервер Apache с домашней папкой /var/www/html, на которую установлены права пользователя www-data, находящегося в группе www-data в виде rwxr-xr-x. Это значит, что писать в эту папку никто, кроме пользователей root и www-data не может.
Руководство решает модернизировать сайт компании, для чего просит обеспечить web-программистам возможность писать в эту папку и менять её содержимое. Но программисты работают под учётной записью admin в группе admin и никакими стандартными средствами путём включения пользователей admin или www-data в какие-либо группы добиться этого невозможно.
Для решения задачи установим пакет acl
# apt-get install acl
Представьте себе, что цель достигается командой в одну-единственную строчку:
setfacl -Rm d:u:admin:rwX,u:admin:rwX /var/www/html
Рассмотрим назначение каждого компонента в этой строчке:
setfacl — команда установки расширенных прав на файл или папку (последний операнд). Для просмотра прав предусмотрена программа getfacl
-Rm — рекурсивное (R) изменение (m) прав для файлов в папке и её подпапках
u:admin:rwX — установка прав на уже существующие файлы в папке и её подпапках. В данном случае пользователю (u) admin разрешается чтение и запись файлов (rw). Большая буква X специально предназначена для рекурсивной обработки файлов и директорий: если у файла стоял бит выполнения (x) то он выставляется и для пользователя admin, если нет, то не выставляется, тогда как у папок и подпапок он выставляется принудительно, чтобы пользователь admin мог заходить в любые подпапки. Используя маленькую букву x мы бы сделали исполняемыми все файлы для пользователя admin (в т.ч. изображения, pdf и т.п.), что нам не нужно.
d:u:admin:rwX — То же самое что и выше, но только для вновь создаваемых файлов и подпапок в папке /var/www/html, где d означает default, то есть расширенные права по умолчанию.
Теперь пользователь admin (помимо www-data и root) может делать в папке html всё что угодно, но больше никто доступа на запись в этой папке иметь не будет.
В консоли файлы с расширенными правами помечаются знаком плюса «+», следующим сразу после прав доступа, например rw-rw-r—+.
admin@server:/var/www/html$ ll
итого 16
drwxrwxr-x+ 3 www-data www-data 4096 марта 30 20:22 ./
drwxr-xr-x 3 root root 4096 марта 30 22:15 ../
-rw-rw-r--+ 1 www-data www-data 14 марта 29 23:49 index.html
drwxrwxr-x+ 3 www-data www-data 4096 марта 30 20:24 internal/
Следует иметь в виду, что по внешнему виду прав в консоли уже невозможно сказать, кто какими правами обладает. Это типичное заблуждение не знакомых с posix ACL пользователей. Для просмотра реальных прав необходимо пользоваться утилитой getfacl. Вот листинг результата вывода этой команды:
admin@server:/var/www# getfacl html
# file: html
# owner: www-data
# group: www-data
user::rwx
user:admin:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:admin:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
На самом деле даже эта информация бывает трудна для восприятия, но это дело практики. Наличие дефолтных настроек возможно только у папок, поскольку для файлов опция «d» не имеет смысла.
Постскриптум
На практике права, выставленные описанным выше способом, постепенно начинают «слетать» сами собой. В частности, пропадают права на запись в папки. С этим я столкнулся при автоматическом деплойменте кода сайтов с гитлаба. Поначалу всё шло хорошо. Затем rsync, который я использовал для синхронизации извне, стал жаловаться на недоступность некоторых файлов на запись. Я долго не мог понять, в чём дело, но в один прекрасный день просто решил пройтись по папкам getfacl-ом и обнаружил, что безусловные права пользователя на папки rwx вдруг стали effective r-x, хотя я сам, естественно, ничего на сервере не менял.