Проблеми з дозволом на / var / www / html та власний домашній каталог для кореня документа веб-сайту


34

Я намагаюся не дати дозволу 777 у своїй /var/www/htmlпапці, але я хочу редагувати свої файли без цього sudo. Тож я хоч і створюю символьне посилання папки в своєму домашньому каталозі /var/www/html. Я створив це за допомогою sudo ln -sT /home/andre/www/moodle/ moodle, і ls -laвихід такий:

andre@andre-270E5G:/var/www/html$ ls -la
total 8
drwxr-xr-x 2 root root 4096 Mai  4 10:20 .
drwxr-xr-x 4 root root 4096 Abr 29 14:29 ..
lrwxrwxrwx 1 root root   23 Mai  4 10:20 moodle -> /home/andre/www/moodle/

Отже, моя папка настрою читала, записувала та виконувала дозволи для всіх, і це не те, що я хочу. Я використовував команду, sudo chmod -R 775 moodle/намагаючись її змінити, але вона залишалася дозволом для читання, запису та виконання для всіх. Я спробував те ж саме з папкою настрою в /home/andre/www/moodle, але він залишився колишнім. Вихід ls -laв /home/andre/www/:

andre@andre-270E5G:~/www$ ls -la
total 28
drwxrwxr-x  3 andre andre  4096 Mai  4 10:02 .
drwx------ 49 andre andre 20480 Mai  4 10:01 ..
drwxrwxr-x 41 andre andre  4096 Mai  4 10:02 moodle

Отже, папка moodleв /home/andre/www/має потрібні мені дозволи.

Як додаткова проблема, коли я отримую доступ, localhost/moodleя отримую 403 Заборонену помилку.

Що я тут роблю неправильно?

Відповіді:


63

Ніколи не потрібно запускати веб-сайт із домашнього каталогу . ВСЕ. Інакше вам доведеться надати веб-серверу можливість/home/переглядати структуру каталогів, але також/home/$USER/(домашній каталог вашого користувача, де ми можемо спробувати і побачити, що ще існує у вашому каталозі користувачів), а також будь-які інші папки там. Неправильно налаштований або неправильно налаштований або незапартований веб-сервер може призвести до такого масового витоку даних або втрати облікових даних та таких, які могли б піддавати вашим особистим даним та входу різні дані. Підхід до символьного посилання, який ви використовуєте, не допомагає ні з тієї ж причини, що й намагатися надати Apache дозволу на читання/home/andre/www/moodle- веб-сервер повинен бути в змозі пройти ваш домашній каталог, щоб дістатися до місця, на яке /var/www/htmlвказує символьне посилання , що все ще становить такий ризик для безпеки.

По-перше, використовуйте sudo cp -r /home/andre/www/moodle/ /var/www/html/. Це скопіює ваші файли у /var/www/htmlта збереже подалі від власного домашнього каталогу. Потім ми повторно дозволумемо, щоб ви та веб-сервер мали доступ до всього, що знаходиться у цьому каталозі, та надамо вашому користувачеві повне читання / запис у всі файли та каталоги. Тоді вам доведеться лише працювати з /var/www/htmlвашого сайту.

Це фактично, через чотири кроки, після того, як ви скопіюєте свої дані назад у /var/www/html:

  1. Надайте Apache доступ до папок і файлів, щоб він міг обслуговувати сайт без 403 помилок.
  2. Дайте вашому користувачеві "власника" над файлами та папками та дайте собі можливість читати / писати всі файли та папки, а також можливість пересувати каталоги.
  3. (Необов’язково, але рекомендується) Налаштуйте його таким чином, щоб будь-які файли або папки, створені з цього приводу у всій структурі каталогу, мали встановити групу www-data.
  4. (Необов’язково) Остаточне очищення безпеки, коли ми встановлюємо дозволи, щоб ви та веб-сервер могли бачити дані про сайт, але інші користувачі не можуть отримати доступ до файлів чи структури каталогів для сайту.

(1) Дозволити Apache отримати доступ до папок і файлів.

sudo chgrp -R www-data /var/www/html
sudo find /var/www/html -type d -exec chmod g+rx {} +
sudo find /var/www/html -type f -exec chmod g+r {} +

Це рекурсивно встановлює "групу" www-dataдля папок і файлів. Потім це дає дозвіл веб-серверу на повторний доступ та отримання доступу до структури кореневих каталогів документа на сайті ( +xлише для каталогів). Потім він також забезпечує доступ до веб-сервера для читання для всіх файлів, тому дані про сайт можуть бути отримані.

Можливо, є деякі випадки, коли потрібно надати веб-серверу дозвіл на запис у файл або в каталог - цього можна досягти, зробивши це sudo chmod g+w /var/www/html/PATH(де PATHшлях до файлу чи папки в структурі каталогу, куди потрібно застосувати дозволу на запис для веб-сервера).

УВАГА : Є багато випадків, коли це може викрити "захищену" інформацію про конфігурацію сайту (наприклад, облікові дані доступу до бази даних тощо), і вам слід видалити "інші" дозволи на доступ до цих даних із тих окремих файлів або каталогів з наступне: sudo chmod o-rwx /var/www/html/FILEPATH(заміна FILEPATHшляху до відносно /var/www/htmlпапки для файлу).

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


(2) Надайте власнику права читання / запису в папки та файли та дозвольте доступ до папок для проходження структури каталогів.

sudo chown -R USER /var/www/html/
sudo find /var/www/html -type d -exec chmod u+rwx {} +
sudo find /var/www/html -type f -exec chmod u+rw {} +

Замініть USERв першій команді власне ім’я користувача!

Ми робимо тут три речі. По-перше, ми встановлюємо вашого користувача "власником" всіх файлів і каталогів /var/www/html. Далі ми встановлюємо дозволи на читання та запис у папках та дозволяємо вам отримувати доступ до папок, щоб увійти в них ( +xпункт у елементах каталогу). Потім ми встановлюємо всі файли для дозволу читання / запису для власника, які ми тільки що встановили.


(3) (Необов’язково) Переконайтеся, що кожен новий файл після цього створюється www-dataяк користувач "доступу".

sudo find /var/www/html -type d -exec chmod g+s {} +

Це встановлює біт "set gid" для групи в каталогах. Файли та папки, створені всередині цих каталогів, завжди матимуть www-dataгрупу, дозволяючи веб-серверу отримати доступ.


(4) (Необов’язково) Остаточне очищення безпеки, якщо ви не хочете, щоб інші користувачі могли бачити дані

Нам потрібен ваш користувач, щоб побачити каталоги та файли. Для цього нам потрібен і веб-сервер. Ми можемо не бажати, щоб інші користувачі системи (крім root) бачили дані. Тож давайте не надавати їм доступу, і зробити так, щоб дані могли бачити лише ваш користувач та веб-сервер.

sudo chmod -R o-rwx /var/www/html/

ПРИМІТКА. Вам не доведеться повторно запускати це пізніше або редагувати дозволи для категорії "інші" тут. Якщо "інші" користувачі не можуть дістатися до них /var/www/html/(у них немає необхідного +xбіту /var/www/htmlдля переходу структури файлів та каталогів, а також +rбіта для читання списків файлів), то дозволи на елементи під цим каталогом для інших користувачів або групи насправді не матимуть великого значення.


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

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

Якщо припустити, що ми все ще працюємо /var/www/html/, і ми не хочемо, щоб інші користувачі, окрім нас та системи (і root-коду) переглядали наші дані, нам потрібно буде виконати наступні дії:

  1. Поверніть право власності користувачеві системи веб-сервера www-data.
sudo chown -R www-data: www-data / var / www / html
  1. Рекурсивно дають вам читати / писати у файли, не даючи іншим користувачам (за винятком www-dataі, rootзвичайно), доступу до файлів.
sudo find / var / www / html -type f -exec setfacl -mu: YOURUSERNAME: rw -m other :: --- {} \;
  1. Рекурсивно дозволяйте собі читати / записувати / переходити по каталогах, видаляйте доступ до папок для інших користувачів (виключаючи www-dataта root) та встановлюйте це як ACL 'за замовчуванням' для нових файлів у каталогах.
sudo find / var / www / html -type d -exec setfacl -d -mu: YOURUSERNAME: rwx -mo :: --- {} \;
  1. Нам також потрібно встановити setgidбіт для всіх каталогів, так що якщо ви створюєте файл, веб-сервер все ще може отримати доступ до нього як www-dataчерез групові дозволи.
sudo find / var / www / html -тип d -exec chmod g + x {} \;

А тепер у вас є доступ до всіх каталогів, і вам не доведеться відбирати доступ, www-dataякий допомагає, оскільки веб-сервер все ще може створювати файли скрізь, як це потрібно (наприклад, на основі PHP, що мають власні каталоги кеш-пам'яті та подібні що потрібно створити і записати для належної роботи).

Єдиний застереження: якщо ви вручну створюєте нові файли, вам потрібно їх відповідно порушити, щоб надати право власності на веб-сервер. Це просто sudo chown www-data:www-data filename, і списки контролю доступу все ще повинні мати ефективні права власника на файл.

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


2
@ AndréCarvalho +xдля файлів давав би виконавчі права, і ми не хочемо, щоб файли PHP виконувалися, обов'язково, через командний рядок PHP або як виконуваний файл на самому сервері - ми хочемо, щоб вони оброблялися PHP-аналізатором на веб-сервері (і ми не потрібні файли PHP для того, +xщоб PHP-аналізатор міг їх читати та обробляти). Довідники потрібні +xдля того, щоб дозволити перехід через каталоги - тобто, якщо каталог не є, +xа я не root, я не можу потрапити в каталог, що є проблемою, з якою у Apache не працювало з вашими посиланнями та вашим домом каталог.
Томас Уорд

1
@ AndréCarvalho www-data- це системна група - це не група, для якої стандартні користувачі можуть бути.
Thomas Ward

1
@JunaidQadirShekhanzai Неможливо надати, оскільки налаштування людей сильно відрізняються від середовища, яке їм потрібно, та багатьох інших факторів. Такий "файл оболонки" неможливо створити, враховуючи наявність додаткових компонентів. Я міг би спробувати створити сценарій Python, який міг би це зробити, але ми все ще стикаємося з такими речами, як системні обмеження, необов'язкові завдання, різні шляхи тощо.
Thomas Ward

1
@ T.Todua, це не те, що я сказав. Я сказав, що ніколи не слід запускати сайт із (читати: зсередини) вашого "домашнього" каталогу - тобто не слід нічого запускати /home/USER/...на веб-сервері. Ви неправильно прочитали та неправильно зрозуміли значення слів, які я вживаю. /var/www/*це відносно "безпечне" місце для запуску веб-сайтів, оскільки це спеціальна папка / простір для нього. Однак /var/www/htmlНЕ безпечно, оскільки це написано веб-серверами при встановленні та ін., І призводить до крадіжки важливих даних (тому /var/www/SUBDIRECTORYзамість цього використовуйте окремі підкаталоги сайту)
Thomas Ward

1
Я відкоригував формулювання для ясності.
Thomas Ward

2

Вся ідея використання символьних посилань для вирішення питання про дозвіл є помилковою і не може працювати. Дозволи, показані для самого символьного посилання, здебільшого не мають значення, їх не можна використовувати для обходу дозволів "реального" каталогу. Створення симпосилання від /var/www/html/moodleдо /home/andre/www/moodle/не обходить дозволу для /home/andre/www/moodle/. Кожен, хто хоче займатися цим, /var/www/html/moodleможе зробити це лише у тому випадку, якщо він має необхідні дозволи /home/andre/www/moodle/.

Ваше виконання sudo chmod -R 775 moodle/насправді мало ефект, але відмінне від того, що ви думали, воно не змінило дозволу символьної посилання, а цілі символьної посилання /home/andre/www/moodle/.

Помилка 403, яку ви отримуєте на веб-сервері, ймовірно, тому, що ваш веб-сервер не має необхідних дозволів для введення /home/andre. Це не є "додатковою проблемою", але через ту саму проблему з дозволом.

Тож замість використання символьних посилань вам доведеться з’ясувати дозволи, які дозволяють редагувати файли та веб-сервер для доступу до них (або навіть редагувати їх, що залежить від програми). Які саме такі дозволи є, залежить від конкретного випадку використання (програми та конфігурації сервера).

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

Приклад дозволу (який може не працювати у вашому випадку використання через відсутність інформації):

andre@fermat:/var/www/html$ ls -al moodle/
total 0
drwxr-x--- 2 andre www-data 60 mai  4 16:20 .
drwxr-xr-x 3 root  root     80 mai  4 16:20 ..
-rw-r----- 1 andre www-data  0 mai  4 16:20 index.html

Ви можете бачити, що в каталозі є достатній доступ для вас як власника, щоб ввести його та змінити його вміст, веб-сервер (у групі www-data) може входити та читати. Самі файли читаються та читаються вами (власником) та читаються на веб-сервері (у групі www-data). Усі інші користувачі взагалі не мають доступу.

Знову ж, будь ласка, візьміть це лише як приклад. Точний користувач / група вашого веб-сервера залежить від вашої конфігурації. А для вашої програми (настрою) можуть знадобитися різні дозволи, вам слід ознайомитися з її документацією.


Погоджено, але це не надто корисно, якщо вони не знають, як правильно встановити дозволи, і вони також зіткнуться з іншими проблемами.
Томас Уорд

@ThomasW. Тоді питання про те, як правильно встановити дозволи, повинно бути новим питанням, включаючи необхідну інформацію, наприклад конфігурацію веб-сервера, потрібний спосіб редагування файлів та потреби програми.
мастов

або написана як правильна відповідь - що я зараз роблю. Вам також не слід запускати що-небудь з / home / USER / для веб-сайту, він має доступ до багатьох інших даних користувачів, якщо веб-сервер неправильно налаштований або налаштований.
Томас Уорд

@mastov Зрозумів. Ви вирішуєте багато питань, які у мене були з вашим поясненням.
Андре Карвальо

2

Відмінна відповідь Томаша Уорда https://askubuntu.com/a/767534/717860

Ви можете виконати всі рекомендовані дії всього за 3 команди замість 8 команд:

3 команди:

sudo chown -R ubuntu:www-data /var/www
sudo find /var/www -type d -exec chmod 2750 {} \+
sudo find /var/www -type f -exec chmod 640 {} \+

виконайте таку ж роботу, як і наступні 8 команд:

sudo chgrp -R www-data /var/www
sudo find /var/www -type d -exec chmod g+rx {} +
sudo find /var/www -type f -exec chmod g+r {} +
sudo chown -R ubuntu /var/www/
sudo find /var/www -type d -exec chmod u+rwx {} +
sudo find /var/www -type f -exec chmod u+rw {} +
sudo find /var/www -type d -exec chmod g+s {} +
sudo chmod -R o-rwx /var/www/
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.