我有一个运行 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
)。
更新
问题似乎是由应用程序本身引起的,或者更具体地说,是由应用程序框架引起的(小花) 将某些文件设置为 0644 (rw-r--r--);即非组可写。再加上这些文件也归 拥有,这意味着www-data
我无法以 身份登录时通过 SFTP 编辑这些文件charlesr
。我不确定为什么我可以通过 SSH 编辑这些文件。我猜我一定是使用了 sudo。
这是我现在使用的权限策略,得益于Marty Fried 的不懈帮助,他指出了我之前策略的缺陷,还帮助我熟悉 Linux 权限的世界,直到我最终理解它。谢谢 Marty!
概述
- 文件和目录
/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 需要能够写入的目录):
- 应用程序/缓存
- 应用程序/日志
- 上传
- 客户端帮助程序/上传
如何
要设置/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/
[ETC...]
现在注销并重新登录以使更改生效。
上一组命令执行以下操作:
- 创建一个名为 的新组
webmasters
;所有需要对应用程序文件具有写权限的用户都将添加到此组。 - 将当前用户 (
$USER
) 添加到webmasters
组中。 /var/www
将的所有者更改为root
,并将组更改为webmasters
组。- 添加664 权限(-rw-rw-r--) 到 中的所有文件
/var/www
。 - 添加775 权限(drwxrwxr-x)到 中的所有目录
/var/www
。 - 设置 SGID 位
/var/www
及其中的所有目录;最后一点需要解释一下。还请注意,您也可以在 chmod 八进制数前面加上 2(例如 2644)来执行相同的操作。 - 将所有者设置为
www-data
(Apache 用户)并将所提供目录的组设置为webmaster
。这确保目录可由 Apache 和webmasters
组中的任何人写入。对需要可写的所有其他目录执行相同操作。
答案1
Ubuntu.com 有非常好的服务器指南,例如Apache 指南。你从哪里得到你如此仔细写下的程序?我从来没有为我设置的任何服务器费过这么多力气,尽管我承认我可能做得不对——而且,我实际上没有为任何非常公开或非常大的东西安装服务器,所以可能存在我不知道的安全漏洞。
但是,我从来不需要成为 www-data 组的成员,www 中没有源文件属于 www-data。我的理解是,Apache 仅将其用于自己的文件,它本身不会对任何其他文件具有写入权限,因为理论上,没有重要的文件会允许 www-data 具有写入权限。我猜 www-data 拥有的文件会向其他所有人授予只读权限,并且任何人都不应该对其文件具有写入权限。当然,我可能完全错了,如果我错了,我希望有人会告诉我并向我指出实际的文档,其中有不同的解释(而不是某个论坛,像我这样的随机互联网用户提供了对他有用的说明)。
也许我遗漏了什么,但您的问题应该相当简单。使用 sftp 登录的用户需要是 www-data 组的成员,并且您尝试修改的文件必须对 www-data 组具有写权限。您可以使用 ssh 修改文件,但不能使用 sftp 修改文件,这对我来说没有意义;您确定您登录的是同一个帐户吗?在 sftp 中,您可以输入命令,例如!groups
列出您的组,或!whoami
检查您正在使用的登录名。结果应该与您使用 ssh 看到的结果相匹配(使用相同的命令,但缺少感叹号)。
如果您有权限,您还应该能够使用 sftp 中的 chmod、chown 和 chgrp。
顺便说一句,我认为您的列表至少有一个非常糟糕的命令:
sudo chmod -R g+rw /var/www
这赋予了所有人对 /var/www 中每个文件和文件夹的写入权限。这听起来是个坏主意。通常,只有 root 才拥有这些目录的写入权限,除非特定目录需要更多权限,通常只有单个目录。
注意:这是我的错误。感谢 DonalLafferty 指出这一点,它指定了“g”,而不是“a”,因此它只会更改组权限。我疲惫的眼睛(或糟糕的字体)一定把它读成了“a”。
编辑澄清
通常,Apache 创建的文件对于 www-data 组和所有其他用户都是只读的,与 /var/www 中 root 拥有的文件相同。因此,没有理由让任何人成为 www-data 的成员。问题是给予每个人写访问权限,这是另一种情况。这应该通过在您的站点内提供特定目录来实现,只需使用 chmod 即可,可以使用 sudo,因为它可能由 root 拥有,或者您可以自己成为所有者而不使用 sudo。
如果您有更多开发人员需要访问整个网站,那么您需要创建一个用户+组(例如“webmasters”),使其成为网站的所有者,为该组授予写入权限,并让所有开发人员成为该组的成员。因此,网站目录的列表将类似于:
drwxrwxr-x ## webmasters webmasters #### ####-##-## ##:## mysite.com
更多编辑
从那时起,我意识到你实际上并不需要创建一个用户“webmasters”,只需创建一个组即可。然后文件可以由 root:webmasters 拥有,即 root 是所有者,但 webmasters 是组。
回答以下问题时,Apache 写入的文件将归 www-data 和 www-data 组所有。这些文件通常不是您写入的内容,因此 www-data 的非成员可能具有只读访问权限 - 我认为这取决于目录权限。如果您确实需要不止一次的写入访问权限,那么将自己添加到该组可能会很有用。通常,您会将特定目录设置为对 Apache 保存的内容可写入。还要考虑的是,大多数运行没有 shell 访问权限的 Apache 的共享网络托管甚至没有办法设置组。
但是,Apache 甚至可以读取 root 拥有的文件。几乎所有文件都具有世界可读的访问权限,只是不可写。因此,除非您想更改这一点,否则 Apache 不需要位于 webmasters 组中。
这些都是基本的 Linux 设置,并不是真正的 Apache。Apache 只关心来自 Web 服务器内部的访问,这是由配置文件设置的。因此,我帖子中包含的 Ubuntu 文档链接应该被视为比公共 wiki 更好的来源。
顺便说一句,O'Reilly Apache Cookbook 说“文档目录,例如 htdocs、cgi-bin 和 icons,必须以最适合您特定网站的开发模型的方式设置权限,但在任何情况下,这些目录或其中包含的文件都不应由 Web 服务器用户写入。”
最后,如果您需要更多控制,使用 ACL 是设置文件权限的好方法。它甚至可能是一种始终设置权限的好方法,这是我应该研究的东西。
答案2
我注意到你没有使用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 是标准文件夹权限。
希望这可以帮助 :)
星星