Содержание
Аннотация
POSIX ACLs (access control lists - списки управления доступом) могут быть использованы как расширение традиционной концепции привилегий для объектов файловой системы. С помощью ACL привилегии могут быть установлены более гибко, чем при помощи традиционной концепции битов доступа.
Термин POSIX ACL предполагает, что это настоящий стандарт POSIX (portable operating system interface - переносимый интерфейс операционных систем). Соответствующие черновые стандарты POSIX 1003.1e и POSIX 1003.2c были исключены по ряду причин. Тем не менее, ACLs (в том виде, в котором они реализованы во многих системах, принадлежащих семейству UNIX) основаны на этих черновиках. Реализация ACL для файловой системы (описанная в этой главе) также следует этим двум стандартам.
Вы можете найти подробную информацию о традиционных файловых привилегиях на Info странице пакета GNU Coreutils, секция File permissions (info coreutils "File permissions"). Существуют также дополнительные аттрибуты setuid, setgid, sticky bit.
В некоторых ситуациях привилегии доступа могут быть слишком строгими.
Поэтому в Linux существуют дополнительные настройки, позволяющие для определенного действия временно
сменить идентификатор текущего пользователя или группы.
Например, программа passwd обычно требует привилегий
суперпользователя для доступа к файлу /etc/passwd
. Этот файл
содержит важную информацию, такую как домашние каталоги пользователей,
идентификаторы пользователей и групп. Таким образом обычный пользователь не сможет изменить
passwd
, потому что предоставлять всем пользователям
прямой доступ к этому файлу слишком опасно. Возможным решением этой проблемы является механизм
setuid. setuid (set user
ID - установка идентификатора пользователя) это специальный файловый аттрибут, который сообщает системе, что
программу нужно выполнять используя определенный идентификатор пользователя. Рассмотрим команду passwd:
-rwsr-xr-x 1 root shadow 80036 2004-10-02 11:08 /usr/bin/passwd
Вы видите s
, что указывает на установленный бит setuid
для привилегий пользователя. Согласно ему, все пользователи,
запускающие команду passwd, выполнят ее от пользователя
root
.
Бит setuid применяется к пользователям. Однако существует аналогичное свойство для групп: бит setgid. Если этот бит установлен для программы, то программа будет использовать при работе идентификатор собственной группы, вне зависимости от того, какой пользователь ее запустил. В директории с установленным битом setgid, все вновь созданные поддиректории и файлы будут принадлежать к той же группе, к которой принадлежит директория. Рассмотрим следующую директорию:
drwxrws--- 2 tux archive 48 Nov 19 17:12 backup
Вы видите s
, что указывает на установленный бит setgid
для привилегий группы. Владелец директории и члены группы
archive
будут
иметь доступ к этой директории. Пользователи, не принадлежащие к этой группе,
«отразятся» на нее. Эффективным идентификатором группы для
для всех записанных в директорию файлов будет
archive
. Например,
программе резервного копирования, работающей с идентификатором группы
archive
, не понадобятся привилегии суперпользователя
для доступа к этой директории.
Существует также sticky bit. Его поведение отличается
для файлов и директорий. Если он установлен для исполняемого файла,
то соответствующая программа не будет выгружаться из оперативной памяти,
чтобы избежать повторной загрузки с жесткого диска. Поскольку современные жесткие диски
достаточно производительны, используется это редко. Если этот бит установлен для директории,
пользователи не смогут удалять из нее чужие файлы. Типичными примерами
являются директории /tmp
и /var/tmp
:
drwxrwxrwt 2 root root 1160 2002-11-19 17:15 /tmp
Традиционно в Linux для каждого файлового объекта задано три набора
привилегий. Они включают в себя права на чтение (r
), запись
(w
) и исполнение (x
)
для каждого из трех типов пользователей: владельца файла, группы, и
остальных пользователей. Помимо этого можно установить set
user id, set group id и
sticky бит. Эта скудная концепция вполне применима
в большинстве ситуаций. Однако для более сложных сценариев и
приложений системные администраторы должны были использовать обходные пути,
чтобы преодолеть ограничения традиционной концепции привилегий.
ACL могут быть использованы как расширение традиционной концепции привилегий. Они позволяют предоставлять доступ индивидуальным пользователям или группам даже если те не являются владельцем или группой-владельцем. Списки управления доступом — это компонент ядра Linux, который в настоящее время поддерживается ReiserFS, Ext2, Ext3, JFS и XFS. С помощью ACL сложные сценарии могут быть реализованы без использования сложных моделей привилегий на уровне приложения.
Если Вы хотите заменить Windows сервер на Linux сервер, то преимущества ACL очевидны. Некоторые из подключенных рабочих машин могут работать под Windows даже после миграции. ОС Linux предоставляет службы печати и доступа к файлам клиентам Windows посредством Samba. Поскольку Samba поддерживает списки управления доступом, привилегии пользователя могут быть установлены используя графический интерфейс как на сервере Linux, так и в Windows (только для Windows NT и более поздних). С помощью части пакета Samba winbindd, возможно также назначить привилегии пользователям существующим только в домене Windows и не имеющим аккаунта на сервере Linux.
Стандартная концепция привилегий POSIX использует три
класса пользователей для назначения привилегий
файловой системы: владелец, группа-владелец и другие пользователи. Три
бита доступа могут быть установлены для каждого класса пользователей
предоставляя доступ на чтение (r
), запись (w
) и выполнение
(x
).
Привилегии пользователя и группы для всех видов объектов файловой системы (файлов и директорий) определяются посредством ACL.
Дефолтные ACL могут применяться только к директориям. Они определяют привилегии, которые объект файловой системы наследует от родительской директории при создании.
Каждый список управления доступом состоит из набора записей ACL. Запись ACL содержит тип, описатель пользователя или группы, на который ссылается эта запись, и набор привилегий. Для некоторых типов записей описатель группы и пользователя не указывается.
Таблица 9.1, «Типы записей ACL» отражает 6 существующих типов записей ACL, каждый из которых определяет привилегии пользователя или группы пользователей. Запись владелец определяет привилегии владельца файла или директории. Запись группа-владелец определяет привилегии группы, владеющей файлом. Суперпользователь может сменить владельца или группу-владельца при помощи команд chown и chgrp, в случае чего владелец и группа-владелец будут ссылаться на нового владельца или группу-владельца. Каждая запись именованный пользователь определяет привилегии пользователя, указанного в поле "квалификатор" этой записи. Каждая запись именованная группа определяет привилегии группы, указанной в поле "квалификатор" этой записи. Поле "квалификатор" заполнено только для записей типа именованный пользователь и именованная группа. Запись другие определяет привилегии всех остальных пользователей.
Запись маска ограничивает привилегии именованного пользователя, именованной группы и группы-владельца определяя, какие разрешения этих записей будут применяться, а какие - маскироваться. Если право доступа существует в одной из этих записей и в маске, то оно применяется. Права, содержащиеся только в маске или только в записи не применяются, и доступ в этом случае не будет разрешен. Права владельца и группы-владельца применяются всегда. Таблица 9.2, «Маскировка привилегий доступа» демонстрирует этот механизм.
Существует два основных класса ACL: минимальный ACL — содержит записи типов «владелец», «группа-владелец» и «другие», соответствующие традиционным битам доступа для файлов и директорий. Расширеннный ACL более продвинут. Он должен содержать маску и может включать в себя несколько записей для именованных пользователей и именованных групп.
Таблица 9.1. Типы записей ACL¶
Тип |
Текстовая форма |
---|---|
владелец |
|
именованный пользователь |
|
группа-владелец |
|
именованная группа |
|
маска |
|
другие |
|
Таблица 9.2. Маскировка привилегий доступа¶
Тип записи |
Текстовая форма |
Привилегии |
---|---|---|
именованный пользователь |
|
|
маска |
|
|
эффективные привилегии: |
|
Рисунок 9.1, «Минимальный ACL: Сравнение записей ACL с битами доступа» и
Рисунок 9.2, «Расширенный ACL: Сравнение записей ACL с битами доступа» соответствуют минимальному и расширенному
ACL. На рисунках изображены три блока: левый показывает
тип спецификации записей ACL, центральный отображает пример ACL, и правый блок
соответствует битам доступа традиционной концепции привилегий (отображаемым, например,
командой ls -l
). В обоих случаях привилегии класса
владелец отображаются на запись ACL «владелец».
Привилегии класса другие отображаются на соответствующую
запись ACL. Однако отображение прав доступа класса группа
отличается для каждого из случаев.
В случае минимального ACL — без маски — права доступа группы отражаются на запись ACL группа-владелец, как показывает Рисунок 9.1, «Минимальный ACL: Сравнение записей ACL с битами доступа». В случае расширенного ACL— с маской — права доступа группы отображаются на маску, Рисунок 9.2, «Расширенный ACL: Сравнение записей ACL с битами доступа».
Это отображение используется для упрощения взаимодействия с приложениями, избавляя от небходимости поддержки ACL приложением. Привилегии доступа, назначенные посредством битов доступа, задают верхний предел для всех «тонких настроек», сделанных при помощи ACL. Изменение битов доступа отражается на ACL и наоборот.
Вы можете получить доступ к ACL с помощью команд getfacl и setfacl. Использование этих команд показано в следующем примере.
Перед созданием директории используйте команду umask,
чтобы задать биты доступа маскируемые при создании файлового объекта.
Команда umask 027
устанавливает
привилегии по умолчанию следующим образом: владелец получает полный доступ (0
),
группе запрещен доступ на запись (2
), доступ остальным пользователям
закрыт (7
). В действительности umask
маскирует соответствующие биты доступа или сбрасывает их. Подробности
можно узнать на man странице umask.
mkdir mydir создает директорию mydir
с привилегиями, установленными командой
umask. С помощью ls -dl
mydir
можно определить правильность установки привилегий.
Для данного примера вывод будет следующим:
drwxr-x--- ... tux project3 ... mydir
Используя getfacl mydir
, проверьте
исходное состояние ACL. Будет отображена следующая информация:
# file: mydir # owner: tux # group: project3 user::rwx group::r-x other::---
Первые три строки вывода отображают имя, владельца и группу-владельца директории. Следующие три строки содержат три записи ACL: «владелец», «группа-владелец» и «другие». Фактически мы имеет дело с минимальным ACL и команда getfacl не дает дополнительной информации по сравнению с командой ls.
Измените ACL, разрешив доступ на чтение, запись и выполнение пользователю
geeko
и группе mascots
командой:
setfacl -m user:geeko:rwx,group:mascots:rwx mydir
Опция -m
указывает setfacl
изменить существующий ACL. Следующий за ней аргумент определяет записи ACL,
которые будут изменены (можно указать несколько записей, разделяя из запятыми).
Последняя часть определяет имя директории, к которой будут применены эти изменения.
Используйте команду getfacl, чтобы узнать
полученные ACL.
# file: mydir # owner: tux # group: project3 user::rwx user:geeko:rwx group::r-x group:mascots:rwx mask::rwx other::---
В дополнение к записям, созданным для пользователя
geeko
и группы mascots
, была
добавлена запись с маской. Эта запись была создана автоматически,
таким образом, что все заданные права доступа будут применены. setfacl
автоматически адаптирует существующие записи с масками к изменяемым битам.
Это поведение можно изменить используя опцию -n
. Маска
определяет максимальные эффективные привилегии для класса «группа»,
включая именованного пользователя, именованную группу и группу-владельца.
Биты доступа класса «группа», отображаемые командой ls,
-dl mydir
теперь соответствуют записи маска
.
drwxrwx---+ ... tux project3 ... mydir
Первый столбец вывода теперь содержит дополнительно знак
+
, указывая на существование
расширенных ACL для этого элемента.
Согласно выводу команды ls, маска включает в себя доступ на запись.
Традиционно эти биты означали бы, что группа-владелец (project3
)
также имеет право на запись в директорию mydir
.
Однако эффективные права доступа соответствуют сочетанию прав
заданных для группы-владельца и маски — r-x
в нашем примере
(Таблица 9.2, «Маскировка привилегий доступа»).
Поэтому в отношении эффективных привилегий группы-владельца, даже после добавления дополнительных записей ACL,
ничего не изменилось.
Измените значение маски с помощью команд setfacl или
chmod. Например используйте chmod g-w
mydir
. ls -dl
mydir
покажет:
drwxr-x---+ ... tux project3 ... mydir
getfacl mydir
даст следующий
вывод:
# file: mydir # owner: tux # group: project3 user::rwx user:geeko:rwx # effective: r-x group::r-x group:mascots:rwx # effective: r-x mask::r-x other::---
После сброса бита доступа на запись для группы командой chmod,
вывода команды ls достаточно, чтобы увидеть, что биты маски
изменились: доступ на запись снова есть только у владельца mydir
.
Вывод getfacl подтверждает это. Он включает в себя комментарий
для всех записей, в которых биты доступа не соответствуют реальным привилегиям
из-за применения маски. Оригинальные права могут быть восстановлены в любое время командой
chmod g+w mydir
.
Директории могут иметь ACL по умолчанию, которые являются специальной разновидностью ACL, определяющей права доступа, наследуемые объектами в этой директории при их создании. ACL по умолчанию влияет на поддиректории и файлы.
Существует два пути передачи ACL по умолчанию файлам и поддиректориям:
Поддиректория наследует ACL родительской директории как свои ACL по умолчанию и обычные ACL.
Файл наследует ACL по умолчанию как свои ACL.
Все системные вызовы, создающие объекты файловой системы, используют
параметр режим
, который определяет режим доступа
к созданному объекту. Если родительская директория не имеет
ACL по умолчанию, заданные umask
биты доступа
вычитаются из битов доступа параметра режим
,
а результат устанавливается созданному объекту.
Если же ACL по умолчанию задан, биты доступа нового объекта
соответствуют совпадающим частям параметра режим
и разрешениям ACL по умолчанию.
В этом случае umask
не учитывается.
Следующие три примера показывают основные операции для директорий и ACL по умолчанию:
Добавить ACL по умолчанию существующей директории mydir
:
setfacl -d -m group:mascots:r-x mydir
Опция -d
команды setfacl
указывает setfacl выполнить изменения
(опция -m
) для ACL по умолчанию.
Взглянем поближе на результат выполнения этой команды:
getfacl mydir # file: mydir # owner: tux # group: project3 user::rwx user:geeko:rwx group::r-x group:mascots:rwx mask::rwx other::--- default:user::rwx default:group::r-x default:group:mascots:r-x default:mask::r-x default:other::---
getfacl возвращает как ACL, так и ACL по умолчанию.
ACL по умолчанию соответствуют строкам, начинающимся с
default
. Несмотря на то, что Вы передали команде
setfacl только запись ACL по умолчанию для группы
mascots
, setfacl
автоматически скопировала все остальные записи из ACL, чтобы создать
валидный ACL по умолчанию. ACL по умолчанию не
оказывают моментального влияния на доступ к объекту. Они вступают в игру
при создании новых объектов. Эти новые объекты наследуют привилегии
только от ACL по умолчанию своей родительской директории.
В следующем примере используйте команду mkdir, чтобы
создать в mydir
поддиректорию, которая унаследует
ACL по умолчанию.
mkdir mydir/mysubdir getfacl mydir/mysubdir # file: mydir/mysubdir # owner: tux # group: project3 user::rwx group::r-x group:mascots:r-x mask::r-x other::--- default:user::rwx default:group::r-x default:group:mascots:r-x default:mask::r-x default:other::---
Как и ожидалось, вновь созданная директория
mysubdir
получила права доступа из
ACL по умолчанию родительской директории. ACL директории mysubdir
является точным отражением ACL по умолчанию директории mydir
.
Поддиректория передаст эти права вложенным в нее объектам и т.д.
Используйте touch для создания файла в
директории mydir
, например, touch
mydir/myfile
. ls -l
mydir/myfile
покажет:
-rw-r-----+ ... tux project3 ... mydir/myfile
Вывод getfacl
mydir/myfile
:
# file: mydir/myfile # owner: tux # group: project3 user::rw- group::r-x # effective:r-- group:mascots:r-x # effective:r-- mask::r-- other::---
Если ACL по умолчанию и umask не накладывают никаких ограничений,
touch при создании новых файлов использует режим
со значением 0666
, создавая файлы с доступом на
чтение и запись для всех (Раздел 9.4.3.1, «Действия ACL по умолчанию»). Также
это означает, что все права доступа, которые не содержит
значение режим
будут удалены из соответствующих записей ACL.
Несмотря на то, что записи для группы не были удалены из ACL, значение маски было
модифицировано для маскировки прав не заданных значением режим
.
Эта модель необходима для правильного взаимодействия приложений (например, компиляторов) с ACL. Вы можете создавать файлы с ограниченным доступом и затем помечать их как исполняемые. Механизм mask гарантирует, что только корректные пользователи и группы смогут запускать их как им заблагорассудится.
Алгоритм проверки применяется перед тем, как любому процессу или приложению будет предоставлен доступ к защищенному ACL объекту файловой системы. Основное правило проверки заключается в том, что записи ACL проверяются в следующем порядке: владелец, именованный пользователь, группа-владелец или именованная группа, другие пользователи. Доступ предоставляется в соответствии с записью, которая более подходит процессу. Привилегии не накапливаются.
Все усложняется, если процесс принадлежит более чем к одной группе и потенциально соответствует нескольким групповым записям. В этом случае из множества выбирается произвольная запись с требуемыми привилегиями. Неважно, какая из записей приведет к результату «доступ разрешен». Аналогично, если ни одна из групповых записей не содержит требуемых привилегий, случайно выбранная запись приведет к конечному результату «доступ запрещен».
ACL могут быть использованы для реализации очень сложных моделей привилегий, которые соответствуют требованиям современных приложений. Традиционная система привилегий и ACL могут эффективно сочетаться. Основные файловые команды (cp, mv, ls, и т.д.) поддерживают ACL, равно как Samba и Konqueror.
К сожалению множество редакторов и файловых менеджеров до сих пор не поддерживает ACL. Например, копирование файлов с помощью Emacs приводит к потере ACL. При изменении файлов в редакторе ACL иногда сохраняются, а иногда нет, в зависимости от того способа, которым редактор создает резервные копии. Если редактор записывает изменения в оригинальный файл, ACL сохраняются. Если измененное содержание сохраняется в новый файл, который впоследствии получает имя оригинального файла, и сам редактор не поддерживает ACL, они могут быть потеряны. За исключением архиватора star в настоящее время не существует программ резервного копирования, сохраняющих ACL.
За подробной информацией об ACL обращайтесь в справку по командам getfacl(1), acl(5) и setfacl(1).