Списки контроля доступа FreeBSD


Полномочия Unix гибки и могут решить почти любую проблему управления доступом к файлам, но как обстоят дела с теми проблемами, которые полномочия решить не могут ? Действительно ли Вы хотите создавать группу каждый раз, разделяя доступ к файлу с другим пользователем ? Возможно, Вы не имеете прав администратора системы и не можете создать группу, как Вы этого желаете. Иногда ограничения могут вызвать проблему безопасности, было бы неплохо иметь возможность создать каталог, доступный процессу, имеющему полномочия веб-сервера или другому пользователю без предоставления чтения или записи всем остальным. Конфигурационные файлы, которые могут быть изменены администратором системы, часто необходимо изменять, не получая привилегий суперпользователя; взамен использования программ вроде sudo или calife или "проваливания в программу-оболочку" при редактировании было бы лучше просто разрешать определенным пользователям редактировать эти файлы.
Списки контроля доступом (ACL) решают эти проблемы. Они дают большую гибкость, чем стандартный набор полномочий "пользователь/группа/остальные". ACL доступны в коммерческих Unix-системах, таких как IRIX или Solaris (и в Windows NT) в течение нескольких лет. В настоящее время, благодаря проекту TrustedBSD, ACL доступны в FreeBSD 5.0 и выше. Многое из нижеизложенного относится и к реализации ACL на других платформах; тем не менее, Вам придется заглянуть в документацию к своей системе, чтобы избежать ошибок из-за разницы в синтаксисе команд. Вряд ли Вы найдете большое количество различий, так как FreeBSD соответствует самому последнему стандарту POSIX.1e.


Включение ACL.

ACL активируются опцией в суперблоке файловой системы, который редактируется с помощью tunefs.
Установка опций суперблока.

Команда tunefs может быть применена на отмонтированной, либо доступной только для чтения файловой системе. Это означает, что Вы должны загрузиться в однопользовательском режиме перед запуском команды


/sbin/tunefs -a enable /fs

где /fs обозначает точку монтирования файловой системы (/, /usr, и так далее). Если Вы не имеете доступа к терминалу машины (например, в случае машины, находящейся на colocation), Вы можете добавить вызов команды tunefs в начало файла /etc/rc для включения ACL при последующей загрузке.
Если Вы используете файловую систему UFS2, включение ACL закончено. Для включения ACL необходима только строчка opions UFS_ACL, встроенная по умолчанию в GENERIC-конфигурацию ядра. Если же Вы используете UFS1, следуйте инструкциям ниже.


Дополнительная конфигурация для UFS1.

Все усложняется, если Вы, подобно многим пользователям FreeBSD 5.0, используете UFS1 (FreeBSD 5.1 и выше используют UFS2 как файловую систему по умолчанию). ACL основаны на расширенных атрибутах, которыми не обладает UFS1.
Для установки расширенных атрибутов Вы должны добавить строки options UFS_EXTATTR и options UFS_EXTATTR_AUTOSTART в файл конфигурации ядра системы, после чего собрать и установить новое ядро. Не перезагружайте машину- Вам все еще необходимо инициализировать расширенные атрибуты на каждой файловой системе. Например, для инициализации атрибутов на /var требуется выполнить следующее:
%mkdir -p /var/.attribute/system
% cd /var/.attribute/system
% extattrctl initattr -p /var/ 388 posix1e.acl_access
% extattrctl initattr -p /var/ 388 posix1e.acl_default

Используйте вместо /var/ любую файловую систему по своему выбору. После инициализации перезагрузитесь и атрибуты будут включены.


Взгляд на ACL

Работа с ACL проста. Файлы с ACL будут обозначены симолами "a+" в листинге, выдаваемом по ls -l: -rw-rw-r--+ 1 rob rob 0 Apr 19 17:27 acl-test

Чтобы увидеть ACL, достаточно использовать getfacl :
$ getfacl acl-test
#file:acl-test
#owner:1000
#group:1000
user::rw-
user:nobody:rw-
group::r--
group:wheel:rw-
mask::rw-
other::r--

Поля user::, group:: и other:: должны быть схожими. Они - не что иное, как ACL-представление стандартной системы полномочий Unix. Тем не менее, записи nobody и wheel являются новыми Они обозначают права определенных пользователей и групп (в данном случае - nobody и wheel) вдобавок к обычному набору полномочий.


Добавление и удаление ACL.

Команда setfacl позволяет добавлять, изменять и удалять ACL. У команды много опций, но для начала Вам нужно знать лишь немногие из них, чтобы работать с ACL.
Во-первых, синтакс. ACL указываются так, как они отображаются на выводе команды getfacl. Попробуем удалить и воссоздать
ACL для файла acl-test:
$ setfacl -b acl-test
$ setfacl -m user:nobody:rw-,group:wheel:rw- acl-test

Опция "-b" удаляет все ACL, кроме стандартных полномочий пользователя, группы и остальных. Опция "-m" модифицирует ACL указанным элементом (или несколькими элементами, разделенными запятой). Можно использовать аббревиатуры элементов : нижеприведенный пример может быть сокращен до u:nobody:rw-,g:wheel:rw-. Вы даже можете использовать setfacl для модификации "традиционных" полномочий; установка элемента user::rw- эквивалентна запуску chmod u=rw для изменения прав на файл.
Удаление ACL почти идентично: setfacl -x u:nobody:rw-,g:wheel:rw- удаляет указанный ACL.Также можно указать ACL в файле. Опции -M и -X выполняют функции их аналогов, задающихся строчными буквами, читая элементы их файла.
Рассмотрим файл acl-test вновь:
$ cat test-acl-list
u:nobody:rw-
# this is a comment
g:wheel:rw-
$ setfacl -X test-acl-list acl-test
$ getfacl acl-test
#file:acl-test
#owner:1000
#group:1000
user::rw-
group::r--
mask::r--
other::r--
ACL и другие Unix-утилиты.

К сожалению, большинство Unix-утилит все еще не поддерживает ACL. Например, tar не архивирует и не восстанавливает ACL, NFS во FreeBSD также игнорирует их. Ни формат файлов в утилите tar, ни в протоколе NFS нет даже намека на возможность использования ACL. Тем не менее, архивы полного раздела UFS1, сделанные с помощью tar или dump, восстанавливают каталог .attribute, и утилита dump в FreeBSD модифицирована для "понимания" UFS2 (включающую ACL). Каталог-скелет archivers/star поддерживает ACL. Вы даже можете работать с архивами, созданными в Linux и FreeBSD с помощью star и сохраняющей расширенные атрибуты (включающие и ACL).


Использование ACL с Samba и Windows.

Если вы собираете Samba с поддержкой ACL, Вы можете отредактировать списки доступа к файлам, "раздаваемых" Samba, с помощью поставляемых с Windows утилит для работы с ACL. Просто пересоберите Samba с поддержкой ACL. Использую коллекцию портов FreeBSD, Вы можете указать параметр утилиты make WITH_ACL_SUPPORT в диалоге конфигурации порта net/samba.
Собрав и запустив Samba, просмотрите в Windows свойства файлов на сетевом диске, созданном с помощью Samba. На закладке "Безопасность" Вы можете просмотреть и изменить ACL, как если бы файлы находились на Windows-сервере. Если
Вы сопротивлялись переходу с Windows на использование Samba, мотивируя это отсутствием ACL в последней, теперь самое время серьезно задуматься о развертывании Samba и FreeBSD на своих файловых серверах. ACL по умолчанию.

Рассмотрим усложненный пример. Вы хотите сделать ваш каталог cool_widgets доступным для пользователя Bob, кроме остальных. Для этого необходимо добавить ACL-элемент. Хотя, когда вы добавляете файлы в этот каталог, они не будут автоматически приобретать ACL каталога. Вам необходимо установить для него ACL по умолчанию Любые файлы, созданные в каталоге, будут наследовать ACL по умолчанию.

Используя опцию "-d" при вызове getfacl или setfacl эффект будет виден на ACL каталога, а не на самом каталоге.
$ mkdir cool_widgets
$ chmod o-rwx cool_widgets
$ ls -l
...
drwxr-x--- 2 rob rob 512 Apr 19 21:21 cool_widgets
...
$ getfacl -d cool_widgets
#file:cool_widgets
#owner:1000
#group:1000

Добавляем ACL по умолчанию:
$ setfacl -d -m u:bob:rw- cool_widgets
setfacl: acl_calc_mask() failed: Invalid argument
setfacl: failed to set ACL mask on cool_widgets

Ой! ACL по умолчанию работают не так, как обычные ACL. Вы не можете установить определенный элемент ACL по умолчанию, пока не добавите общие элементы user::, group:: и other::.
$ setfacl -d -m u::rw-,g::r--,o::---,u:bob:rw- cool_widgets
$ setfacl -m u:bob:r-x cool_widgets

Обратите внимание на необычный элемент "r-x" для пользователя bob в записях для каталога: ACL по умолчанию заметен в свойствах файлов, созданных в каталоге, а не в свойствах самого каталога. ACL-элемент "u:bob:rw-" будет добавлен к ACL любого файла, созданного в каталоге cool_widgets.
Теперь у Вас имеется каталог cool_widgets, файлы в котором доступны для чтения и записи пользователям rob и bob без использования группы. Если в дальнейшем Вы решите избавиться от ACL по умолчанию, используйте опцию "-k" команды setfacl, которая работает с ACL по умолчанию так же, как опция "-b" - с ACL файлов.

Оригинал - "FreeBSD access control lists http://www.onlamp.com/pub/a/bsd/2003/08/14/freebsd_acls.html".

Обновлено: 12.03.2015