1. Администрирование пользователей и расширенное управление правами доступа через ACL
Администрирование пользователей и расширенное управление правами доступа через ACL
Возникает классическая задача: файлом financial_report.csv владеет пользователь alice и группа finance. Необходимо дать пользователю bob (из отдела аудита) право на чтение и запись, а пользователю charlie (из отдела аналитики) — только на чтение. При этом остальные сотрудники не должны видеть файл вообще. В рамках стандартной модели POSIX (User, Group, Other) эта задача не имеет элегантного решения. Придется либо создавать новую синтетическую группу audit_analytics, добавлять туда обоих пользователей и давать группе максимальные права (что нарушает принцип наименьших привилегий для charlie), либо делать файл доступным для всех. Стандартная триада прав слишком груба для современных кросс-функциональных команд.
Продвинутое управление жизненным циклом пользователей
Прежде чем переходить к тонкой настройке доступа к файлам, необходимо обеспечить строгий контроль над самими субъектами доступа — учетными записями. Профессиональное администрирование выходит далеко за рамки утилиты useradd.
Ловушки модификации групп
Самая частая ошибка при управлении доступом — некорректное использование команды usermod при добавлении пользователя в дополнительные группы. Команда usermod -G docker,wheel bob не просто добавит пользователя bob в эти две группы; она исключит его из всех остальных дополнительных групп, в которых он состоял ранее. Опция -G перезаписывает список.
Для безопасного добавления всегда используется связка с опцией append: usermod -aG docker,wheel bob.
Однако изменения членства в группах не применяются к текущим сессиям пользователя. Если bob уже залогинен по SSH, он не получит прав группы docker до перевхода. В скриптах автоматизации или при срочной необходимости применить права без разрыва сессии используется команда newgrp docker, которая запускает новый экземпляр оболочки с обновленным эффективным идентификатором группы.
Глубокая настройка политик паролей и старения аккаунтов
Файл /etc/shadow хранит не только хеши паролей, но и параметры их жизненного цикла (password aging). Прямое редактирование этого файла недопустимо, для управления используется утилита chage.
Рассмотрим сценарий онбординга временного подрядчика. Ему выдается временный пароль, который он обязан сменить при первом входе, а сам аккаунт должен автоматически заблокироваться через три месяца.
Важное отличие: блокировка пароля (usermod -L или установка ! в хеше /etc/shadow) предотвращает вход только по паролю. Если у пользователя настроен доступ по SSH-ключам, он сможет войти в систему. Для полной изоляции скомпрометированного аккаунта необходимо изменить его оболочку на /usr/sbin/nologin или /bin/false:
Архитектура и синтаксис Access Control Lists (ACL)
Когда возможностей стандартных групп не хватает, на помощь приходят списки контроля доступа — POSIX ACL. Они позволяют назначать индивидуальные права для любого количества пользователей и групп на один файловый объект.
!Структура прав: UGO против ACL
Современные файловые системы (ext4, XFS, Btrfs) поддерживают ACL по умолчанию. Если функция отключена, раздел монтируется с флагом acl в /etc/fstab.
Наличие расширенных прав у файла отображается знаком + в конце строки разрешений при выводе ls -l:
-rw-rwxr--+ 1 alice finance 1024 Oct 24 10:00 financial_report.csv
Чтение и запись списков доступа
Для просмотра списков используется getfacl. Вывод команды структурирован и показывает владельца, группу и детальный список разрешений:
Добавление или модификация правил выполняется утилитой setfacl с ключом -m (modify). Вернемся к задаче из начала статьи. Чтобы дать bob права на чтение и запись, а charlie — только на чтение, выполняется следующая команда:
Синтаксис записи u:имя:права (для пользователя) или g:имя:права (для группы) позволяет объединять несколько правил через запятую. Если нужно отозвать права у конкретного пользователя, используется ключ -x (extract):
Для полного удаления всех расширенных ACL-записей и возврата файла к базовой UGO-модели применяется ключ -b (base): setfacl -b financial_report.csv.
Маска ACL: скрытый механизм ограничения прав
Самый неочевидный и часто вызывающий ошибки элемент ACL — это маска (mask::). Маска определяет максимально допустимые эффективные права для всех пользователей, указанных в ACL, а также для владеющей группы (но не для владельца файла и не для категории other).
!Влияние маски на эффективные права
Допустим, мы дали пользователю bob права rwx через ACL. Но если маска установлена в значение r--, эффективные права bob будут ограничены только чтением. Утилита getfacl заботливо предупреждает об этом комментарием #effective:
Конфликт ACL и классического chmod
Здесь кроется главная архитектурная особенность POSIX ACL: когда на файле установлены ACL, классическая команда chmod изменяет не права владеющей группы, а маску ACL.
Если системный администратор, не проверив наличие ACL (не заметив плюс в ls -l), попытается забрать права на запись у группы с помощью chmod g-w file, он на самом деле изменит маску на r-x или r--. Это мгновенно «обрежет» эффективные права всех пользователей, добавленных через setfacl, даже если в их персональных записях стоит rw.
Чтобы изменить маску целенаправленно, используется тот же setfacl:
Маска автоматически пересчитывается (объединяя все выданные права) при каждом добавлении нового правила через setfacl -m. Если вы хотите добавить правило, но запретить пересчет маски, используйте флаг -n (no-mask).
Наследование прав: Default ACL для директорий
В корпоративной среде часто требуется создать общую директорию (Share), где все файлы, создаваемые одним участником команды, автоматически становятся доступны другим участникам с нужными правами. Стандартный механизм umask здесь не поможет, так как он глобален для сессии пользователя и не привязан к конкретной директории. Кроме того, setgid бит на директории решает проблему только с наследованием группы, но не гарантирует нужных прав доступа (например, rw).
Для решения этой задачи используются Default ACL. Они применяются только к директориям и определяют, какие ACL будут автоматически назначены любым новым файлам и поддиректориям, созданным внутри.
!Наследование прав через Default ACL
Создадим общую директорию для разработчиков и тестировщиков. Разработчики должны иметь полные права на все новые файлы, а тестировщики — права на чтение и исполнение.
Флаг -d означает default. Теперь при просмотре getfacl мы увидим два блока:
Если пользователь alice создаст файл внутри /data/project_x, этот файл автоматически получит базовые права и списки доступа из секции default. При этом система умно учитывает контекст: если создается обычный текстовый файл (без бита исполнения при создании), то права x из default ACL будут проигнорированы для файла, но сохранены для создаваемых поддиректорий.
Важный нюанс: Default ACL не применяются ретроспективно. Если в директории уже были файлы до выполнения setfacl -d, их права не изменятся. Для рекурсивного применения обычных ACL к существующим файлам используется флаг -R:
Обратите внимание на заглавную букву X в правах. Это специальный флаг, который означает: «установить бит исполнения только для директорий, а также для файлов, у которых уже установлен бит исполнения хотя бы для одной категории пользователей». Это предотвращает случайное превращение всех текстовых логов в исполняемые скрипты при рекурсивном обходе.
Интеграция ACL с утилитами резервного копирования и синхронизации
Экспертное владение командной строкой подразумевает понимание того, как сложные структуры данных ведут себя при перемещении. Обычный перенос файлов может уничтожить тщательно выстроенную архитектуру ACL.
Стандартная утилита cp по умолчанию не копирует расширенные атрибуты и ACL. Для их сохранения необходимо использовать флаг -a (archive) или явно указывать --preserve=acl.
Утилита tar, являющаяся стандартом де-факто для архивации логов и конфигураций, исторически игнорировала ACL. В современных версиях GNU tar необходимо явно передавать флаг --acls как при создании архива, так и при его распаковке:
При синхронизации данных через сеть с помощью rsync, который часто используется для миграции серверов, флаг -a (archive) не включает в себя сохранение ACL. Это частая причина инцидентов после миграции. Для синхронизации списков доступа требуется отдельный флаг -A (--acls):
Массовое резервное копирование и восстановление ACL
В случае миграции файловых систем или восстановления после сбоя, когда сами файлы целы, но метаданные повреждены (например, при случайном chmod -R 777 /), можно восстановить только структуру прав.
Утилита getfacl умеет генерировать дамп прав в формате, который понимает setfacl.
Создание дампа всех прав в директории:
В этом текстовом файле сохраняются абсолютные или относительные пути к каждому файлу и его точный слепок ACL. Если произошла авария, восстановить права можно одной командой:
Этот метод работает значительно быстрее, чем восстановление самих файлов из бэкапа, и является обязательным шагом перед выполнением потенциально опасных массовых операций с правами доступа на production-серверах.
Управление доступом в Linux — это баланс между безопасностью и удобством совместной работы. Переход от жесткой триады UGO к гибким спискам ACL требует понимания механизмов маскирования и наследования. Игнорирование этих нюансов приводит к ситуации, когда права либо слишком избыточны, создавая уязвимости, либо непредсказуемо блокируют легитимные процессы при малейшем изменении базовых атрибутов файлов.