当前位置: 首页>>技术教程>>正文


permissions – www-data 拥有的文件的 SFTP 权限被拒绝

, ,

问题描述

我有一个非常标准的服务器设置,运行 Apache 和 PHP。我正在运行的应用程序创建文件,这些文件归 Apache 用户 www-data 所有。我通过 SFTP 上传的文件归我自己的用户 charlesr 所有。所有文件都是 www-data 组的一部分。我的问题是我无法通过 SFTP 修改或覆盖 www-data 拥有的任何文件,即使 charlesrwww-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 中的所有目录都应设置为:2775u=rwx,g=rwxs,o=rx (rwxrwx-r-x)

  • /var/www 中的所有文件都应设置为:0664ug=rw,o=r (rw-rw-r–)

以下内容应归 www-data:webmasters 所有(即这些是 Apache 需要能够写入的目录):

  • 应用程序/缓存

  • 应用程序/日志

  • 上传

  • client_helpers/上传

HOWTO

要在默认情况下提供文件的 /var/www 上设置权限:

  1. sudo addgroup webmasters

  2. sudo adduser $USER webmasters

  3. sudo chown -R root:webmasters /var/www

  4. sudo find /var/www -type f -exec chmod 664 {} \;

  5. sudo find /var/www -type d -exec chmod 775 {} \;

  6. sudo find /var/www -type d -exec chmod g+s {} \;

  7. sudo chown -R www-data:webmasters application/cache/ [等…]

现在注销并再次登录以使更改生效。

上一组命令执行以下操作:

  1. 创建一个名为 webmasters 的新组;所有需要对应用程序文件进行写入访问的用户都将添加到该组中。

  2. 将当前用户 ( $USER ) 添加到 webmasters 组。

  3. /var/www 的所有者更改为 root,将组更改为 webmasters 组。

  4. 664 permissions (-rw-rw-r–) 添加到 /var/www 中的所有文件。

  5. 775 permissions (drwxrwxr-x) 添加到 /var/www 中的所有目录。

  6. /var/www 和其中的所有目录上设置 SGID 位;最后一点需要解释一下。另请注意,您也可以在 chmod 八进制(例如 2644)的前面放一个 2 来做同样的事情。

  7. 将所有者设置为 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是标准文件夹权限。

希望这可以帮助 :)

星星

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/12275.html,未经允许,请勿转载。