Лучший способ гарантировать, что содержимое каталога всегда принадлежит Apache

578
Justin

У нас есть пара Apache VirtualHosts на сервере CentOS 7, и PHP иногда требует возможность создавать / редактировать / удалять файлы и / или папки, поэтому важно, чтобы разрешения всегда были apache.apacheрекурсивными.

Развертывания выполняются через Jenkins, как пользователь Jenkins, и я знаю, что могу просто добавить простое выполнение оболочки chown -R apache.apache /var/www/website, и я сделаю это, но если кто-то, кроме меня, выполнит развертывание вручную или что-нибудь, что изменит разрешения, например создание нового файла или папки, то это может вызвать некоторые проблемы.

Я думал о том, чтобы просто сделать работу cron, чтобы периодически разбивать весь каталог, но будет 4 разных VHosts и, возможно, большое количество файлов для каждого, так что это часто не оптимально, но опять же, не выполнение этого часто означает, что могут возникнуть проблемы между изменением разрешений и выполнением задания cron.

Так кто-нибудь знает хороший способ убедиться, что владелец всегда установлен для определенного каталога? (рекурсивно) независимо от того, что пользователь делает что?

Сначала я подумал о Sticky Bits .. но я бы работал только на разрешения, а не на владение.

Затем я подумал об использовании чего-то вроде entr, которое я нашел в простом поиске Google. Он не доступен ни в одном репо, который я смог найти, поэтому вам нужно установить его вручную, но в основном он запускает команды, которые вы указываете, когда видит какие-либо изменения в папках / файлах, так что-то вроде

ls -d /var/www/foo.company.com | entr sh -c 'chown -R apache.apache /var/www/foo.company.com && echo "Chowned at $ (date)" >> /var/log/entr.log'

было бы достаточно ... Но я уверен, что есть решение, которое не требует ручной установки этого двоичного файла на серверы (я стараюсь максимально управлять пакетами через yum)

Любая помощь будет оценена!

Спасибо

Обновить

Zoredache упомянул, что я должен просто добавить apacheпользователя в другую группу пользователей, для которой требуются права на запись (то есть jenkins, как я делаю развертывания), а затем установить бит ID разрешения группы (chmod 2775).

Мне нравится такой подход, но сейчас я сталкиваюсь с проблемой.

Вот консольные команды / выходные данные, связанные с разрешениями

[root@svr www]# chown -R apache.apache www.company.com [root@svr www]# chmod -R 2775 www.company.com [root@svr www]# getfacl www.company.com/ # file: www.company.com/ # owner: apache # group: apache # flags: -s- user::rwx group::rwx other::r-x [root@svr www]# ls -l total 0 drwxrwsr-x. 2 apache apache 6 Apr 29 09:47 www.company.com 

Так это выглядит хорошо, верно? Однако, когда я пытаюсь выполнить развертывание, у меня возникает проблема с разрешениями ... Но если я верну каталог на 0775, он будет работать. Почему это не работает, когда я устанавливаю sgid?

0
Почему apache нуждается в собственности? Просто поместите apache в группу, которая будет иметь доступ для записи в требуемый каталог, и установите бит идентификатора группы в каталогах (а не бит закрепления). Таким образом, `2775` для каталога apache нуждается в доступе для записи. Zoredache 7 лет назад 0
Это может помочь, но есть ли способ постоянно `chmod g + rwx`? Я использую Jenkins для развертываний, и у меня есть Jenkins в группе apache (и наоборот), и я заболел `chown -R apache.apache / var / www && chmod -R 775 / var / www`, так что с * jenkins * user находится в группе * apache *, он может * rwx *, но прямо при запуске развертывания по какой-то причине права на запись для группы прекращаются ... не могу понять, почему. Так что, если есть способ дать доступ на запись группе таким образом, чтобы ее нельзя было отменить (кроме как с помощью root), это сработало бы. Justin 7 лет назад 0
Если все каталоги - 2775, а umask всех людей / процессов, записывающих в каталог, - 0002, то когда-либо файл будет принадлежать группе и группе с возможностью записи. Zoredache 7 лет назад 0

0 ответов на вопрос

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