Cha*_*per 23 permissions apache2 sftp
我有一个运行 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.
Run Code Online (Sandbox Code Playgroud)
然后我继续向自己解释设置 SGID 位意味着什么(即所有创建的文件都会自动/var/www
成为www-data
组的一部分)。
更新
问题似乎是由应用程序本身引起的,或者更具体地说,是应用程序框架 ( Kohana ) 将其写入的某些文件设置为 0644 (rw-r--r--);即不可组写。这一点,再加上文件也归所有者所有,www-data
这意味着我在以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 需要能够写入的目录):
要设置/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
to的所有者更改root
为webmasters
group并将组更改为group。/var/www
./var/www
./var/www
和其中的所有目录;最后一点需要解释一下。另请注意,您也可以在 chmod 八进制(例如 2644)的前面放一个 2 来做同样的事情。www-data
(Apache 的用户)并将所提供目录的组设置为webmaster
. 这确保了 Apache 和webmasters
组中的任何人都可以写入该目录。对需要可写的所有其他目录执行相同操作。Mar*_*ied 10
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 来完成。
如果你有更多的开发者需要访问整个网站,那就是当你想建立一个用户+组,比如“网站管理员”,让它成为网站的所有者,赋予该组写入权限,并让所有开发者成为成员那个组的。因此,站点目录的列表将类似于:
drwxrwxr-x ## webmasters webmasters #### ####-##-## ##:## mysite.com
Run Code Online (Sandbox Code Playgroud)
更多编辑
从那以后,我意识到您实际上并不需要创建用户“网站管理员”,只需创建一个组即可。那么文件可以归root:webmasters所有,即root是所有者,webmasters是组。
在回答以下问题时,Apache 写入的文件将归 www-data 和 www-data 组所有。这些文件通常不是您写入的内容,因此 www-data 的非成员可能具有只读访问权限 - 我认为这取决于目录权限。如果您确实需要的不仅仅是偶尔的写访问权限,那么将自己添加到组中可能会很有用。通常,您将特定目录设为可写入 Apache 保存的内容。还要考虑到大多数运行 Apache 的共享 Web 托管没有 shell 访问权限甚至无法设置组。
但是,Apache 甚至可以读取 root 拥有的文件。几乎所有文件都有世界可读的访问权限,只是不可写。所以,除非你想改变这一点,Apache 不需要在网站管理员组中。
这都是基本的 Linux 设置,而不是真正的 Apache。Apache 只关心来自 Web 服务器内部的访问,这是由配置文件设置的。出于这个原因,我在我的帖子中包含的 Ubuntu 文档链接应该被认为是比公共 wiki 更好的来源。
顺便说一句,O'Reilly Apache Cookbook 说“文档目录,例如 htdocs、cgi-bin 和图标,必须以对您的特定网站的开发模型最有意义的方式设置权限,但在任何情况下,这些目录或其中包含的文件都不应由 Web 服务器用户写入。”
最后,如果您需要更多控制,使用 ACL 是设置文件权限的好方法。这甚至可能是一直设置它们的好方法,这是我应该调查的事情。
小智 7
我注意到你没有使用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是标准文件夹权限。
希望这可以帮助 :)
星星
归档时间: |
|
查看次数: |
75305 次 |
最近记录: |