Глава 9. Списки управления доступом в Linux

Содержание

9.1. Традиционные файловые привилегии
9.2. Преимущества ACL
9.3. Определения
9.4. Работа с ACL
9.5. Поддержка ACL приложениями
9.6. Дополнительная информация

Аннотация

POSIX ACLs (access control lists - списки управления доступом) могут быть использованы как расширение традиционной концепции привилегий для объектов файловой системы. С помощью ACL привилегии могут быть установлены более гибко, чем при помощи традиционной концепции битов доступа.

Термин POSIX ACL предполагает, что это настоящий стандарт POSIX (portable operating system interface - переносимый интерфейс операционных систем). Соответствующие черновые стандарты POSIX 1003.1e и POSIX 1003.2c были исключены по ряду причин. Тем не менее, ACLs (в том виде, в котором они реализованы во многих системах, принадлежащих семейству UNIX) основаны на этих черновиках. Реализация ACL для файловой системы (описанная в этой главе) также следует этим двум стандартам.

9.1. Традиционные файловые привилегии

Вы можете найти подробную информацию о традиционных файловых привилегиях на Info странице пакета GNU Coreutils, секция File permissions (info coreutils "File permissions"). Существуют также дополнительные аттрибуты setuid, setgid, sticky bit.

9.1.1. Бит setuid

В некоторых ситуациях привилегии доступа могут быть слишком строгими. Поэтому в 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.

9.1.2. Бит setgid

Бит setuid применяется к пользователям. Однако существует аналогичное свойство для групп: бит setgid. Если этот бит установлен для программы, то программа будет использовать при работе идентификатор собственной группы, вне зависимости от того, какой пользователь ее запустил. В директории с установленным битом setgid, все вновь созданные поддиректории и файлы будут принадлежать к той же группе, к которой принадлежит директория. Рассмотрим следующую директорию:

drwxrws--- 2 tux archive 48 Nov 19 17:12  backup

Вы видите s, что указывает на установленный бит setgid для привилегий группы. Владелец директории и члены группы archive будут иметь доступ к этой директории. Пользователи, не принадлежащие к этой группе, «отразятся» на нее. Эффективным идентификатором группы для для всех записанных в директорию файлов будет archive. Например, программе резервного копирования, работающей с идентификатором группы archive, не понадобятся привилегии суперпользователя для доступа к этой директории.

9.1.3. Sticky Bit

Существует также sticky bit. Его поведение отличается для файлов и директорий. Если он установлен для исполняемого файла, то соответствующая программа не будет выгружаться из оперативной памяти, чтобы избежать повторной загрузки с жесткого диска. Поскольку современные жесткие диски достаточно производительны, используется это редко. Если этот бит установлен для директории, пользователи не смогут удалять из нее чужие файлы. Типичными примерами являются директории /tmp и /var/tmp:

drwxrwxrwt 2 root root 1160 2002-11-19 17:15 /tmp

9.2. Преимущества ACL

Традиционно в 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.

9.3. Определения

Класс пользователя

Стандартная концепция привилегий POSIX использует три класса пользователей для назначения привилегий файловой системы: владелец, группа-владелец и другие пользователи. Три бита доступа могут быть установлены для каждого класса пользователей предоставляя доступ на чтение (r), запись (w) и выполнение (x).

ACL

Привилегии пользователя и группы для всех видов объектов файловой системы (файлов и директорий) определяются посредством ACL.

ACL по умолчанию

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

Запись ACL

Каждый список управления доступом состоит из набора записей ACL. Запись ACL содержит тип, описатель пользователя или группы, на который ссылается эта запись, и набор привилегий. Для некоторых типов записей описатель группы и пользователя не указывается.

9.4. Работа с ACL

Таблица 9.1, «Типы записей ACL» отражает 6 существующих типов записей ACL, каждый из которых определяет привилегии пользователя или группы пользователей. Запись владелец определяет привилегии владельца файла или директории. Запись группа-владелец определяет привилегии группы, владеющей файлом. Суперпользователь может сменить владельца или группу-владельца при помощи команд chown и chgrp, в случае чего владелец и группа-владелец будут ссылаться на нового владельца или группу-владельца. Каждая запись именованный пользователь определяет привилегии пользователя, указанного в поле "квалификатор" этой записи. Каждая запись именованная группа определяет привилегии группы, указанной в поле "квалификатор" этой записи. Поле "квалификатор" заполнено только для записей типа именованный пользователь и именованная группа. Запись другие определяет привилегии всех остальных пользователей.

Запись маска ограничивает привилегии именованного пользователя, именованной группы и группы-владельца определяя, какие разрешения этих записей будут применяться, а какие - маскироваться. Если право доступа существует в одной из этих записей и в маске, то оно применяется. Права, содержащиеся только в маске или только в записи не применяются, и доступ в этом случае не будет разрешен. Права владельца и группы-владельца применяются всегда. Таблица 9.2, «Маскировка привилегий доступа» демонстрирует этот механизм.

Существует два основных класса ACL: минимальный ACL — содержит записи типов «владелец», «группа-владелец» и «другие», соответствующие традиционным битам доступа для файлов и директорий. Расширеннный ACL более продвинут. Он должен содержать маску и может включать в себя несколько записей для именованных пользователей и именованных групп.

Таблица 9.1. Типы записей ACL

Тип

Текстовая форма

владелец

user::rwx

именованный пользователь

user:name:rwx

группа-владелец

group::rwx

именованная группа

group:name:rwx

маска

mask::rwx

другие

other::rwx


Таблица 9.2. Маскировка привилегий доступа

Тип записи

Текстовая форма

Привилегии

именованный пользователь

user:geeko:r-x

r-x

маска

mask::rw-

rw-

эффективные привилегии:

r--


9.4.1. Записи ACL и биты доступа

Рисунок 9.1, «Минимальный ACL: Сравнение записей ACL с битами доступа» и Рисунок 9.2, «Расширенный ACL: Сравнение записей ACL с битами доступа» соответствуют минимальному и расширенному ACL. На рисунках изображены три блока: левый показывает тип спецификации записей ACL, центральный отображает пример ACL, и правый блок соответствует битам доступа традиционной концепции привилегий (отображаемым, например, командой ls -l). В обоих случаях привилегии класса владелец отображаются на запись ACL «владелец». Привилегии класса другие отображаются на соответствующую запись ACL. Однако отображение прав доступа класса группа отличается для каждого из случаев.

Рисунок 9.1. Минимальный ACL: Сравнение записей ACL с битами доступа

Минимальный ACL: Сравнение записей ACL с битами доступа

В случае минимального ACL — без маски — права доступа группы отражаются на запись ACL группа-владелец, как показывает Рисунок 9.1, «Минимальный ACL: Сравнение записей ACL с битами доступа». В случае расширенного ACL— с маской — права доступа группы отображаются на маску, Рисунок 9.2, «Расширенный ACL: Сравнение записей ACL с битами доступа».

Рисунок 9.2. Расширенный ACL: Сравнение записей ACL с битами доступа

Расширенный ACL: Сравнение записей ACL с битами доступа

Это отображение используется для упрощения взаимодействия с приложениями, избавляя от небходимости поддержки ACL приложением. Привилегии доступа, назначенные посредством битов доступа, задают верхний предел для всех «тонких настроек», сделанных при помощи ACL. Изменение битов доступа отражается на ACL и наоборот.

9.4.2. Директория с 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.

9.4.3. Директория с ACL по умолчанию

Директории могут иметь ACL по умолчанию, которые являются специальной разновидностью ACL, определяющей права доступа, наследуемые объектами в этой директории при их создании. ACL по умолчанию влияет на поддиректории и файлы.

9.4.3.1. Действия ACL по умолчанию

Существует два пути передачи ACL по умолчанию файлам и поддиректориям:

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

  • Файл наследует ACL по умолчанию как свои ACL.

Все системные вызовы, создающие объекты файловой системы, используют параметр режим, который определяет режим доступа к созданному объекту. Если родительская директория не имеет ACL по умолчанию, заданные umask биты доступа вычитаются из битов доступа параметра режим, а результат устанавливается созданному объекту. Если же ACL по умолчанию задан, биты доступа нового объекта соответствуют совпадающим частям параметра режим и разрешениям ACL по умолчанию. В этом случае umask не учитывается.

9.4.3.2. Применение ACL по умолчанию

Следующие три примера показывают основные операции для директорий и ACL по умолчанию:

  1. Добавить 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 по умолчанию своей родительской директории.

  2. В следующем примере используйте команду 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. Поддиректория передаст эти права вложенным в нее объектам и т.д.

  3. Используйте 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 гарантирует, что только корректные пользователи и группы смогут запускать их как им заблагорассудится.

9.4.4. Алгоритм проверки ACL

Алгоритм проверки применяется перед тем, как любому процессу или приложению будет предоставлен доступ к защищенному ACL объекту файловой системы. Основное правило проверки заключается в том, что записи ACL проверяются в следующем порядке: владелец, именованный пользователь, группа-владелец или именованная группа, другие пользователи. Доступ предоставляется в соответствии с записью, которая более подходит процессу. Привилегии не накапливаются.

Все усложняется, если процесс принадлежит более чем к одной группе и потенциально соответствует нескольким групповым записям. В этом случае из множества выбирается произвольная запись с требуемыми привилегиями. Неважно, какая из записей приведет к результату «доступ разрешен». Аналогично, если ни одна из групповых записей не содержит требуемых привилегий, случайно выбранная запись приведет к конечному результату «доступ запрещен».

9.5. Поддержка ACL приложениями

ACL могут быть использованы для реализации очень сложных моделей привилегий, которые соответствуют требованиям современных приложений. Традиционная система привилегий и ACL могут эффективно сочетаться. Основные файловые команды (cp, mv, ls, и т.д.) поддерживают ACL, равно как Samba и Konqueror.

К сожалению множество редакторов и файловых менеджеров до сих пор не поддерживает ACL. Например, копирование файлов с помощью Emacs приводит к потере ACL. При изменении файлов в редакторе ACL иногда сохраняются, а иногда нет, в зависимости от того способа, которым редактор создает резервные копии. Если редактор записывает изменения в оригинальный файл, ACL сохраняются. Если измененное содержание сохраняется в новый файл, который впоследствии получает имя оригинального файла, и сам редактор не поддерживает ACL, они могут быть потеряны. За исключением архиватора star в настоящее время не существует программ резервного копирования, сохраняющих ACL.

9.6. Дополнительная информация

За подробной информацией об ACL обращайтесь в справку по командам getfacl(1), acl(5) и setfacl(1).