Отказано в разрешении SFTP для файлов, принадлежащих www-данным

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. Я предполагаю, что я должен был использовать sudo.

Вот стратегия разрешений, которую я сейчас использую благодаря неустанной помощи Марти Фрида , который указал на недостатки моей предыдущей стратегии и также помог мне мариноваться в мире разрешений 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 / загрузить

КАК

Чтобы установить права доступа к /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 в передней части восьмеричного chmod (например, 2644), чтобы сделать то же самое.
  7. устанавливает владельца www-data(пользователя Apache) и группу предоставленного каталога в webmaster. Это гарантирует, что каталог будет доступен для записи Apache и всем членам webmastersгруппы. Сделайте то же самое для всех других каталогов, которые должны быть доступны для записи.
Чарльз Ропер
источник

Ответы:

10

Ubuntu.com имеет довольно хорошие серверные руководства, такие как руководство Apache . Где вы получили свои процедуры, которые вы так тщательно записали? Мне никогда не приходилось сталкиваться с такими сложностями для любого из серверов, которые я настроил, хотя я открыт для вероятности того, что я не все сделал правильно, а также я фактически не устанавливал серверы для все, что является публичным или очень большим, так что могут быть дыры в безопасности, о которых я не знаю.

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

Возможно, я что-то упустил, но ваша проблема должна быть довольно простой. Пользователь, вошедший в систему с использованием sftp, должен быть членом группы www-data, а файлы, которые вы пытаетесь изменить, должны иметь права на запись для группы www-data. Для меня не имеет смысла изменять файлы, используя 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-data, так и для всех других пользователей, так же, как файлы, принадлежащие пользователю root, в / var / www. Таким образом, не должно быть никаких причин делать кого-либо членом www-data. Проблема в том, что каждый может получить доступ к записи, а это другой случай. Это следует сделать, сделав определенные каталоги доступными на вашем сайте, и это можно сделать просто с помощью chmod, либо с sudo, поскольку он, вероятно, принадлежит root, либо путем создания владельца самостоятельно, а не с использованием sudo.

Если у вас есть больше разработчиков, которым нужен доступ ко всему сайту, то есть, когда вы хотите создать группу пользователей +, например, «веб-мастеров», сделать ее владельцем сайта, дать разрешения на запись для этой группы и сделать всех участников разработки. этой группы. Таким образом, список каталогов сайта будет выглядеть примерно так:

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

Больше правок

С тех пор я понял, что вам не нужно создавать пользователя "веб-мастеров", просто группу. Тогда файлы могут принадлежать пользователю root: веб-мастерам, то есть root является владельцем, а веб-мастерами является группа.

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

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

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

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

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

Марти Фрид
источник
Привет, @ marty-fried, спасибо за ответ, это дает мне много возможностей попробовать. Число рейнольдса ваши вопросы. Я собрал информацию из разных источников (поэтому я записал ее в свое руководство по использованию) и не могу вспомнить точный источник. Хотя я не использовал этот конкретный источник (решение 1) (я только что нашел его), он дает хорошее обоснование для моего решения. В руководстве Apache, которое вы упоминаете, он рекомендует создать группу под названием «веб-мастера», но если бы я это сделал, как бы Apache писал в, /var/wwwне добавляя его в эту группу?
Чарльз Ропер
И мне действительно нужно предоставить доступ другим пользователям, /var/wwwпоэтому я подумал, что предоставление группового доступа www-dataи включение всех в эту группу будет хорошим решением. Теперь я вижу проблему с тем, что Apache может перезаписать там любой файл. Учитывая, что только 2 разработчика (включая меня) имеют доступ к коду, это относительно безопасно в краткосрочной перспективе.
Чарльз Ропер
1
Спасибо Марти. Эта часть из Apache Cookbook заставила меня смеяться: «Вы должны знать, что если вы спросите 12 человек о правильных способах установки прав доступа к файлам на вашем сервере Apache, вы получите дюжину разных ответов». Вы дали мне почти все, что мне нужно для прогресса сейчас. Большое вам спасибо за ваше время. :-)
Чарльз Ропер
1
Я тоже кое-что узнал, поэтому мне нравятся подробные обсуждения - обычно это помогает прояснить некоторые туманные моменты. Я в основном программист , который получает просят проблем исправить и настроить веб - сайты, так что я всегда учусь лучшие способы сделать вещи. Не стесняйтесь спрашивать, есть ли другие вопросы.
Марти Фрид
1
AFAIK, sudo chmod -R g + rw / var / www дает групповой доступ. Используйте «+ RW» для доступа к миру.
Донал Лафферти
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 - стандартные разрешения для папок.

Надеюсь это поможет :)

звезда

StarBlessed
источник
Привет, спасибо, что нашли время ответить, это очень ценится. Однако, это не помогает. Chowning файлов делает все из них неизменяемым при использовании SFTP (так рода противоположностью того, что я после этого !). Я не могу использовать CHMOD обходного пути , потому что а) у меня нет разрешения на CHMOD в SFTP; б) Я не хочу , чтобы войти через SSH, изменение прав доступа, сделать мой SFTPing, изменение спины и т.д .; и c) некоторые файлы имеют разные разрешения по соображениям безопасности, поэтому я не могу chmod массово.
Чарльз Ропер
Что такое /var/data? Кроме того , что каталог вы предлагаете ему использовать команду chown -R www-data:www-data? Надеюсь , что нет /var/www.
Marty Фрид