Получение новых файлов для наследования групповых прав в Linux

88

У меня проблема с разрешениями на сервере Linux. Я привык к BSD. Если каталог принадлежит группе, в которой находится пользователь, которому он принадлежит, например, www-данные, созданные в нем файлы будут принадлежать этой группе. Это важно, потому что я хочу, чтобы файлы были доступны для чтения веб-серверу (который я не буду запускать от имени пользователя root), но пользователь все еще может помещать новые файлы в каталог. Я не могу поместить пользователей в www-данные, потому что тогда они могут читать сайты других пользователей.

Я хочу, чтобы веб-сервер читал все сайты, я хочу, чтобы пользователи могли изменять свои собственные.

В настоящий момент права доступа к папкам установлены следующим образом ...

drwxr-x--- 3 john www-data 4096 Feb 17 21:27 john

Это стандартное поведение на BSD для разрешений для работы таким образом. Как мне заставить Linux сделать это?

Джон Тейт
источник
2
Можете ли вы использовать ACL?
SLM

Ответы:

129

Похоже, вы описываете функциональность бита setgid, когда когда каталог, в котором он установлен, заставит любые новые файлы, созданные в нем, установить свою группу в ту же группу, которая установлена ​​в родительском каталоге.

пример

$ whoami
saml

$ groups
saml wheel wireshark

настроить каталог с перми + владения

$ sudo mkdir --mode=u+rwx,g+rs,g-w,o-rwx somedir
$ sudo chown saml.apache somedir
$ ll -d somedir/
drwxr-s---. 2 saml apache 4096 Feb 17 20:10 somedir/

коснитесь файла как saml в этом каталоге

$ whoami
saml

$ touch somedir/afile
$ ll somedir/afile 
-rw-rw-r--. 1 saml apache 0 Feb 17 20:11 somedir/afile

Это даст вам примерно то, что звучит так, как вы хотите. Если вы действительно хотите именно то, что вы описали, я думаю, вам придется прибегнуть к функциональности списков контроля доступа, чтобы получить это (ACL).

списки управления доступом

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

до

$ ll -d somedir
drwxr-s---. 2 saml apache 4096 Feb 17 20:46 somedir

установить разрешения

$ sudo setfacl -Rdm g:apache:rx somedir
$ ll -d somedir/
drwxr-s---+ 2 saml apache 4096 Feb 17 20:46 somedir/

Обратите внимание +на в конце, это означает, что к этому каталогу применены ACL.

$ getfacl somedir
# file: somedir
# owner: saml
# group: apache
# flags: -s-
user::rwx
group::r-x
other::---
default:user::rwx
default:group::r-x
default:group:apache:r-x
default:mask::r-x
default:other::---

после

$ touch somedir/afile
$ ll somedir/afile 
-rw-r-----+ 1 saml apache 0 Feb 17 21:27 somedir/afile
$ 

$ getfacl somedir/afile
# file: somedir/afile
# owner: saml
# group: apache
user::rw-
group::r-x              #effective:r--
group:apache:r-x        #effective:r--
mask::r--
other::---

Обратите внимание, что по умолчанию permissions ( setfacl -Rdm) установлены так, что permissions ( r-x) по умолчанию ( g:apache:rx). Это заставляет любые новые файлы иметь только свой rбит включен.

SLM
источник
Это, кажется, обеспечивает функциональность, которую я хотел, спасибо.
Джон Тейт
Кажется, это тоже решает мою похожую проблему. Однако я не совсем понимаю последнее предложение: «Это заставляет любые новые файлы включать только их r бит». Почему разрешение x не включено? Есть ли способ включить его по умолчанию ??
Яобин
1
@yaobin Я думаю, что это вопрос безопасности, вы не хотите иметь исполняемый файл по умолчанию
cdarken
Это не работает с unzip?
datasn.io
@ datasn.io - посмотрите справочную страницу unzip. В частности, -Xпереключатель.
SLM
38

TL: DR; чтобы новые файлы наследовали группу папки контейнера, выполните:

$ chmod g+s somefolder

Примечание: это подразумевается в принятом ответе, это всего лишь фрагмент.

Алло Мальбарез
источник
3
setgid означает, что новые файлы и папки будут иметь правильную группу, но помните, что если вы переместите файлы в дерево, у них не будет настроен нужный владелец. Подход ACL справляется с этим (в общем).
Крис Морган
@ChrisMorgan, как он справляется с этим? Решения из принятого ответа ничего не сделали для перемещенных файлов в моем случае.
Дан М.
@DanM .: с файловыми режимами вы устанавливаете разрешения, которые не наследуются; но с помощью ACL вы устанавливаете разрешения, которые наследуются (хотя дети могут указывать собственные ACL, которые переопределяют это), проверяемые во время выполнения.
Крис Морган
@ChrisMorgan да. Как ты это делаешь? Решение с использованием формы ACL принятого ответа не работает.
Дэн М.
10

В дополнение к ответу slm обратите внимание, что в файловой системе ext2 / 3/4 вы можете реплицировать описанное вами поведение BSD, используя bsdgroupsопцию mount в разделе. Со mount(1)страницы руководства :

grpid|bsdgroups and nogrpid|sysvgroups
              These options define what group id a newly  created  file  gets.
              When  grpid  is  set,  it takes the group id of the directory in
              which it is created; otherwise (the default) it takes the  fsgid
              of  the current process, unless the directory has the setgid bit
              set, in which case it takes the gid from the  parent  directory,
              and also gets the setgid bit set if it is a directory itself.
user60039
источник