У меня довольно стандартный сервер, работающий под управлением 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файлам по умолчанию:
sudo addgroup webmasterssudo adduser $USER webmasterssudo chown -R root:webmasters /var/wwwsudo find /var/www -type f -exec chmod 664 {} \;sudo find /var/www -type d -exec chmod 775 {} \;sudo find /var/www -type d -exec chmod g+s {} \;sudo chown -R www-data:webmasters application/cache/[так далее...]
Теперь выйдите и войдите снова, чтобы изменения вступили в силу.
Предыдущий набор команд выполняет следующие действия:
- Создайте новую группу с именем
webmasters; все пользователи, которым необходим доступ на запись к файлам приложения, будут добавлены в эту группу. - добавляет текущего пользователя (
$USER) вwebmastersгруппу. - меняет владельца
/var/wwwнаrootи группу наwebmastersгруппу. - добавляет 664 разрешения (-rw-rw-r--) для всех файлов в
/var/www. - добавляет 775 разрешений (drwxrwxr-x) для всех каталогов в
/var/www. - устанавливает бит SGID
/var/wwwи все каталоги в нем; этот последний пункт имеет некоторые объяснения. Также обратите внимание, что вы можете также поставить 2 в передней части восьмеричного chmod (например, 2644), чтобы сделать то же самое. - устанавливает владельца
www-data(пользователя Apache) и группу предоставленного каталога вwebmaster. Это гарантирует, что каталог будет доступен для записи Apache и всем членамwebmastersгруппы. Сделайте то же самое для всех других каталогов, которые должны быть доступны для записи.
/var/wwwне добавляя его в эту группу?