问题描述
我有一个非常标准的服务器设置,运行 Apache 和 PHP。我正在运行的应用程序创建文件,这些文件归 Apache 用户 www-data
所有。我通过 SFTP 上传的文件归我自己的用户 charlesr
所有。所有文件都是 www-data
组的一部分。我的问题是我无法通过 SFTP 修改或覆盖 www-data
拥有的任何文件,即使 charlesr
是 www-data
组的一部分。我可以通过 SSH 会话毫无问题地修改文件。
所以我不知道该怎么做。如何授予我的 SFTP 会话权限以修改 www-data
拥有的文件?
稍微介绍一下背景,这些是我在 setting-up 服务器时为自己写的笔记:
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
所有,这意味着当 logged-in 为 charlesr
时,我无法通过 SFTP 编辑文件。我不确定为什么我可以通过 SSH 编辑文件。我的猜测是我一定用过 sudo。
这是我现在使用的权限策略,感谢 tireless help of Marty Fried ,他指出了我之前策略中的缺陷,并帮助我在 Linux 权限的世界中进行了腌制,直到我最终理解它。谢谢马蒂!
Overview
-
/var/www
中的文件和目录应该归root:webmasters
所有 -
所有开发者都应该是
webmasters
组的成员 -
/var/www
中的所有目录都应设置为:2775
或u=rwx,g=rwxs,o=rx
(rwxrwx-r-x) -
/var/www
中的所有文件都应设置为:0664
或ug=rw,o=r
(rw-rw-r–)
以下内容应归 www-data:webmasters
所有(即这些是 Apache 需要能够写入的目录):
-
应用程序/缓存
-
应用程序/日志
-
上传
-
client_helpers/上传
HOWTO
要在默认情况下提供文件的 /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 permissions (-rw-rw-r–) 添加到
/var/www
中的所有文件。 -
将 775 permissions (drwxrwxr-x) 添加到
/var/www
中的所有目录。 -
在
/var/www
和其中的所有目录上设置 SGID 位;最后一点需要解释一下。另请注意,您也可以在 chmod 八进制(例如 2644)的前面放一个 2 来做同样的事情。 -
将所有者设置为
www-data
(Apache 的用户),将提供的目录的组设置为webmaster
。这确保目录可由 Apache 和webmasters
组中的任何人写入。对需要可写的所有其他目录执行相同操作。
最佳方法
Ubuntu.com 有很好的服务器指南,例如 Apache guide 。你从哪里得到你这么仔细写下的程序?我从来没有为我设置的任何服务器遇到那么多麻烦,尽管我愿意接受我没有做对的可能性 – 而且,我实际上没有安装服务器任何非常公开或非常大的东西,所以可能存在我不知道的安全漏洞。
但是,我从来不需要成为 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-owned 文件相同。因此,没有理由让任何人成为 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 保存的内容。还要考虑到,大多数运行 Apache 的共享 Web 托管没有 shell 访问权限甚至无法设置组。
但是,Apache 甚至可以读取 root 拥有的文件。几乎所有文件都有 world-readable 访问权限,只是不可写。所以,除非你想改变这一点,Apache 不需要在网站管理员组中。
这都是基本的 Linux 设置,而不是真正的 Apache。 Apache 只关心来自 Web 服务器内部的访问,这是由配置文件设置的。出于这个原因,我在我的帖子中包含的 Ubuntu 文档链接应该被认为是比公共 wiki 更好的来源。
顺便说一句,O’Reilly Apache Cookbook 说“文档目录,例如 htdocs、cgi-bin 和图标,必须以对您的特定网站的开发模型最有意义的方式设置权限,但在在任何情况下,Web 服务器用户都不应写入其中包含的任何这些目录或文件。”
最后,如果您需要更多控制,使用 ACL 是设置文件权限的好方法。这甚至可能是一直设置它们的好方法,这是我应该调查的事情。
次佳方法
我注意到你没有使用 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是标准文件夹权限。
希望这可以帮助 :)
星星