Что такое списки доступа (ACL) и как их настроить во FreeBSD


Файл серверы обычно используют общие ресурсы, закрытые для одних групп и пользователей, и предоставляющие полный доступ другим, хотя стандартные права обычные для всех пользователей. Делается это использованием списков доступа (Access Control Lists - ACLs), для доступа к каталогам и файлам. Клиенты Windows на вашем Samba сервере также могут иметь разные ограничения с помощью списков доступа.

По умолчанию управление списками доступа выключено для всех разделов и точек монтирования. В этом легко убедиться, просмотрев таблицу разделов:

$ mount
/dev/ad4s2a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad4s2f on /tmp (ufs, local, soft-updates)
/dev/ad4s2e on /usr (ufs, local, soft-updates)
/dev/ad4s2d on /var (ufs, local, soft-updates)
linprocfs on /usr/compat/linux/proc (linprocfs, local)

Видно, что все точки монтирования не поддерживают контроль списков доступа (ACL), так как нет сообщений об этом. Для включения ACL любого раздела его сначала нужно размонтировать. Размонтирование надо проводить в однопользовательском режиме, как это ни печально. Так что перегружаемся в однопользовательский режим, включаем поддержку списков доступа.

# umount /usr
# tunefs -a enable /dev/ad4s2e
tunefs: ACLs set
# mount /dev/ad4s2e /usr

Посмотрим, что изменилось:

# mount
/dev/ad4s2a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad4s2f on /tmp (ufs, local, soft-updates)
/dev/ad4s2e on /usr (ufs, local, soft-updates, acls)
/dev/ad4s2d on /var (ufs, local, soft-updates)
linprocfs on /usr/compat/linux/proc (linprocfs, local)

Можно заметить, что для каталога /usr включилась поддержка списков доступа. Перегружаемся обратно в многопользовательский режим.

Теперь, когда ACL включены для каталога /usr, поэкспериментируем с файлами и подкаталогами. Используем 2 команды: setfacl(1) для установки ACL и getfacl(1) для вывода информации по ACL. Создадим подопытного кролика в виде файла:

#echo "Подопытный кролик" > file.txt

Смотрим текущие ACL для данного файла:

getfacl file.txt
#file:file.txt
#owner:1001
#group:0
user::rw-
group::r--
other::r--

Ничего необычного в правах пока нету. Теперь запретим доступ к файлу, кроме пользователя rumata и владельца:

#setfacl -m u:rumata:r,o:: file.txt
# ls -l file.txt
-rw-r-----+ 1 admin wheel - 8 Mar 20 10:16 file.txt

при листинге видим, что появился плюс в списке прав, что обозначает включение ACL для данного файла. Посмотрим теперь с другой стороны:

getfacl file.txt
#file:file.txt
#owner:1001
#group:0
user::rw-
user:rumata:r--
group::r--
mask::r--
other::---

Теперь попробуем сделать права наоборот - файл будет доступен всем, кому не лень, кроме пользователя rumata:

#setfacl -m u:rumata:,o::rw file.txt

Теперь удалим ACL для пользователя rumata:

#setfacl -n -x u:rumata: file.txt

а теперь и вообще все ACL:

#setfacl -bn file.txt

ls -l file.txt
-rw-r--rw- 1 admin wheel - 8 Feb 21 09:06 file.txt

Все замечательно, но как скопировать ACL на другой файл или сделать рекурсивное копирование для каталога?

# setfacl -m u::rwx,g::rw,o::,u:rumata:r file.txt
# getfacl file.txt
#file:file.txt
#owner:1001
#group:0
user::rwx
user:test:r--
group::rw-
mask::rw-
other::---

# touch file2.txt
# getfacl file.txt | setfacl -b -n -M - file2.txt

и проверим, так ли это:

getfacl file.txt file2.txt
#file:file.txt
#owner:1001
#group:0
user::rwx
user:test:r--
group::rw-
mask::rw-
other::---

#file:file2.txt
#owner:1001
#group:0
user::rwx
user:test:r--
group::rw-
mask::rw-
other::---

Все сходится.

http://rumata.dragons.ru/article.php?story=20060405184830970

Обновлено: 12.03.2015