Новые файлы получают разные группы: настраиваем setgid каталога

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

Проверить группу каталога

ls -ld /srv/build-results
id alice
id bob
stat -c '%n %U %G %a' /srv/build-results/sample.txt

Нужно выяснить три вещи: группа самого каталога, членство пользователей и группа новых файлов. Например, каталог принадлежит buildteam, оба инженера входят в неё, но sample.txt получает группу alice. Это указывает на отсутствие нужного правила наследования группы.

Установить правило

chgrp buildteam /srv/build-results
chmod 2770 /srv/build-results
ls -ld /srv/build-results

Пример относится к заранее выделенному общему каталогу. Цифра 2 добавляет setgid к режиму 770. В ls вместо группового x появится s; большая S означала бы, что setgid есть, но группового права прохода нет. Для новых файлов Linux наследует группу каталога, а для новых подкаталогов также сохраняет setgid. Детали специальных битов — в chmod(2).

Setgid не выдаёт запись автоматически. Он выбирает группу нового объекта. Если приложение создаёт файл 0600, участники buildteam по-прежнему не смогут его читать. Поэтому после настройки группы проверяют режим создания или default ACL. Это отдельные части контракта: кому принадлежит файл и что этим людям разрешено.

Проверить два независимых создания

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

Например, после изменения оба файла имеют buildteam, но режим 0640. Групповое чтение работает, запись отсутствует. Это уже не ошибка setgid; нужно согласовать групповую запись и безопасный режим приложения. Если файл переехал в папку через rename в пределах файловой системы, прежняя группа могла сохраниться: перемещение не равно созданию.

Избежать побочных изменений

Не делайте chmod -R 2770 по дереву с исполняемыми файлами и документами. Setgid имеет иной смысл для обычных исполняемых файлов; массовая одинаковая установка смешивает разные объекты. Работайте с каталогами и файлами раздельно, сначала на небольшой выборке.

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

Сделать правило воспроизводимым

Запишите требуемую группу, режим каталога и ожидаемые права новых результатов в инструкции развёртывания. Откройте программу Linux и Bash для DevOps-инженеров: работа с файловой системой, группами и настройкой сервисного пользователя помогает закрепить такой порядок в окружении приложения.

Ещё по теме

Продолжить на практике

  • Linux и Bash для DevOps-инженеров ↗

    Linux для работы с серверами: процессы, права, systemd, сеть, диски и логи. Автоматизируйте повседневные задачи на Bash и разберите типичные сбои сервиса — от занятого порта до переполненного диска.