Предоставить пользователю права доступа к www-данным, принадлежащим /var/www

У меня есть простая настройка веб-сервера для некоторых веб-сайтов с макетом что-то вроде:

сайт 1: /var/www/site1/public_html/

сайт 2: /var/www/site2/public_html/

Ранее я использовал пользователя root для управления файлами, а затем вернул их обратно www-data когда я закончил (сайты WordPress, необходимые для работы загрузок WP). Вероятно, это не самый лучший способ.

Я пытаюсь найти способ создать другого пользователя (назовем его user1), который имеет разрешение на редактирование файлов на сайте 1, но не на сайте 2, и не мешает файлам быть "принадлежащими" www-data. Есть ли у меня какой-нибудь способ сделать это?

Если мы проверим право собственности на site1, мы найдем что-то вроде этого,

ls -ld /var/www/site1/drwxr-xr-x 2 root root 4096 Oct 24 21:06 site1/

Это означает, что каталог принадлежит корню пользователя, корню группы. В то время как корень пользователя имеет разрешение на запись (плюс права на чтение и выполнение) в каталог, корень группы имеет только права на чтение и выполнение.

Мы захотим сменить владельца группы на другого (новый) сгруппируйте и добавьте пользователя 1 в эту конкретную группу. Мы также дадим разрешение на запись этой конкретной группе.

Создайте новую группу,

sudo addgroup site1

Добавьте пользователя 1 во вновь созданную группу,

sudo adduser user1 site1

Убедитесь, что пользователь1 действительно находится в этой группе,

groups user1

Результатом должен быть список, что-то вроде,

user1 : <other-groups> site1

Теперь мы можем изменить групповое право собственности на ваш предполагаемый каталог.

sudo chown -vR :site1 /var/www/site1/changed ownership of `/var/www/site1/' from root:root to :site1

Предоставьте разрешение на запись этому новому владельцу группы,

sudo chmod -vR g+w /var/www/site1/mode of `/var/www/site1/' changed from 0755 (rwxr-xr-x) to 0775 (rwxrwxr-x)

Убедитесь, что все изменения действительно есть,

ls -ld /var/www/site1/drwxrwxr-x 2 root site1 4096 Oct 24 21:06 /var/www/site1/

Итак, каталог теперь принадлежит пользователю root, группе site1. Как пользователь root, так и группа site1 имеют разрешение на запись (плюс разрешения на чтение и выполнение) в каталог. Любой пользователь, принадлежащий к группе site1, будет пользоваться всеми привилегиями, предоставленными этой группе.

Теперь войдите в систему как пользователь1, перейдите в каталог site1 и попробуйте создать файл в этом каталоге,

echo "My User1 Site" > index.html bash: index.html: Permission denied

Это не удалось, так как, скорее всего, основная группа user1 не является site1. Итак, переходите в эту группу.

newgrp - site1

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

РЕДАКТИРОВАТЬ

Кроме того, как указал dan08 в комментарии вам нужно добавить www-данные в группу site1.

sudo adduser www-data site1

Во многих (не во всех) дистрибутивах www-data является пользователем, под которым работает веб-сервер Apache. Это также означает, что все, что делается Apache (особенно включая PHP-скрипты), будет выполняться с разрешениями пользователя www-data (а также группы www-data) по умолчанию. WordPress использует пользовательские www-данные для записи файлов.

Если вы хотите посмотреть, как работает веб-сервер apache, выполните команду,

ps aux | grep apache2 | less

Для тех, у кого есть корневая папка wordpress в домашней папке:

Ubuntu/apache

  1. Добавьте своего пользователя в группу www-data:

    кредит Предоставление разрешений на запись группе www-data

    Ты хочешь позвонить usermod от вашего пользователя. Так что это было бы:

    sudo usermod -aG www-data yourUserName

    Предполагая, www-data группа существует

  2. Убедитесь, что ваш пользователь находится в www-data группа:

    groups yourUserName

    Вы должны получить что-то вроде:

    yourUserName : yourUserGroupName www-data

    yourUserGroupName обычно аналогично вашему имени пользователя

  3. Рекурсивно измените групповое владение папкой, сохраняя ваше пользовательское владение

    chown yourUserName:www-data -R yourWebSiteFolder/*
  4. Измените каталог на yourWebSiteFolder

    cd yourWebSiteFolder
  5. Рекурсивно измените групповые назначения папок и вложенных папок, чтобы включить разрешения на запись:

    find . -type d -exec chmod -R 775 {} \;

    способ /home/yourUserName/yourWebSiteFolder/' изменился с 0755 (rwxr-xr-x) к 0775 (rwxrwxr-x)

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

    find . -type f -exec chmod -R 664 {} \;

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

    WAS:-rw-r--r--  1 yourUserName www-data  7192 Oct  4 00:03 filename.htmlCHANGED TO:-rw-rw-r--  1 yourUserName www-data  7192 Oct  4 00:03 filename.html

    Эквивалентно:

    chmod -R ug+rw foldername

    Разрешения будут такими, как 664 или 775.

Создайте две группы: site1grp и site2grp

sudo groupadd site1grp && sudo groupadd site2grp

Добавь www-data для обеих групп.

sudo adduser www-data site1grp && sudo adduser www-data site2grp

Добавьте пользователей 1 и 2 в соответствующие группы

sudo adduser user1 site1grp && sudo adduser user2 site2grp

Измените разрешение папок вашего сайта таким образом, чтобы владельцем пользователя был www-data, а владельцем группы - соответствующая группа

sudo chown -R www-data:site1grp /var/www/site1  && sudo chown -R www-data:site2grp /var/www/site2

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

Вы должны создать новую группу для так называемого "нового пользователя", а затем добавить www-данные и "нового пользователя" в эту группу:

sudo gpasswd -a new_user new_group

Затем вы можете сменить владельца на new_user и группа, чтобы new_group:

sudo chown -R new_user:new_group /var/www/site1

Затем вам нужно будет предоставить доступ на уровне группы к сайту1. www-data по-прежнему сможет получить доступ к сайту, поскольку он принадлежит new_group, в то время как new_user не сможет получить доступ к site2, поскольку он не будет принадлежать к группе www-data, которой принадлежит site2.

Предполагая, что все файлы уже принадлежат www-data пользователя (вы можете проверить это с помощью ls -slah команда), которая принадлежит к www-data группа (следующий столбец после имени пользователя в списке файлов) вы можете просто добавить своего пользователя в ту же группу www-data сгруппируйте, чтобы разрешить редактирование этих файлов

# usermod -aG www-data username

для существующего пользователя, или

# adduser username www-data

для вновь созданного

Однако все это работает только в том случае, если разрешения по умолчанию при создании новых файлов включают групповое разрешение на запись. Разрешения по умолчанию в большинстве систем (Linux) предназначены для предоставления разрешения на запись только владельцу файла. Это означает, что если либо www-data, либо пользователь создаст файл или каталог, другой не сможет в него записывать.

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