У дозволі SFTP відмовлено у файлах, що належать www-data


23

У мене досить стандартний сервер, налаштований під управлінням Apache та PHP. Додаток, який я запускаю, створює файли, якими володіє користувач Apache www-data. Файли, які я завантажую через SFTP, належать моєму власному користувачеві charlesr. Усі файли входять до www-dataгрупи. Моя проблема полягає в тому, що я не можу змінювати або перезаписувати жоден файл через SFTP, який належить www-data, хоча він charlesrє частиною www-dataгрупи. Я можу змінити файли без проблем через сеанс SSH.

Тож я не впевнений, що робити. Як я можу надати дозволу на сеанс SFTP для зміни www-dataвласних файлів?

Трохи тла це нотатки, які я написав для себе під час налаштування сервера:

Now set up permissions on `/var/www` where your files are served from by
default:

$ sudo adduser $USER www-data
$ sudo chgrp -R www-data /var/www
$ sudo chmod -R g+rw /var/www
$ sudo chmod -R g+s /var/www

Now log out and log in again to make the changes take hold.

The previous set of commands does the following:

1. adds the current user ($USER) to the `www-data` group;
2. changes `/var/www` to belong to the `www-data` group;
3. adds read/write permissions to the group that `/var/www` belongs to;
4. sets the SGID bit on `/var/www`; this final point bears some explaining.

А потім продовжую пояснювати собі, що означає встановлення біта SGID (тобто всі файли, створені в, автоматично /var/wwwстають частиною www-dataгрупи).


ОНОВЛЕННЯ

Здається, що проблему спричинив сам додаток або, точніше, рамки програми ( Kohana ), встановивши певні файли, на які він пише 0644 (rw-r - r--); тобто не підлягає запису на групу. Це в поєднанні з тим, що вони також належать до www-dataтого, що я не можу редагувати файли через SFTP під час входу як charlesr. Я не впевнений, чому я міг редагувати файли через SSH. Я здогадуюсь, що я повинен був використовувати судо.

Ось стратегія дозволів, яку я зараз використовую завдяки невтомній допомозі Марті Фрід , який вказав на недоліки в моїй попередній стратегії, а також допоміг мені маринувати у світі дозволів Linux, поки я нарешті не заграв її. Дякую Марти!

Огляд

  • Файли та каталоги в Росії /var/wwwповинні належатиroot:webmasters
  • Усі розробники повинні бути членами webmastersгрупи
  • Усі каталоги в: /var/wwwслід встановити на: 2775або u=rwx,g=rwxs,o=rx(rwxrwx-rx)
  • Усі файли в файлі /var/wwwповинні бути встановлені на: 0664або ug=rw,o=r(rw-rw-r--)

Ним слід володіти www-data:webmasters(тобто це каталоги, до яких Apache повинен мати змогу писати):

  • додаток / кеш
  • додаток / журнали
  • завантажити
  • client_helpers / upload

ЯК

Щоб налаштувати дозволи на те, /var/wwwзвідки файли подаються за замовчуванням:

  1. sudo addgroup webmasters
  2. sudo adduser $USER webmasters
  3. sudo chown -R root:webmasters /var/www
  4. sudo find /var/www -type f -exec chmod 664 {} \;
  5. sudo find /var/www -type d -exec chmod 775 {} \;
  6. sudo find /var/www -type d -exec chmod g+s {} \;
  7. sudo chown -R www-data:webmasters application/cache/ [тощо ...]

Тепер вийдіть із системи та увійдіть знову, щоб зміни відбулися.

Попередній набір команд виконує наступні дії:

  1. Створіть нову групу під назвою webmasters; всі користувачі, яким потрібен доступ для запису до файлів додатків, будуть додані до цієї групи.
  2. додає поточного користувача ( $USER) до webmastersгрупи.
  3. змінює власника /var/wwwдо rootта групу на webmastersгрупу.
  4. додає 664 дозволи (-rw-rw-r--) до всіх файлів у /var/www.
  5. додає 775 дозволів (drwxrwxr-x) до всіх каталогів у /var/www.
  6. встановлює біт SGID /var/wwwі всі каталоги в ньому; цей заключний пункт містить деякі пояснення. Зауважте також, що ви можете також поставити 2 у передній частині вашої чмоподібної вічки (наприклад, 2644), щоб зробити те саме.
  7. встановлює власника www-data(користувач Apache) та групу наданого каталогу webmaster. Це забезпечує те, що Apache та будь-хто в webmastersгрупі може мати доступ до каталогу . Зробіть те саме для всіх інших каталогів, які потребують запису.

Відповіді:


10

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

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

Можливо, мені чогось не вистачає, але ваша проблема повинна бути досить відвертою. Користувач, який увійшов у систему за допомогою sftp, повинен бути членом групи www-data, і файли, які ви намагаєтесь змінити, повинні мати дозволи на запис для www-даних групи. Мені немає сенсу, що ви можете змінювати файли за допомогою ssh, але не використовуючи sftp; ви впевнені, що входите в один і той же обліковий запис для обох? У sftp ви можете ввести команди, такі як !groupsсписок груп або !whoamiперевірити, яке ім’я для входу ви використовуєте. Результати повинні відповідати тому, що ви бачите за допомогою ssh (з тими ж командами мінус знак оклику).

Ви також повинні мати можливість використовувати chmod, chown, chgrp від sftp, якщо у вас є дозвіл на це.

До речі, я думаю, що у вашому списку є хоча б одна досить погана команда:

sudo chmod -R g+rw /var/www

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

Примітка. Це була помилка з мого боку. Завдяки DonalLafferty за вказівку на це, що він вказує "g", а не "a", тому він змінює лише групові дозволи. Мої стомлені старі очі (або поганий шрифт), мабуть, читали це як "а".

Правки для уточнення

Зазвичай файли, створені Apache, доступні лише для читання як для групи даних www, так і для всіх інших користувачів, як і файли, що належать кореням у / var / www. Отже, не повинно бути жодних причин робити когось членом www-data. Проблема полягає в наданні доступу всім для запису, що є іншим випадком. Це слід зробити, зробивши доступні конкретні каталоги на вашому веб-сайті, і це робиться просто за допомогою chmod, або з sudo, оскільки він, ймовірно, належить root, або шляхом власника власника і не використовує sudo.

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

drwxrwxr-x  ##  webmasters     webmasters   #### ####-##-## ##:##  mysite.com

Більше змін

З того часу я зрозумів, що вам не потрібно створювати користувачів "вебмайстрів", а лише групу. Тоді до файлів може належати root: webmasters, тобто root - власник, але вебмайстри - це група.

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

Але Apache може читати файли, навіть які належать root. Практично до всіх файлів доступний для читання в світі, просто не піддається запису. Тож, якщо ви не хочете змінити це, Apache не потрібно входити до групи веб-майстрів.

Це все базове налаштування Linux, а не Apache. Apache дбає лише про доступ з веб-сервера, і це встановлено файлами конфігурації. З цієї причини посилання на документацію Ubuntu, яку я включив у свою посаду, слід вважати кращим джерелом, ніж публічна вікі.

До речі, у кулінарній книзі O'Reilly Apache сказано: "Документи для документів, такі як htdocs, cgi-bin та піктограми, повинні мати дозволи, встановлені таким чином, що має найбільш сенс для моделі розробки вашого конкретного веб-сайту, але жоден із цих каталогів або файлів, що містяться в них, не повинен писати користувач веб-сервера. "

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


Привіт @ смачненький, дякую за відповідь, це дає мені багато спробувати. Re. ваші запитання. Я зібрав інформацію разом із різних джерел (звідси я записав її у свій посібник із власного використання) і не можу згадати точне джерело. Хоча я не використовував саме це джерело (рішення 1) (я тільки що знайшов його), воно дає хороші обґрунтування для мого рішення. У згадуваному вами посібнику Apache рекомендується створити групу під назвою "веб-майстри", але якби я це зробив, як би Apache писав у /var/wwwбез додавання його до цієї групи?
Чарльз Ропер

І мені дійсно потрібно , щоб дати іншим користувачам доступ до /var/wwwтак я думав , даючи доступ до групи www-dataі зробити кожен член цієї групи буде хорошим рішенням. Зараз я бачу проблему, що Apache може перезаписати будь-який файл там. Зважаючи на те, що лише 2 розробники (до яких я входить) мають доступ до коду, він є відносно безпечним у короткий термін.
Чарльз Ропер

1
Дякую Марти Ця частина з кулінарної книги Apache засміяла мене: "Ви повинні знати, що якщо ви запитаєте 12 людей про правильні способи встановлення дозволу на файл на сервері Apache, ви отримаєте десяток різних відповідей". Ви мені дали найбільше все, що мені потрібно, щоб досягти успіху зараз. Дуже дякую за ваш час. :-)
Чарльз Ропер

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

1
AFAIK, sudo chmod -R g + rw / var / www надає 'груповий' доступ. Використовуйте "a + rw" для доступу до світу.
Donal Lafferty

7

Я помітив, що ви не використовували chown.

Щоб правильно встановити право власності на файли / папки, ви можете встановити весь каталог таким чином: chown -R www-data:www-data

Це встановлює право власності на групу www-dataта користувачаwww-data

Також це можна зробити як тимчасове вирішення:

chmod 777 /var/data/<filename> або chmod 777 /var/data/<foldername>

відредагуйте файли, якщо потрібно, тоді

chmod 644 /var/data/<filename> або chmod 755 /var/data/<foldername>

Будьте обережні, використовуючи перемикач "-R", оскільки він також змінює дозволи для всіх підфайлів і папок.

664 - це стандартні дозволи файлу Apache, а 755 - стандартні дозволи для папок.

Сподіваюся, це допомагає :)

Зірка


Привіт, дякую, що знайшли час для відповіді, це дуже вдячно. Однак це не дуже допомагає. Порушення файлів робить ВСІ з них немодифікованими при використанні SFTP (настільки протилежне тому, що я після!). Я не можу реально використовувати вирішення chmod, оскільки а) у мене немає дозволів на chmod у SFTP; b) Мені не дуже хочеться входити через SSH, змінювати дозволи, робити SFTPing, змінювати назад тощо; і c) деякі файли мають різні дозволи з міркувань безпеки, тому я не можу ходити масово.
Чарльз Ропер

Що таке /var/data? Крім того, який каталог ви пропонуєте використовувати команду chown -R www-data:www-data? Сподіваюсь, що ні /var/www.
Марті Фрід
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.