У меня довольно стандартный сервер, работающий под управлением 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 webmasters
sudo adduser $USER webmasters
sudo chown -R root:webmasters /var/www
sudo 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
не добавляя его в эту группу?