Полномочия 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 требуется выполнить следующее:
Поля user::, group:: и other:: должны быть схожими. Они - не что иное, как ACL-представление стандартной системы полномочий Unix. Тем не менее, записи nobody и wheel являются новыми Они обозначают права определенных пользователей и групп (в данном случае - nobody и wheel) вдобавок к обычному набору полномочий.
Добавление и удаление ACL.
Команда setfacl позволяет добавлять, изменять и удалять ACL. У команды много опций, но для начала Вам нужно знать лишь немногие из них, чтобы работать с ACL. Во-первых, синтакс. ACL указываются так, как они отображаются на выводе команды getfacl. Попробуем удалить и воссоздать ACL для файла 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, в FreeBSD NFS также игнорирует их. Ни формат файлов в утилите 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::.
Обратите внимание на необычный элемент "r-x" для пользователя bob в записях для каталога: ACL по умолчанию заметен в свойствах файлов, созданных в каталоге, а не в свойствах самого каталога. ACL-элемент "u:bob:rw-" будет добавлен к ACL любого файла, созданного в каталоге cool_widgets. Теперь у Вас имеется каталог cool_widgets, файлы в котором доступны для чтения и записи пользователям rob и bob без использования группы. Если в дальнейшем Вы решите избавиться от ACL по умолчанию, используйте опцию "-k" команды setfacl, которая работает с ACL по умолчанию так же, как опция "-b" - с ACL файлов.