Как установить бит setgid для программы, чтобы она могла изменять свою групповую папку?

Предпосылки несколько сложны, поэтому вот контекст:

  • Есть программа, которая запускается через сценарий оболочки;
  • Сценарий оболочки запускает программу через . jar файл;
  • Я хочу, чтобы эта программа хранила свой кэш в /var/opt/ подпапке, скажем /var/opt/program/;
  • Содержимое кэша не должно быть доступно напрямую, только через программу
  • Программа должна быть доступна для всех локальных пользователей в системе

Основная идея, с которой я пришел, это создать группу, которая имеет все необходимые разрешения на чтение и редактирование содержимого папки кэша. Я не хочу добавлять пользователей в группу вручную, поэтому искал альтернативные варианты. Если я правильно понимаю, setgid bit должен мне идеально подойти. Я понимаю так:

  • Папка с установленным битом setgid заставляет все ее содержимое иметь ту же группу владельцев, что и у папки, и заставляет все ее вложенные папки следовать тем же правилам. При этом она не предоставляет никаких дополнительных разрешений для тех, кто не входит в группу владельцев папки, то есть папка с маской drwxrws--x не позволяет другим редактировать и читать ее содержимое.
  • Программа с установленным битом setgid всегда запускается от имени группы владельцев, позволяя пользователям выполнять действия с соблюдением групповых разрешений.

Мои шаги следующие:

  • Я создал группу mygroup;
  • Я создал папку /var/opt/program/ и установил ее группу владельца mygroup;
  • Я установил setgid bit для папки
  • Я установил группу владельца скриптов программных оболочек mygroup;
  • Я установил setgid bit для сценария оболочки

Проблема в том, что программа не может создавать и редактировать файлы в папке cache, будучи запущенной пользователем без прав root. Любой совет будет оценен по достоинству.

UPD Environment:

OS: Ubuntu 16.04.2 LTS

0
16.06.2017, 23:28
2 ответа
  • A folder with the setgid bit set force all its content to have the same owner group as the folder

Ага. Вновь созданные файлы получают группу каталога, группу файла можно, конечно, впоследствии изменить.(Мы называем их каталогами, а не папками.)

  • A program with the setgid bit set always run on behalf of the owner group

Ага. Хотя вам не нужен setgid в каталоге, если вы создаете файлы только через двоичный файл setgid. Программа setgid получает рассматриваемую группу в качестве основной группы, поэтому любые создаваемые ею файлы по умолчанию принадлежат этой группе (, а не группе вызывающего пользователя ).

  • I set setgid bit for the shell script

Это та часть, которая не работает. Большинство систем не учитывают биты setuid и setgid в интерпретируемых скриптах , так как это легко приводит к ряду проблем с безопасностью.

Что вам нужно сделать, так это написать программу-оболочку на C, которая выполняет скрипт, и сделать эту оболочку setgid; или (предпочтительно )используйте что-то вроде sudo, чтобы позволить вашим пользователям запускать скрипт с правами другой группы.(sudoуже имеет дело с такими вещами, как очистка переменных окружения, которые могут быть проблематичными. )В обоих случаях убедитесь, что скрипт и его интерпретатор находятся в каталогах, которые пользователи не могут изменять.

Для sudoтребуемая конфигурация (в/etc/sudoers)будет примерно такой:

username ALL=(:privgroup) /path/to/script

Это позволит пользователю usernameзапускать /path/to/scriptкак группу privgroup. Вы можете использовать %groupnameвместо username, чтобы позволить всем членам groupnameзапускать скрипт. Пользователям нужно будет запустить сценарий, используя sudo -g privgroup /path/to/script, потому что sudoпо умолчанию пытается запустить указанную команду как root, а мы этого не разрешили. Но вы можете написать оболочку для этой команды.

2
28.01.2020, 02:33

Большинство операционных систем игнорируют setgid в сценариях. Каталог /var/opt/program должен быть доступен для групповой записи так же, как и setgid. ls -ld /var/opt/program должен вывести что-то вроде drwxrwsr-x 159 root mygroup 5406 15 июня 10:25 /var/opt/program. Любой обычный (не root) пользователь, которому необходимо запустить программу, должен иметь mygroup в качестве дополнительной группы. Добавьте их, используя usermod с помощью команды, аналогичной usermod -a -G mygroup LOGIN для каждого пользователя, заменив LOGIN на их имя пользователя. Или отредактируйте /etc/group и добавьте строку с mygroup со списком этих пользователей через запятую. Пример: mygroup:x:5000:joe,frank,ellen,mark, где пользователи joe, frank, ellen и mark будут выполнять этот скрипт.

0
28.01.2020, 02:33

Теги

Похожие вопросы