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


23

我有一个运行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应设置为: 2775u=rwx,g=rwxs,o=rx(rwxrwx-rx)
  • 中的所有文件/var/www应设置为: 0664ug=rw,o=r(rw-rw-r--)

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

  • 应用程序/缓存
  • 应用程序/日志
  • 上载
  • client_helpers /上传

如何

要设置/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/wwwroot,将组更改为webmasters分组。
  4. 向中的所有文件添加664权限(-rw-rw-r--)/var/www
  5. 向中的所有目录添加775权限(drwxrwxr-x)/var/www
  6. 设置SGID位/var/www及其上的所有目录;最后一点需要一些解释。还要注意,您也可以在chmod八进制(例如2644)的前面放置2来执行相同的操作。
  7. 将所有者设置为www-data(Apache的用户),并将提供的目录组设置为webmaster。这样可以确保该目录可被Apache和webmasters组中的任何人写入。对所有其他需要写入的目录执行相同的操作。

Answers:


10

Ubuntu.com有相当不错的服务器指南,例如Apache guide。如此仔细地写下来的程序是从哪里得到的?我从来没有为我设置的任何服务器带来那么多麻烦,尽管我很可能自己做的不正确-而且,我实际上并没有为任何非常公开或非常大的东西,因此可能存在我不知道的安全漏洞。

但是,我从来不需要成为www-data组的成员,并且www-data中没有www中的任何源文件。我的理解是,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即可,因为它可能是root拥有的,所以可以通过sudo使用chmod,或者由所有者自己拥有而不使用sudo。

如果您有更多需要访问整个站点的开发人员,也就是说,当您想要创建一个用户+组(例如“网站管理员”),使其成为站点的所有者,向该组授予写权限并让所有开发人员成为成员时,该组的。因此,网站目录的清单应类似于:

drwxrwxr-x  ##  webmasters     webmasters   #### ####-##-## ##:##  mysite.com

更多编辑

从那以后,我意识到您实际上并不需要创建用户“网站管理员”,而只是创建一个组。然后,文件可以由root:webmasters拥有,即root是所有者,而webmasters是组。

为了回答以下问题,Apache编写的文件将归www-data拥有,并归组为www-data。这些文件通常不是您要写入的文件,因此www-data的非成员可能具有只读访问权限-我认为这取决于目录权限。如果您确实需要偶尔的写访问权,那么将自己添加到组中可能会很有用。通常,您会将特定目录设置为世界可写状态,以供Apache保存的内容使用。还请考虑,大多数运行无Apache访问权限的Apache的共享Web托管甚至都无法设置组。

但是,Apache甚至可以读取root拥有的文件。几乎所有文件都具有世界可读的访问权限,只是不可写。因此,除非您要更改此设置,否则Apache不需要在webmasters组中。

这是所有基本的Linux设置,不是真正的Apache。Apache只关心从Web服务器内部进行的访问,而访问是由配置文件设置的。因此,我认为我的帖子中包含的Ubuntu文档链接比公共Wiki更好。

顺便说一句,O'Reilly Apache Cookbook说:“文档目录(例如htdocs,cgi-bin和图标)必须以最适合您特定网站的开发模型的方式设置权限,但是在任何情况下,Web服务器用户都不能写入其中的任何目录或文件。”

最后,如果需要更多控制,使用ACL是设置文件权限的好方法。甚至可能一直是设置它们的好方法,这是我应该研究的问题。


嗨@ marty-fried,感谢您的回答,它给了我很多尝试的机会。回覆。你的问题。我从各种来源将信息拼凑在一起(因此,为什么将其写到自己的使用指南中),却记不清确切的来源。尽管我没有使用此特定来源(解决方案1)(我只是找到了它),但它为我的决定提供了很好的理由。在您提到的Apache指南中,建议创建一个名为“ webmasters”的组,但是如果我这样做了,那么Apache将如何写入/var/www而不将其添加到该组中呢?
查尔斯·罗珀

而且我确实需要授予其他用户访问权限,/var/www因此我认为授予组访问权限www-data并使每个人都成为该组的成员将是一个很好的解决方案。我现在可以看到Apache能够覆盖其中的任何文件的问题。由于只有2个开发人员(包括我自己)可以访问该代码,因此短期内它是相对安全的。
查尔斯·罗珀

1
谢谢马蒂。Apache Cookbook的这一部分使我大笑:“您应该意识到,如果您问12个人以正确的方法在Apache服务器上设置文件权限,您会得到许多不同的答案。” 您已经为我提供了我现在需要进步的一切。非常感谢您的参与。:-)
Charles Roper 2012年

1
我也学到了一点,这就是为什么我喜欢深入的讨论-它通常有助于弄清一些模糊的部分。我主要是一位被要求解决问题和建立网站的程序员,所以我一直在学习做事的更好方法。随时询问是否还有其他问题。
马蒂·弗里德

1
AFAIK,sudo chmod -R g + rw / var / www赋予“组”访问权限。使用“ a + rw”访问世界。
Donal Lafferty 2015年

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是标准文件夹权限。

希望这可以帮助 :)


嗨,感谢您抽出宝贵的时间回答,我们非常感谢。但是,它并没有真正的帮助。使用SFTP时,对文件进行处理会使它们全部无法修改(与我所追求的完全相反!)。我真的不能使用chmod解决方法,因为a)我没有在SFTP中使用chmod的权限;b)我真的不想通过SSH登录,更改权限,执行SFTPing,更改回来等;c)出于安全原因,某些文件具有不同的权限,因此无论如何我都无法批量修改。
Charles Roper 2012年

什么/var/data啊 另外,您建议他使用哪个目录chown -R www-data:www-data?希望不会/var/www
马蒂·弗里德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.