我有一个运行Apache和PHP的标准服务器。我正在运行的应用程序会创建文件,这些文件归Apache用户所有www-data
。我通过SFTP上传的文件归我自己的用户所有charlesr
。所有文件都属于该www-data
组。我的问题是www-data
,即使charlesr
属于该www-data
组,我也无法通过SFTP修改或覆盖任何文件,这些文件归拥有。我可以通过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。
这是我现在使用的权限策略,这要归功于Marty Fried的不懈帮助,他指出了我以前的策略中的缺陷,并且还帮助我在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
及其上的所有目录;最后一点需要一些解释。还要注意,您也可以在chmod八进制(例如2644)的前面放置2来执行相同的操作。 - 将所有者设置为
www-data
(Apache的用户),并将提供的目录组设置为webmaster
。这样可以确保该目录可被Apache和webmasters
组中的任何人写入。对所有其他需要写入的目录执行相同的操作。
/var/www
而不将其添加到该组中呢?