Как избегать использования sudo при работе в/var/www?

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

190
задан 1 June 2011 в 12:32

7 ответов

Большинство ответов здесь не написано с учетом безопасности. Приятно получить ощущение, что запуск sudo каждый раз не очень мудрый. Если вы сделаете опечатку (например, единичный пробел в неправильном месте, например, рекурсивное удаление / var/www/dir, что означает / и var/www/dir, вместо /var/www/dir--, пожалуйста, не пытайтесь ), вы можете выбросить вашу систему из мусорной корзины.

Примечание: Начиная с Apache 2.4.7 / Ubuntu 14.04, /var/www был перемещен в /var/www/html Настройте команды в этом ответе соответствующим образом.

Смотрите:

Плохие идеи:

  • chmod 777 (sagarchalise) - это позволяет любому, у кого есть доступ к вашей системе, записывать в каталоги и файлы и таким образом позволяет злоумышленнику выполнить любой код под www-data user
  • chgrp -R www-data $HOME (cob) - это позволяет www-data читать или записывать любые файлы в домашнем каталоге. Это не учитывает правило наименьших привилегий
  • chown -R $USER:$USER /var/www (kv1dr) - если только мир не имеет разрешений на чтение на /var/www, веб-сервер, запущенный под www-data, не сможет читать (обслуживать) файлы. Если файл является общедоступным простым HTML-документом, это может не вызывать проблем, если мир сможет прочитать файл. Но если файл является PHP-файлом, содержащим пароли, то это так.

NOTE: в нижеприведенных решениях я предоставил www-data привилегии на запись. Однако, в /usr/share/doc/base-passwd/users-and-groups.txt.gz говорится:

www-data

Некоторые веб-серверы работают как www-data. Веб-контент не должен принадлежать этому пользователь или скомпрометированный веб-сервер сможет переписать веб-сайт. Данные выписанные веб-серверами, будут принадлежать www-data.

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

Решение 1

Добавьте себя в группу www-data и установите бит setgid в каталоге /var/www таким образом, чтобы все вновь созданные файлы также наследовали эту группу.

sudo gpasswd -a "$USER" www-data

Исправьте ранее созданные файлы (предполагая, что вы единственный пользователь /var/www):

sudo chown -R "$USER":www-data /var/www
find /var/www -type f -exec chmod 0660 {} \;
sudo find /var/www -type d -exec chmod 2770 {} \;

(еще безопаснее: используйте 640 или 2750 и вручную chmod g+w file- or-dir, который должен быть доступен для записи на веб-сервере)

Решение 2

Создайте сим-ссылку для каждого проекта в вашу домашнюю директорию. Скажем, что ваш проект находится по адресу ~/projects/foo, и вы хотите, чтобы он находился по адресу /var/www/foo, запустите его:

sudo ln -sT ~/projects/foo /var/www/foo

Если в вашем домашнем каталоге не установлен бит исполнения (нисходящий) для другого (из соображений безопасности), измените его группу на www-data, но установите только бит исполнения (без чтения/записи). Сделайте то же самое для папки ~/projects, так как она может содержать другие проекты, кроме www. (Вам не нужно sudo, если вы ранее добавили вашего пользователя в группу www-data. )

sudo chgrp www-data ~ ~/projects
chmod 710 ~ ~/projects

Установите группу на www-data на ~/projects/foo и позвольте веб-серверу читать и записывать в файлы и папки+директории и спускаться в каталоги:

sudo chgrp www-data ~/projects/foo
find ~/projects/foo -type f -exec chmod 660 {} \;
find ~/projects/foo -type d -exec chmod 2770 {} \;

Еще безопаснее: используйте 640 и 2750 по умолчанию и вручную файлы и директории chmod, которые должны быть доступны для записи пользователем веб-сервера. Бит setgid должен быть добавлен только в том случае, если вы хотите, чтобы каждый вновь созданный файл в ~/projects/foo был доступен группе.

Отныне вы можете получить доступ к своему сайту по адресу http://localhost/foo и отредактировать файлы ваших проектов в ~/projects/foo.

Смотрите также

265
ответ дан 22 November 2019 в 22:48

Вместо того, чтобы хранить свои сайты в /var/www, я размещаю там ссылки на сайты, которые находятся в моей домашней папке. Я могу свободно редактировать или добавлять страницы на свои сайты. Когда я доволен изменениями, я затем FTP в хостинговую компанию, где мое доменное имя ссылки.

11
ответ дан 22 November 2019 в 22:48

chmod в /var на www, чтобы дать владельцу доступ, и chown, чтобы убедиться, что он у вас есть. Возможно, это глупая идея, но она определенно сработает.

2
ответ дан 22 November 2019 в 22:48

Вы можете запустить www-сессию в терминале с помощью

sudo su www-data

В сочетании с разноцветной подсказкой*, чтобы было понятно, что это оболочка другого пользователя, и политикой всегда ставить соответствующий xterm (и редактор, и т.д.) на - например - виртуальный рабочий стол 4, чтобы вы привыкли к этому, во избежание путаницы.

*). Для приглашения другого цвета с другим символом создайте файл /etc/prompt, например:

# PROMPTING
#       When  executing  interactively, bash displays the primary prompt PS1 when it is ready to read a command, and the sec-
#       ondary prompt PS2 when it needs more input to complete a command.  Bash allows these prompt strings to be  customized
#       by inserting a number of backslash-escaped special characters that are decoded as follows:
#              \a     an ASCII bell character (07)
#              \d     the date in "Weekday Month Date" format (e.g., "Tue May 26")
#              \D{format}
#                     the  format is passed to strftime(3) and the result is inserted into the prompt string; an empty format
#                     results in a locale-specific time representation.  The braces are required
#              \e     an ASCII escape character (033)
#              \h     the hostname up to the first `.'
#              \H     the hostname
#              \j     the number of jobs currently managed by the shell
#              \l     the basename of the shell's terminal device name
#              \n     newline
#              \r     carriage return
#              \s     the name of the shell, the basename of $0 (the portion following the final slash)
#              \t     the current time in 24-hour HH:MM:SS format
#              \T     the current time in 12-hour HH:MM:SS format
#              \@     the current time in 12-hour am/pm format
#              \A     the current time in 24-hour HH:MM format
#              \u     the username of the current user
#              \v     the version of bash (e.g., 2.00)
#              \V     the release of bash, version + patchelvel (e.g., 2.00.0)
#              \w     the current working directory
#              \W     the basename of the current working directory
#              \!     the history number of this command
#              \#     the command number of this command
#              \$     if the effective UID is 0, a #, otherwise a $
#              \nnn   the character corresponding to the octal number nnn
#              \\     a backslash
#              \[     begin a sequence of non-printing characters, which could be used to embed a terminal  control  sequence
#                     into the prompt
#              \]     end a sequence of non-printing characters
#
#       The  command  number and the history number are usually different: the history number of a command is its position in
#       the history list, which may include commands restored from the history file (see HISTORY below),  while  the  command
#       number  is  the  position in the sequence of commands executed during the current shell session.  After the string is
#
# colors:
# \[...\]   wird benötigt, damit die shell weiß, daß hier kein printable output ist, und die Umbrüche richtig plaziert.
#
# ANSI COLORS
CRE="\[
[K\]"
NORMAL="\[[0;39m\]"
# RED: Failure or error message
RED="\[[1;31m\]"
# GREEN: Success message
GREEN="\[[1;32m\]"
# YELLOW: Descriptions
YELLOW="\[[1;33m\]"
# BLUE: System messages
BLUE="\[[1;34m\]"
# MAGENTA: Found devices or drivers
MAGENTA="\[[1;35m\]"
# CYAN: Questions
CYAN="\[[1;36m\]"
# BOLD WHITE: Hint
WHITE="\[[1;37m\]"
#
# default:
# postgres, oracle, www-data
#
# PS1=$BLUE"machine]->"$NORMAL\\w"$BLUE ø $NORMAL"
PS1=$BLUE"machine]:"$NORMAL\\w"$BLUE > $NORMAL"
#
# root, stefan:
#
case "$UID" in
    '0')
        PS1=$RED"machine:"$NORMAL\\w"$RED # $NORMAL"
    ;;
    '1000')
    PS1=$GREEN"machine:"$BLUE\\w$YELLOW" > "$NORMAL
    ;;
#    default)
#    ;;
esac

и возьмите его из /etc/bash.bashrc.

В качестве дополнительного инструмента для разграничения, вы всегда можете редактировать свои файлы с псевдонимом "редактировать" или сим-ссылкой, которая указывает, в зависимости от вашей личности (taylor/www-data), на gedit или на коврик мыши, vim или pico. Или вы можете использовать различные профили редактора, по крайней мере, в gedit вы можете настроить свои предпочтения на черный текст на белом фоне или белый текст на черном фоне, например.

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

Примечание: подсказка частично является копией manpage bash.

1
ответ дан 22 November 2019 в 22:48

Если вы сделаете / var / www доступным для записи его группой и добавите себя в группу, вам не придется использовать sudo, оставаясь при этом достаточно безопасным. Попробуйте следующее:

sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rw /var/www

После этого вы сможете без проблем редактировать файлы / var / www / .

Первая строка добавляет вас в группу www-data , вторая строка очищает все файлы с неверным владельцем, а третья делает так, чтобы все пользователи, являющиеся членами Группа www-data может читать и записывать все файлы в / var / www .

7
ответ дан 22 November 2019 в 22:48

Дон 'ts

  • Не устанавливайте права доступа к файлам на 777 (с возможностью записи всем)

    . Это серьезный недостаток безопасности, особенно если вы включаете сценарии на стороне сервера, такие как PHP. Непривилегированные процессы не должны иметь возможность записывать файлы, которые могут повлиять на веб-сайт, или, в случае использования сценариев на стороне сервера, выполнять произвольный код.

  • Не добавляйте себя в качестве участника www- data и предоставить ей права на запись

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

  • Не изменяйте разрешения для процессов Apache

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

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

Dos

  • Установите файлы, которые принадлежат вам

    Если вы единственный, или обычный Во-первых, чтобы изменить определенные файлы на веб-сайте, тогда имеет смысл просто стать владельцем этих файлов. Установите их владельца на <ваше имя пользователя> .

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

  • Выберите разумное место для размещения файлов (используя DocumentRoot )

    Если / var / www не имеет смысла, вы можете разместить их в другом месте. Если они относятся к вашей собственной разработке или тестированию, вы можете поместить их в свой домашний каталог. Или вы можете настроить несколько каталогов в / srv .

  • Если вы хотите предоставить группе доступ на запись, создайте новую группу для цели

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

7
ответ дан 22 November 2019 в 22:48

Это просто. Вам не нужно ни включать apache 'UserDir' (не рекомендуется), ни путаться с группами 'www-data' (группа apache в случае Fedora)

Просто создайте каталог своего проекта внутри / var / www / html

cd /var/www/html
sudo mkdir my_project

Затем просто выберите каталог проекта для своего пользователя.

sudo chown your_username my_project

Теперь вы можете начать работать с папкой проекта как обычный пользователь с любым редактором, IDE по вашему выбору. Больше никаких судос :)

7
ответ дан 22 November 2019 в 22:48

Другие вопросы по тегам:

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