Як налаштувати дозволи Linux для папки WWW?


69

Оновлено резюме

Каталог / var / www є власником, root:rootщо означає, що ніхто не може ним користуватися, і це абсолютно марно. Оскільки всі ми хочемо, щоб веб-сервер насправді працював (і ніхто не повинен входити в систему як "root"), то нам потрібно це виправити.

Лише двом організаціям потрібен доступ.

  1. Усі PHP / Perl / Ruby / Python потребують доступу до папок і файлів, оскільки вони створюють багато з них (тобто /uploads/). Ці мови сценаріїв повинні працювати під nginx або apache (або навіть якоюсь іншою подією, як FastCGI для PHP).

  2. Розробники

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


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

Які дозволи потрібно використовувати, /var/wwwщоб:

  1. Керування джерелами, як git або svn
  2. Користувачі в такій групі, як "веб-сайти" ( або навіть додані до "www-data" )
  3. Сервери типу apache або lighthttpd
  4. І PHP / Perl / Ruby

чи можуть усі там читати, створювати та запускати файли (та каталоги)?

Якщо я маю рацію, сценарії Ruby та PHP не "виконуються" безпосередньо, а передаються інтерпретатору. Тож немає необхідності в дозволі на виконання файлів у /var/www...? Тому, схоже, правильний дозвіл був би, chmod -R 1660який би робив

  1. всі файли, якими можна ділитися цими чотирма об'єктами
  2. всі файли не виконуються помилково
  3. блокувати всіх інших із каталогу повністю
  4. встановіть режим дозволу "липким" для всіх майбутніх файлів

Це правильно?

Оновлення 1: Я щойно зрозумів, що файли та каталоги можуть потребувати різних дозволів - я вже говорив про файли вище, тому я не впевнений, якими будуть потрібні дозволи для каталогу.

Оновлення 2: Структура папок /var/wwwрізко змінюється, оскільки одне з чотирьох вищезазначених об'єктів завжди додає (а іноді і видаляє) папки та підпапки на багато рівнів. Вони також створюють та видаляють файли, до яких іншим 3 об’єктам може знадобитися доступ для читання / запису. Тому в дозволах потрібно виконати чотири вищезазначені дії як для файлів, так і для каталогів. Оскільки жоден з них не потребує дозволу на виконання (див. Питання про ruby ​​/ php вище), я б припустив, що rw-rw-r--дозвіл буде усім необхідним і повністю безпечним, оскільки цими чотирма об’єктами управляє довірений персонал (див. №2) та всі інші користувачі на у системі є лише доступ для читання.

Оновлення 3: Це для персональних машин розвитку та серверів приватних компаній. Жодних випадкових "веб-клієнтів", як спільний хост.

Оновлення 4: Ця стаття від slicehost здається найкращою для пояснення того, що потрібно для налаштування дозволів для вашої папки www. Однак я не впевнений, який користувач або група apache / nginx з PHP OR svn / git запускаються як і як їх змінити.

Оновлення 5: Я (я думаю) нарешті знайшов спосіб змусити це все працювати (відповідь нижче). Однак я не знаю, чи це правильний і БЕЗПЕЧНИЙ спосіб зробити це. Тому я розпочав щедроту. Перемагає людина, яка має найкращий метод забезпечення та керування www-каталогом.

Відповіді:


47

Після додаткових досліджень здається, що ще одним (можливо, кращим способом) відповісти на це було б так, щоб налаштувати папку www так.

  1. sudo usermod -a -G developer user1 (додати кожного користувача до групи розробників)
  2. sudo chgrp -R developer /var/www/site.com/ щоб розробники могли працювати там
  3. sudo chmod -R 2774 /var/www/site.com/ так що лише розробники можуть створювати / редагувати файли (читати можуть інші користувачі світу)
  4. sudo chgrp -R www-data /var/www/site.com/uploads щоб www-дані (apache / nginx) могли створювати завантаження.

Оскільки він gitпрацює так, як його називає будь-який користувач, тоді, поки користувач перебуває в групі «розробник», вони повинні мати можливість створювати папки, редагувати файли PHP та керувати сховищем git.

Примітка. На кроці (3): "2" в 2774 означає "встановити ідентифікатор групи" для каталогу. Це призводить до того, що нові файли та підкаталоги, створені в ньому, успадковують ідентифікатор групи батьківського каталогу (замість первинної групи користувача) Довідка: http://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories


Мені здається розумним.
wazoox

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

Ви не вказуєте, хто буде власником файлів. Ви залишили б це як корінь? Тоді лише sudoers може редагувати папку для завантаження (можливо, не те, що ви задумали).
Nic

Так, root залишатиметься власником. Однак, оскільки власник групи зараз "розробник" (і має дозвіл wrx), то всі диски (і apache / nginx) також могли читати. Судо не потрібно.
Xeoncross

7
Ще одна річ, на яку слід дивитися - це умаск. У багатьох системах використовується umask за замовчуванням 022, який видалить дозволи на запис як для групових, так і для загальнодоступних нових файлів. Я підозрюю, що ви хочете 002 (без запису для публіки) або 007 (немає доступу для публіки). Ви можете встановити umask у конфігурації Apache та / або скриптах запуску для будь-якого процесу, який потребує доступу до каталогу. Не забудьте додати це до / etc / profile або / etc / bashrc, щоб воно було встановлено за замовчуванням і для ваших розробників
Марк Портер

8

Я не впевнений, чи правильно це ", але ось що я роблю на своєму сервері:

  • / var / www містить папку для кожного веб-сайту.
  • Кожен веб-сайт має визначеного власника, який встановлюється як власник усіх файлів і папок у каталозі веб-сайту.
  • Усі користувачі, які підтримують веб-сайт, складаються в групу для веб-сайту.
  • Ця група встановлена ​​як власник групи всіх файлів і папок у каталозі.
  • Будь-які файли або папки, які потрібно записати веб-сервером (наприклад, PHP), змінили власника на www-data, користувача, під яким працює апаш.

Майте на увазі, що вам слід увімкнути біт виконання у каталогах, щоб ви могли перелічити вміст.


Як тоді git / svn або PHP створюють нові папки?
Xeoncross

2
PHP працює в тому ж користувальницькому контексті, що і веб-сервер, тому він може створювати файли та папки в будь-якому каталозі, що належить веб-серверу. Як правило, лише кілька папок на зразок цієї (/ завантаження / наприклад). Я не впевнений у git / svn - чи можете ви додати їх до групового облікового запису, який контролює веб-сайт?
Nic

мабуть, git працює так, як користувач працює ним - як і будь-який інший інструмент.
Xeoncross

Потім додайте користувача git до групи apache та надайте групі папок дозволи на запис.
Девід Рікман

Я щойно сказав, що у git немає користувача - він працює як поточний користувач, який ним користується.
Xeoncross

7

Після проведення додаткових досліджень, схоже, що git / svn TOOLS НЕ є проблемою, оскільки вони працюють так, як користувач ними користується. (Однак демони git / svn - це інша справа!) Все, що я створив / клонував за допомогою git, мав свої дозволи, і інструмент git був перелічений, у /usr/binякому відповідає ця теза.

Дозвіл Git вирішено.

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

Тож здається, що одна відповідь на це питання виглядає так:

За замовчуванням /var/wwwналежить root:rootі ніхто не може там додавати та змінювати файли.

1) Зміна власника групи

Спочатку нам потрібно змінити групу каталогів www, що належить їй "www-data", а не "root"

sudo chgrp -R www-data /var/www

2) Додайте користувачів до www-даних

Потім нам потрібно додати поточного користувача (і будь-кого іншого) до групи даних www

sudo usermod -a -G www-data demousername

3) Веб-каталог CHMOD

Змініть дозволи, щоб ТОЛЬКО власник (root) та всі користувачі групи "www-data" змогли rwx (читати / записувати / виконувати) файли та каталоги ( ніхто інший навіть не повинен мати доступ до нього ).

sudo chmod -R 2770 /var/www

Тепер усі файли та каталоги, створені будь-яким користувачем, який має доступ (тобто у групі "www-data"), будуть читатись / записуватися апашем, а отже, і php.

Це правильно? Що з файлами, які створюють PHP / Ruby - чи можуть користувачі www-даних отримувати доступ до них?


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

Гаразд, я знаю, що я використовую PHP для створення безлічі файлів з текстом, дьогтем, журналом та зображеннями (плюс папки), тому я просто припускав, що все має бути написаним для запису. Однак, можливо, ваше право і PHP повинні бути здатні змінити лише ФАЙЛИ, ЩО СТВОРИТЬСЯ, що було б нешкідливо, оскільки 99% усіх PHP-програм ніколи не створює файли сценаріїв. Інший вибір, здається, полягає в тому, щоб дозволити лише певні каталоги PHP писати доступ (/ uploads /), який не робиться з тих пір, оскільки тоді PHP все ще можна використовувати для створення чогось поганого там. Будь-які ідеї?
Xeoncross

2
Намагайтеся зберігати окремий сценарій та дані. Навіть якщо зловмисникові вдасться щось скинути в / uploads, це не повинно бути виконаним. Безпека в шарах є ключовою.
Nic

6

Клейкість не є дозволом успадкування. Липкість у каталозі означає, що лише власник файлу або власник каталогу може перейменувати або видалити цей файл у каталозі, незважаючи на те, що в дозволах сказано інше. Таким чином, 1777 р. / Tmp /.

У класичному Unix немає спадкування дозволів на основі файлової системи, лише на поточному umask процесу. У * BSD або Linux із встановленою конфігурацією каталогу, групове поле новостворених файлів буде встановлено таким же, як і у батьківського каталогу. Щоб отримати більше інформації, вам потрібно переглянути ACL, із "ACL" для каталогів за замовчуванням, які дозволяють успадкувати дозволи.

Спершу слід визначитися з: * які користувачі мають доступ до системи * яка ваша модель загрози

Наприклад, якщо ви робите веб-хостинг з кількома клієнтами, і ви не хочете, щоб вони бачили файли один одного, то ви можете використовувати загальну групу "webcusts" для всіх цих користувачів та режим каталогів 0705. Потім файли обслуговуються процес веб-сервера ( не в "webcusts") побачить Інші візитки та буде дозволений; клієнти не можуть бачити файли один одного, і користувачі можуть возитися зі своїми файлами. Однак це означає, що в момент дозволу CGI або PHP вам доведеться переконатися, що процеси працюють як конкретний користувач (у будь-якому випадку - добра практика для декількох користувачів на хості, для підзвітності). В іншому випадку клієнти можуть возитися з файлами один одного, зробивши це CGI.

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


Хороша відповідь. У MacOS X система поводиться так, ніби SGID біт автоматично знаходиться в каталогах. Клейкий біт зазвичай означає, що ви можете видалити файл лише тоді, коли зможете його написати. Тобто, будь-хто може видалити відкритий для редагування файл у / tmp. У MacOS X / tmp є символьним посиланням на приватний каталог для користувача, тому спільного доступу немає.
Джонатан Леффлер

Дякую за відповідь, я оновив питання ще більше інформації.
Xeoncross

Джонатан: клейкий біт означає, що лише власник каталогу, або власник файлу, може перейменовувати або видаляти його (тобто діяти при його внесенні у каталог «файл»). Дозволи на окремий файл не вживаються для цих операцій каталогу ( rename(), unlink()), лише для дій над самим файлом ( open()). Це "звичайна" поведінка.
Філ П

2

Я вірю, що найкращий спосіб зробити це - використання ACL Posix. З ними зручно працювати і пропонувати всі необхідні вам функції.

http://en.wikipedia.org/wiki/Access_control_list#Filesystem_ACLs


+1 за корисну інформацію про ACL. Однак я не хочу зайвих утисків системи, щоб просто управляти простим сервером з парою розробників. Мені також не комфортно перекомпілювати Kernel, щоб використовувати ACL.
Xeoncross

@Xeoncross: ACL нічого не збиває. Вони просто метейнформація, як звичайні дозволи файлів. Це не все так "зайво" і складно, я вважаю, що це найпростіший і найкращий спосіб управління дозволами, а не якийсь заплутаний клейкий / груповий / будь-який інший варіант рішення. Не бійтеся, просто пересчитайте acl і спробуйте!
борець за краватку

1

Власником файлу повинна бути особа, яка його створює, а група - www-data. Режим для каталогів / файлів тоді загалом 755/644. У той час як для каталогів і файлів група потребує доступу до запису, мод становить 775/664. Припустимо, педді є розробником. Загалом це робить:

chown -R paddy:www-data /var/www/websiteindevelopment
chmod -R 755 /var/www/websiteindevelopment
chmod -R 775 /var/www/websiteindevelopment/directorywritablebygroup
find /var/www/websiteindevelopment -type f -perm 755 -print -exec chmod 644 {} \;  
find /var/www/websiteindevelopment -type f -perm 775 -print -exec chmod 664 {} \;

0

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

sudo find /var/www -type d -exec chmod 775 {} \;  # Change permissions of directories to rwxrwxr-x
sudo find /var/www -type f -exec chmod 664 {} \;  # Change file permissions to rw-rw-r--

Це дозволить розробникам створювати та змінювати каталоги в / var / www. Що здається важливим, оскільки розробникам може знадобитися створити додаткові каталоги або видалити каталог, який більше не потрібен.

Це також дозволить розробникам створювати та змінювати файли коду (читати HTML, PHP-файли тощо). Але, як і раніше, буде доступний лише доступ для читання для всіх інших.

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