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

37

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

site1: /var/www/site1/public_html/

site2: /var/www/site2/public_html/

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

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

Джордж Пирс
источник

Ответы:

71

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

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

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

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

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

sudo addgroup site1

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

sudo adduser user1 site1

Убедитесь, что user1 действительно в этой группе,

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, будет пользоваться всеми привилегиями, предоставленными этой группе.

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

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

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

newgrp - site1

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

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

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

sudo adduser www-data site1

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

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

ps aux | grep apache2 | less
Масрур
источник
1
Вам также необходимо добавить www-данные в группу site1. При загрузке и изменении файлов в веб-интерфейсе Wordpress. Изменения сделаны Apache, используя пользователя www-data. поэтому привилегий на чтение в большинстве случаев недостаточно.
Дан
3
Permission deniedСообщение не связано с «основной группы», а пользователь еще не на самом деле быть в этой группе (насколько OS обеспокоен). Если вы выйдете из системы и вернетесь обратно, она будет работать как положено (без запуска newgrp - site1)
0b10011
Как именно это будет отличаться от предоставления www-dataгрупповых прав на запись, если в конечном итоге вам придется добавлять www-dataв site1любом случае?
Мэтт
@MattBorja Ваш запрос не очень понятен. Вы спрашиваете, что плохого в том, чтобы дать группе с именем www-data' write permissions? If that is the question, www-data 'это не группа, это пользователь. Пожалуйста, дайте мне знать, если я неправильно понял ваш вопрос.
Масрур
я думаю, это не безопасная конфигурация, потому что пользователи могут получить доступ к сайтам друг друга через скрипт php, например, файловый менеджер php.
17
7

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

sudo groupadd site1grp && sudo groupadd site2grp

Добавьте www-dataв обе группы.

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

Добавьте user1 и user2 в соответствующие группы

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у пользователя и группы есть разрешения на обоих сайтах, и у каждого пользователя есть права доступа группы для их соответствующего сайта.

Дэн
источник
4

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

Ubuntu / апач

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

    КРЕДИТ Предоставление прав на запись для группы www-данных

    Вы хотите позвонить 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. Измените каталог на ваш WebSiteFolder

    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.html
    CHANGED TO:
    -rw-rw-r--  1 yourUserName www-data  7192 Oct  4 00:03 filename.html
    

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

    chmod -R ug+rw foldername
    

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

Jadeye
источник
3

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

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.

errikos
источник
Ваш ответ сбивает с толку: «Предоставляя доступ уровня группы к сайту1», вы имели в виду «изменение группы сайта1 на новую_группу» или изменение режима ( chmod)? В вашем ответе нигде не упоминается режим, который может повлиять на безопасность (или сломать вещи).
Лекенстейн
Я имел в виду изменение режима ( chmod) путем отмены всех разрешений для ДРУГИХ.
errikos
1

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

# usermod -aG www-data username

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

# adduser username www-data

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

vladkras
источник