От rwx до ACL. Как в Unix-системах правильно назначать права чтения, записи и исполнения файлов и директорий

16.03.2020
От rwx до ACL. Как в Unix-системах правильно назначать права чтения, записи и исполнения файлов и директорий

Есть права, которые не могут присвоить или отнять ни судьи, ни законодатели. А вот системные администраторы могут. Это права доступа к файлам и директориям. И порой от их правильного назначения зависит больше, чем от решений юристов и прокуроров. О тонкостях правовой политики в Unix-подобных системах на IT-пятнице №19 рассказал Александр Майоров, руководитель отдела расширенного администрирования и поддержки ключевых клиентов hoster.by.


Основные права доступа к файлам

В Unix-подобных системах есть три вида доступа к файлам: read, write, eXecute (чтение, запись, выполнение). Отсюда и символьное (текстовое) обозначение “rwx”. Но эти права не имели бы никакого смысла, если бы применялись ко всем пользователям сразу. Поэтому каждый файл имеет три группы пользователей, для которых мы можем применить разные сочетания прав. Это User, Group, Other.

Права доступа к файлам и директориям можно задать в восьмеричной (самый распространённый вариант), текстовой и бинарной системах.

Варианты записи прав пользователей

Специальные права доступа к файлам

В Unix-подобных системах кроме перечисленных есть ещё три бита доступа: SetUID, SetGID, Sticky-bit. Они задаются самыми первыми тремя битами, и могут наделять пользователей нетипичными правами.

SetUID — с этим битом все бинарные файлы будут исполняться под маской владельца. Это позволяет обычным пользователям запускать программы от имени владельца файла или суперпользователя, с root-доступом.

SetGID — пользователь с такими правами считается членом группы, с которой связан файл, а не группа, к которым он действительно принадлежит. Если SetGID-флаг установлен на каталог, то все файлы, созданные в нём, будут связаны с группой каталога, а не пользователя. Такое поведение используется для организации общих папок.

Sticky-bit — с помощью этого флага можно создавать общие директории с файлами совместного доступа. Если он установлен, то пользователи могут создавать, читать и выполнять, но не вправе удалять файлы, принадлежащие другим пользователям.

В ОС Centos в директории /usr/bin можно найти несколько бинарных файлов с директориями SetUID и SetGID. Это ./umount, ./passwd, ./chage, ./pkexec, ./newgrp, ./chsh, ./ssh-agent и пр.

Со временем основных и специальных прав доступа стало недостаточно — так появились специальные атрибуты файлов. В текущих файловых системах они включены по умолчанию. Самый очевидный пример — защита от удаления файла администратором. С ней даже root-пользователь не сможет удалить критически важную директорию.

Существует две команды для управления атрибутами файла: lsattr и chattr. lsattr служит для просмотра атрибутов, а chattr — для их изменения. Атрибуты могут быть установлены только для каталогов и обыкновенных файлов.

Команда chattr работает с тремя операторами:

• оператор “+” добавляет указанные атрибуты к существующим;

• оператор “-” снимает атрибуты;

• оператор “=” устанавливает файлам только эти атрибуты.

Так, защиту от случайного удаления можно установить командой chattr +I file.txt. По директории стоит пройтись рекурсивно, чтобы все файлы в ней были защищены.

Вот несколько примеров расширенных атрибутов.

A (no atime updates) — не изменяет время последнего обращения, что может благоприятно повлиять на производительность файловой системы, если обращения происходят очень часто.

a (append only) — в файл можно только дописывать, но нельзя удалять и переименовывать (удобно для логов). Если установлено на каталог, то находящиеся в нём файлы нельзя удалять, но можно модифицировать их и создавать новые.

S (synchronous updates) — прямая запись на диск без кэширования.

i (immutable) — запрещает любые изменения файла (нельзя удалять, переименовывать и модифицировать). Если флаг стоит на директории, вы сможете только модифицировать существующие файлы.

Вот расширенный мануал по правам доступа от Linux.

Access Control List (ACL)

ACL — это система управления правами доступа, основанная на так называемых списках контроля доступа. Она дополняет стандартные права доступа. ACL могут вводить новые права или отменять существующие. Это удобно, когда над файлом или директорией работает сразу несколько человек, но по группам они не пересекаются по политике безопасности. ACL точечно даёт им нужные права, но все групповые возможности на них не распространяются.

Управлять ACL можно всего двумя командами:

setfacl — назначить, модифицировать или удалить ACL.

getfacl — просмотреть установленные ACL.

Допустим, у нас есть три пользователя: alex (создатель файла), linda и mike. Пользователь alex создал файл secret.txt в директории tmp/. Нам нужно дать права на чтение и изменение этого файла пользователю linda. При помощи ACL мы можем задать следующее правило:

setfacl -m u:linda:rw secret.txt

getfacl secret.txt

Теперь файлом кроме его создателя может управлять и второй пользователь, linda.

Точно так же мы можем поступить в отношении групп. Например, нам нужно дать права на чтение и запись пользователям двух групп. И хотя по умолчанию мы можем работать только с одной группой, со списками контроля доступа можно задавать любое количество групп, не ломая логику выдачи прав пользователям. Так мы не создаём несколько смежных групп, а устанавливаем одно или несколько правил ACL.

Для директорий обычно используется команда default ACL. Все файлы, созданные внутри таких директорий, будут наследовать права доступа указанные в default ACL.

Если пользователь состоит в двух группах, и в них через default ACL установлены разные права, результат будет зависеть от объекта, к которому применяются настройки. Когда на один объект через ACL пытаются наложить несколько групп, маски накладываются инкрементацией: исполнится команда с наименьшим значением.

Umask: как он считается на самом деле?

Umask (от англ. user file creation mode mask) — маска режима создания пользовательских файлов). Это функция среды POSIX, изменяющая права доступа, которые присваиваются новым файлам и каталогам по умолчанию. Маска применяется во всех процессах, где есть работа с директориями.

По сути, Umask — это бит блокировки для будущих файлов, которые будут созданы. В зависимости от того, какой бит блокировки накладывается сейчас, мы получим те или иные права на файлах в будущем. Umask считается через XOR (исключающее “или”). XOR — это операция, которая принимает значение “истина”, только если всего один из аргументов имеет значение “истина”.

В восьмеричной системе максимальные права, прописанные в Umask, выглядят так:

666 — для файлов (чтение, запись);

777 — для директорий (чтение, запись, исполнение).

Но в маске должно быть четыре числа, чтобы она работала корректно. Полные права на файл и директорию выглядит вот так 0777, т.е. первое число устанавливает SetUID, SetGUID или Sticky-bit.

При разных битах XOR получает значение “1”. При одинаковых — “0”

А вот как это работает для прав доступа к файлам.

Вот как считается Umask для файлов

Для изменения Umask есть два основных варианта:

1. /etc/profile — глобально для всех пользователей.

2. .profile — для индивидуальных пользователей.