Предпосылки несколько сложны, поэтому вот контекст:
/var/opt/
подпапке, скажем /var/opt/program/
;Основная идея, с которой я пришел, это создать группу, которая имеет все необходимые разрешения на чтение и редактирование содержимого папки кэша. Я не хочу добавлять пользователей в группу вручную, поэтому искал альтернативные варианты. Если я правильно понимаю, setgid
bit должен мне идеально подойти. Я понимаю так:
setgid
заставляет все ее содержимое иметь ту же группу владельцев, что и у папки, и заставляет все ее вложенные папки следовать тем же правилам. При этом она не предоставляет никаких дополнительных разрешений для тех, кто не входит в группу владельцев папки, то есть папка с маской drwxrws--x не позволяет другим редактировать и читать ее содержимое. setgid
всегда запускается от имени группы владельцев, позволяя пользователям выполнять действия с соблюдением групповых разрешений. Мои шаги следующие:
/var/opt/program/
и установил ее группу владельца mygroup; setgid
bit для папкиsetgid
bit для сценария оболочкиПроблема в том, что программа не может создавать и редактировать файлы в папке cache, будучи запущенной пользователем без прав root. Любой совет будет оценен по достоинству.
UPD Environment:
OS: Ubuntu 16.04.2 LTS
- 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
, а мы этого не разрешили. Но вы можете написать оболочку для этой команды.
Большинство операционных систем игнорируют 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 будут выполнять этот скрипт.