Каков наилучший способ обработки разрешений для пользовательских www-данных Apache 2 в /var /www?

У кого-нибудь есть хорошее решение для обработки файлов в /var/www? Мы запускаем виртуальные хосты на основе имени, а пользователь Apache 2 - www-data .

У нас есть два обычных пользователя и amp; корень. Поэтому, когда вы возитесь с файлами в /var/www, вместо того, чтобы ...

chown -R www-data:www-data

... все время, что это хороший способ справиться с этим?

Дополнительный вопрос: как хардкор вы переходите на разрешения?

Это всегда было проблемой в средах совместной разработки.

210 голосов | спросил Gareth 11 Mayam09 2009, 09:13:03

4 ответа


201

Попытка расширения на ответа @ Zoredache , поскольку я даю это самому:

  • Создайте новую группу (www-pub) и добавьте пользователей в эту группу

    groupadd www-pub

    usermod -a -G www-pub usera ## должен использовать -a для добавления к существующим группам

    usermod -a -G www-pub userb

    groups usera ## группы отображения для пользователя

  • Измените право собственности на все под /var /www на root: www-pub

    chown -R root:www-pub /var/www ## -R для рекурсивного

  • Измените разрешения всех папок на 2775

    chmod 2775 /var/www ## 2 = установить идентификатор группы, 7 = rwx для владельца (root), 7 = rwx для группы (www-pub), 5 = rx для мира (включая пользователя www-data apache)

    Установить идентификатор группы ( SETGID ) бит (2) приводит к копированию группы (www-pub) ко всем новым файлам /папкам, созданным в этой папке. Другими параметрами являются SETUID (4), чтобы скопировать идентификатор пользователя, и STICKY (1), который, я думаю, позволяет только владельцу удалять файлы.

    Существует рекурсивная опция -R, но это не будет различать файлы и папки, поэтому вы должны использовать find , например:

    find /var/www -type d -exec chmod 2775 {} +

  • Измените все файлы на 0664

    find /var/www -type f -exec chmod 0664 {} +

  • Измените umask для своих пользователей на 0002

    umask управляет разрешениями на создание файлов по умолчанию, 0002 означает, что файлы будут иметь 664 и каталоги 775. Установка этого параметра (путем редактирования строки umask внизу /etc/profile code> в моем случае) означает, что файлы, созданные одним пользователем, будут доступны для записи другими пользователями в www-группе без необходимости chmod.

Проверьте все это, создав файл и каталог и проверив владельца, группу и разрешения с помощью ls -l.

Примечание. Чтобы изменения вступили в силу, вам необходимо выйти из системы /вне форума.

ответил Tom 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 15 Sep 2009 09:11:44 +0400 2009, 09:11:44
59

Я не совсем уверен, как вы хотите настроить разрешения, но это может дать вам отправную точку. Вероятно, есть лучшие способы. Я предполагаю, что вы хотите, чтобы оба пользователя могли изменять что-либо в разделе /​​var /www /

  • Создайте новую группу (www-pub) и добавьте пользователей в эту группу.
  • Измените право собственности на все под /var /www на root: www-pub.
  • Измените разрешения всех папок на 2775
  • Измените все файлы на 0664.
  • Измените umask для своих пользователей на 0002

Это означает, что любой новый файл, созданный одним из ваших пользователей, должен быть именем пользователя: www-pub 0664, и любой созданный каталог будет именем пользователя: www-pub 2775. Apache получит доступ для чтения ко всему через «других пользователей», компонент. Бит SETGID в каталогах заставит все создаваемые файлы принадлежать группе, которой принадлежит папка. Настройка umask необходима для обеспечения того, чтобы бит записи был настроен так, чтобы каждый из группы мог редактировать файлы.

Что касается хардкора, я перехожу к разрешениям. Это полностью зависит от сайта /сервера. Если есть только 1-2 редактора, и мне просто нужно, чтобы они не слишком сильно нарушали ситуацию, тогда я пойду легко. Если бизнес требовал что-то более сложное, я бы поставил что-то более сложное.

ответил Zoredache 11 Mayam09 2009, 09:49:40
39

Я думаю, вы можете найти POSIX ACL (списки управления доступом), чтобы быть полезным. Они допускают более тонкую модель разрешения по сравнению с пользователем: group: other model. Я обнаружил, что их легче держать прямо в голове, так как я могу быть более явным и также могу установить поведение по умолчанию для ветви файловой системы.

Например, вы можете явно указать права каждого пользователя:

setfacl -Rm d:u:userA:rwX,u:userA:rwX /var/www
setfacl -Rm d:u:userB:rwX,u:userB:rwX /var/www

Или вы можете сделать это на основе некоторой общей группы:

setfacl -Rm d:g:groupA:rwX,u:groupA:rwX /var/www

И, возможно, вы хотите, чтобы ваш пользователь Apache был доступен только для чтения

setfacl -Rm d:u:www-data:rX,u:www-data:rX /var/www

Страницы человека:

Учебник

ответил Joe Holloway 11 Maypm09 2009, 20:26:02
7

Этот вопрос был снова задан , и обсуждены на мета, современные передовые методы обеспечивают лучшие подходы, чем было доступно в 2009 году, когда это было задано. Этот ответ пытается дать некоторые текущие решения для безопасного взаимодействия с средами совместной разработки веб-сайтов .


Для безопасного веб-сервера & совместное развитие - это больше, чем просто права доступа к файлам:

  • иметь отдельного пользователя для каждого сайта , т. е. не обслуживать все сайты, используя www-data. Это важно, так как в настоящее время Apache редко служит только статическим файлам контента, но работает с динамическими веб-сайтами. Этот ответ концентрируется на PHP, поскольку это самый распространенный язык сайта-сервера , но те же принципы относится и к другим.

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

  • Использовать Протокол передачи файлов SSH (SFTP). При использовании FTP следует отказаться от безопасности (поскольку он отправляет как пароли, так и содержимое в виде обычного текста), это защищенный заменитель SFTP также имеет функцию, которая является идеальным решением для совместной разработки веб-сайтов.

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

    Каждый разработчик может создавать keypair и хранить секретный ключ в секрете. Затем открытый ключ добавляется в файл ~/.ssh/authorized_keys для каждой учетной записи пользователя веб-сайта, над которой работает разработчик. Это имеет много преимуществ для управления паролями и входами:

    • Каждый разработчик может иметь доступ к любому количеству веб-сайтов без бремени запоминания или хранения всех паролей, связанных с размещением на сайте.

    • Не нужно менять & делиться паролями каждый раз, когда кто-то покидает компанию.

    • Вы можете использовать очень надежные пароли или вообще отключить логин на основе пароля.

  • Использовать PHP-FPM . Это текущий подход для запуска PHP в качестве пользователя. Создайте новый пул для каждого пользователя, то есть одного пула на каждый сайт. Это лучшее как для безопасности, так и для производительности, поскольку вы также можете указать, сколько ресурсов может потреблять один сайт.

    См. NeverEndingSecurity Запуск php-fpm с отдельным пользователем /uid и группой в linux . Есть учебники, такие как HowtoForge's Использование PHP-FPM с Apache на Ubuntu 16.04 , которое не использует PHP-FPM для повышения безопасности путем разделения пользователей, направляя использование одного сокета FPM на сервере.

ответил Esa Jokinen 10 Maypm18 2018, 13:03:15

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132