Як уникнути використання судо під час роботи в / var / www?


172

Я хочу перестати користуватися sudoкожен раз, коли я працюю /var/www. Як я можу це зробити? Я просто хочу помістити всі мої сайти в цей каталог і працювати з ними без особливого болю.


3
Ви використовуєте апаш?
Rinzwind

1
Прочитавши тут, це також може допомогти у частині дозволу: askubuntu.com/questions/20105/…
Луїс Альварадо

2
Ще один спосіб забезпечити безпеку - продовжувати використовувати, sudo -u www-dataале обмежувати себе у sudoersфайлі, щоб мати можливість sudo www-data(а не корінь sudo). Дивіться serverfault.com/questions/295429/…
Саймон Вудсайд,

Відповіді:


249

Більшість відповідей тут не написані з урахуванням безпеки. Добре почувати, що sudoщоразу бігати не дуже мудро. Якщо ви робите помилку (наприклад, пробіл на одному місці в неправильному місці: sudo rm -rf / var/www/dir не виконуйте! ), Ви можете забруднити вашу систему.

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

Побачити:

Погані ідеї:

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

ПРИМІТКА . У наведених нижче рішеннях я надав www-dataпільги на запис. Однак, /usr/share/doc/base-passwd/users-and-groups.txt.gzзазначено:

www-дані

Деякі веб-сервери працюють як www-data. Цей веб-контент не повинен належати цьому користувачеві, або компрометований веб-сервер зможе переписати веб-сайт. Дані, виписані веб-серверами, будуть належати www-data.

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

Рішення 1

Додайте себе до www-dataгрупи та встановіть заданий біт у /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

Якщо у вашому домашньому каталозі не встановлено біт виконання (спадання) other(з міркувань безпеки), змініть групу його на 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.

Дивитися також


Що ви думаєте про www-сесію в терміналі sudo su www-data? У поєднанні з різним кольором підказки, щоб зробити більш очевидним, що це оболонка іншого користувача, і політика завжди ставити відповідний xterm - наприклад, на віртуальний робочий стіл 4, щоб ви звикли до нього, уникнути плутанини?
користувач невідомий

@user невідомо: якщо ви все зробите в терміналі штрафом, оскільки у вас є чіткий поділ між обліковими записами користувачів. Але це не спрацює, якщо ви користуєтеся такою програмою GUI gedit. Я ніколи не досліджував, чи безпечно запустити програму GUI під іншим користувачем у поточному сеансі, було б цікавим питанням.
Лекенштейн

1
@imaginaryRobots: якби я збирався розміщувати різні рішення на кожне питання, Askubuntu був би повним відповідями з трьох рядків. Я буду тримати його так, як є, якщо ви не переконаєте мене розколоти його.
Лекенштейн

1
@berbt setfacl -d u::rwX,g::rX /var/wwwмає кумедний ефект, коли режим за замовчуванням стає 0750 (або 0640), навіть якщо umask дорівнює нулю. Це може бути хорошою ідеєю, якщо ви хочете уникати файлів, що /var/wwwзаписуються у світі , але якщо це вже недоступне для світу, воно не потрібне.
Лекенштейн

1
Чи є проблема з інвертуванням процесу в рішення 1? Я маю на увазі, /var/www/app01має право власності app01:app01, а потім www-data користувач додається до app01 групи ? Або це щось зламає?
Jack_Hu

9

Замість того, щоб зберігати мої веб-сайти в / var / www, я розміщую там посилання на сайти, які знаходяться в моїй домашній папці. Я можу вільно редагувати або додавати сторінки на свої сайти. Коли я задоволений змінами, я переходжу FTP в хостинг-компанію, де посилається моє доменне ім’я.


Це розумна ідея.
thomasrutter

7

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

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.


4
Це дуже погана ідея для безпеки, і цієї поради не слід дотримуватися з причин, пояснених в інших відповідях. www-data повинні бути непривілейованою групою, без доступу до запису.
thomasrutter

5

Не треба

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

    Це суттєвий недолік безпеки, особливо якщо ви ввімкнули сценарії на стороні сервера, такі як PHP. Непривілейовані процеси не повинні мати можливість записувати у файли, які впливатимуть на веб-сайт, або, у разі використання сценаріїв на стороні сервера, виконувати довільний код.

  • Не додайте себе до складу групи даних www і не дайте йому дозволу на запис

    Мета цієї групи полягає в тому, що це непривілейована група, якою керуються серверні процеси . Вони повинні мати доступ для читання до файлів веб-сайту лише там, де це можливо, з тих же причин, що і вище.

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

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

    У певних обставинах ви хочете, щоб ваші сценарії на стороні сервера могли записувати у файли, і в цьому випадку тільки ці файли повинні бути зроблені для запису, www-dataі потрібно забезпечити безпеку.

Дос

  • Встановіть власність файлів

    Якщо ви єдиний, або звичайний, для зміни певних файлів на веб-сайті, то має сенс просто взяти на себе права власності на ці файли. Встановити їх власника на <your username>.

    Для цього не потрібно змінювати дозволи сервера, оскільки сервер надалі отримуватиме доступ лише для читання, навіть коли файли належать вам.

  • Виберіть доцільне місце для зберігання файлів (використовуючи DocumentRoot )

    Якщо /var/wwwце не має сенсу, ви можете розмістити їх в іншому місці. Якщо вони специфічні для вашої власної розробки або тестування, ви можете розмістити їх у своєму домашньому каталозі. Або ви можете встановити деякі каталоги в /srv.

  • Якщо ви хочете надати груповий доступ для запису, створіть нову групу для цієї мети

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


5

Це так просто. Вам не потрібно вмикати apache 'UserDir' (не рекомендується), ні возитися з групами 'www-data' (група apache у випадку Fedora)

Просто створіть каталог проектів всередині /var/www/html

cd /var/www/html
sudo mkdir my_project

Тоді просто подавіть користувачеві каталог проектів.

sudo chown your_username my_project

Тепер ви можете почати працювати над папкою свого проекту як звичайний користувач із будь-яким редактором, IDE на ваш вибір. Немає більше sudos :)


1
+1 Це те, що я роблю: змінюю право власності не на /var/wwwсебе, а на підкаталоги.
fkraiem

2

chmod in / var на www, щоб дозволити власнику доступу, і chown переконайтеся, що ви ним володієте. Напевно, дурна думка, але вона обов'язково спрацює.


2
Не дурна думка, це розумна ідея безпеки. Примітка. Вам не потрібно (і не слід) змінювати дозволи /varлише /var/wwwта / або його вмісту.
thomasrutter

1

Ви можете розпочати сеанс 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 ви можете встановити свої переваги чорному тексту на білому ґрунті або, наприклад, білому тексту на чорному ґрунті.

У мене є лише така політика роботи як root, так що я не впевнений, наскільки це добре підійде для роботи з www-даними. У поєднанні з ssh-сеансами для різних хостів, які мають свої підказки, це не заважало мені іноді помилятися, але якщо це трапляється, я швидко усвідомлюю, що не так, і це трапляється рідко.

Примітка. Підказки-скрипт - це частково копія керованої сторінки bash.


Це буде спрацьовувати і не матиме (якщо використовувати його обережно) негативно, але не може бути найпростішим рішенням. Хоча це дійсне рішення для деяких людей.
thomasrutter
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.