Управление правами c помощью ACL (acess control lists)

По мере распространения Solaris в коммерческих вычислительных комплексах появляется необходимость в использовании более гибких схем обеспечения безопасности доступа к файловым системам. Стандартно права доступв к файлу или каталогу определяются битами режима файла с помощью команды chmod(1). Файловый режим позволяет разрешать или запрещать права read, write и execute для трех различных типов пользователей - владельца файла ("user"), членов той же группы, что и владелец (group), и всех остальных пользователей системы (other). Такая схема не обеспечивает особой гибкости, посколь ку не позволяет указать конкретный набор прав для данного пользователя или группы.

Биты файлового режима находятся в inode (i_mode field) файла, а значение по умолчанию для вновь создаваемых файлов определяется значением umask пользователя, причем этот режим может быть изменен владельцем файла с помощью команды chmod(1)(владелец файла может быть изменен командой chown(1)). Там где этого достаточно, безопасность файловой системы в Solaris можно и сегодня поддерживать указанным способом. Однако для систем, требующих большей гибкость и контроля в управлении безопасностью, существуют "списки доступа" или ACLs, которые были впервые введены в Solaris 2.5.1.

ACL позволяет владельцу файла управлять правами на файлы и каталоги в UFS (Unix File System (файловая система по умолчанию в Solaris) для отдельных пользователей и групп. Кроме того, владелец файла может определять набор прав по умолчанию в каталоге, так что все файлы, создаваемые в этом каталоге, получают одинаковый набор ACL. Поддержка для ACL существует сегодня в Solaris для следующих типов файловых систем: UFS (Unix File System), NFS (Network File System, Versions 2 and 3), CacheFS (Cache File System) и LOFS (Loopback File System).

Другие типы файловых систем в Solaris ничего не знают об ACL, и следовательно, не могут осуществлять защиту в соответствии с ACL файла. Кроме того, ACL могут применяться только к каталогам, нормальным файлам, FIFOs и символическим ссылкам (symbolic links).

Формат для файлового ACL состоит из двух или трех колонок, разделенных двоеточием:

entry_type:[uid|gid]:perms

Первая колонка, entry_type, определяет ACL для пользователя, группы, других или маску (ACL mask). Вторая колонка - это (возможно) пользовательский ID (UID) или имя пользователя, или group ID (GID) или имя группы. Для типов "другие" или mask, эта колонка неприменима и потому не требуется. Третья колонка предназначена для файловых прав (file permissions). File permissions принимают форму либо обычных rwx (read/write/execute), либо числовую форму в восьмеричной системе (напр. 7 для rwx, 4 для r--, 6 для rw-, и т.д.), что полностью эквивалентно формату в chmod(1). Внутреннее представление в виде структуры данных выглядит так (из /usr/include/sys/acl.h):

typedef struct acl {
        int a_type;     /* entry type */
        uid_t a_id;     /* UID | GID  */
   o_mode_t a_perm;     /* permissions */
} aclent_t;

Каждое поле в указанной структуре соответствует частичному полю ACL, описанным выше.

Когда username (или UID) отсуствует, и поле groupname (или GID) пусто, то применяются традиционные файловые права Solaris (мы увидим это в примере ниже). Пользователи устанавливают, модифицируют и удаляют ACL с помощью команды setfacl(1), и проверяют файловые ACL с помощью команды getfacl(1). Короткий пример ниже демонстрирует использование файловых ACL.

1  sunsys> ls -l file1
2  -rwxr-xr--   1 jim      staff        130 May 25 22:13 file1
3  sunsys> chmod 000 file1
4  sunsys> ls -l file1
5  ----------   1 jim      staff        130 May 25 22:13 file1
6  sunsys> setfacl -s user::rw-,group::r--,other:r-- file1
7  sunsys> ls -l file1
8  -rw-r--r--   1 jim      staff        130 May 25 22:13 file1
9  sunsys> getfacl file1
10 # file: file1
11 # owner: jim
12 # group: staff
13 user::rw-
14 group::r--              #effective:r--
15 mask:r--
16 other:r--
17 sunsys> setfacl -m user:moe:rw- file1
18 sunsys> ls -l file1
19 -rw-r--r--+  1 jim      staff        130 May 25 22:13 file1
20 sunsys> getfacl file1
21 # file: file1
22 # owner: jim
23 # group: staff
24 user::rw-
25 user:moe:rw-            #effective:r--
26 group::r--              #effective:r--
27 mask:r--
28 other:r--

Строка 6 демонстрирует команду setfacl(1) с опцией -s, которая означает установку acl. Команда setfacl(1) на строке 6 не определяет специальных прав для конретных пользователей или групп. Это в основном эквивалентно исполнению команды chmod 644 над тем же файлом.

С помощью команды getfacl(1) (строка 9) мы отображаем файловые права в формате ACL. Фактически мы в этот момент не имеем ACL для этого файла. Ядро Solaris отслеживает установку ACL, и для простых случаев, когда команда setfacl(1) просто устанавливает традиционные файловые права для user, group и other, реальный ACL для файла не создается. Ядро устанавливает права, определенные командой setfacl(1) в соответствующем поле в inode.

На строке 17 мы устанавливаем права read/write для пользователя Moe, используя m(modify) опцию с командой setfacl(1). Теперь при запуске команды getfacl(1) (строка 20), мы видим добавление для пользователя:moe в ACL.

Есть несколко важных моментов по поводу поведения ACL и правил старшинства. Наш пример показывает ACL mask с r--. Маска ACL определяет максимальные права, выделенные всем, кроме владельца файла; в данном примере все, кроме владельца файла имеют права только на чтение. Однако, в ACL определены read и write права для Moe. Так что же случится, если Moe попытается записать в файл - что окажется главнее - его специальные права или маска ACL? Ответ заключается в том, что "победит" ACL mask. Вот еще один короткий пример.

1  sunsys> getfacl file1
2  # file: file1
3  # owner: jim
4  # group: staff
5  user::rw-
6  user:moe:rw-            #effective:r--
7  group::r--              #effective:r--

8  mask:r--
9  other:r--
10 sunsys> su moe
11 Password:
12 $ id
13 uid=2001(moe) gid=22(stooges)
14 $ echo "write test" >> file1
15 file1: cannot create
16 $ exit
17 sunsys> setfacl -m m:rw- file1
18 sunsys> getfacl file1
19 # file: file1
20 # owner: jim
21 # group: staff
22 user::rw-
23 user:moe:rw-            #effective:rw-
24 group::r--              #effective:r--
25 mask:rw-
26 other:r--
27 sunsys> su moe
28 Password:
29 $ echo "write test" >> file1
30 $ exit
31 sunsys>

Мы не рассматривали, конечно, все варианты установки прав ACL. Нашей целью было лишь дать достаточно начальной информации, чтобы позволить начать работу с ACL. Более подробная информация содержится в setfacl(1) и getfacl(1) man pages, а также в наборе документации Solaris. Для программных вызовов ACL существуют acl(2) и facl(2), а также библиотечные функции aclcheck(3) и aclsort(3).

Resources

  • Goodheart, B. & Cox, J. The Magic Garden Explained: The Internals of Unix System V Release 4, Prentice Hall http://www.amazon.com/exec/obidos/ISBN=0130981389/sunworldonlineA/
  • Vahalia, Uresh. Unix Internals: The New Frontiers, Prentice-Hall http://www.amazon.com/exec/obidos/ISBN=0131019082/sunworldonlineA/
  • Stevens, Richard W. Advanced Programming in the Unix Environment,, Addison-Wesley http://www.amazon.com/exec/obidos/ISBN=0201563177/sunworldonlineA/

Об авторе

Джим Мауро (Jim Mauro) является отраслевым технологическим менеджером компании Sun Microsystems.