Управление правами 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
Об автореДжим Мауро (Jim Mauro) является отраслевым технологическим менеджером компании Sun Microsystems. |