在 Apache Web 服务器中,我有一个用户www-data
,并且 中的所有文件/var/www
都归 拥有www-data
。这不是为了安全吗?有时我需要通过 FTP 将文件上传到/var/www/*
,但我自己的用户没有写入权限。
假设我使用 WordPress,它建议644
对文件和755
文件夹授予权限。安全地执行此操作的最佳方法是什么?我仍然需要能够通过 FTP 上传文件。
答案1
虽然处理 /var/www 中 Apache 2 用户 www-data 权限的最佳方法是什么?很好地讨论了权限问题,它已有近 9 年历史,并且不符合当前的最佳做法。我来回答这个问题:安全地执行此操作的最佳方法是什么?
每个站点都有单独的用户即不要使用 为所有网站提供服务
www-data
。这很重要,因为使用 WordPress(或任何其他 CMS)时,您的 Apache 不会提供静态内容文件,而是运行 PHP。如果您在单个网站上遇到安全问题,它可能会蔓延到以同一用户身份运行的每个网站。通过上传文件FTP 不安全因为它会以纯文本形式发送密码和内容。例如,您托管的 WordPress 的数据库登录信息位于 中
wp-config.php
。您应该使用SSH 文件传输协议(SFTP)即可。这样,您还可以将站点管理员的公钥添加到
~/.ssh/uthorized_keys
,这样他们就无需知道运行站点的用户的密码。(请参阅如何在 Ubuntu 16.04 上设置 SSH 密钥)。个人SSH公钥可以在多个站点上使用,方便快捷地访问,减轻了拥有多个账户的额外负担。使用 PHP-FPM。这是当前以用户身份运行 PHP 的方法。为每个用户创建一个新池,即每个站点一个池。这对于安全性和性能来说都是最好的,因为您还可以指定单个站点可以消耗多少资源。
例如参见 NeverEndingSecurity 的在 Linux 上使用单独的用户/uid 和组运行 php-fpm有类似 HowtoForge 的教程在 Ubuntu 16.04 上将 PHP-FPM 与 Apache 结合使用不使用 PHP-FPM 通过用户分离来提高安全性,指导在整个服务器上使用单个 FPM 套接字。
答案2
汤姆值得获得一枚奖章这个答案在 ServerFault 上。
按照他解释的方式设置组 ID 使其起作用!
创建一个新组(www-pub)并将用户添加到该组
groupadd www-pub
usermod -a -G www-pub usera
## 必须使用 -a 来附加到现有组
usermod -a -G www-pub userb
groups usera
## 显示用户群组将 /var/www 下所有内容的所有权更改为 root:www-pub
chown -R root:www-pub /var/www
## -R 表示递归将所有文件夹的权限改为2775
chmod 2775 /var/www
## 2=设置组 ID,7=rwx 表示所有者(root),7=rwx 表示组(www-pub),5=rx 表示全世界(包括 apache www-data 用户)设置组 ID ([SETGID][2]) 位 (2) 导致组 (www-pub) 被复制到该文件夹中创建的所有新文件/文件夹。其他选项包括 SETUID (4)(用于复制用户 ID)和 STICKY (1)(我认为它只允许所有者删除文件)。
有一个
-R
递归选项,但它不会区分文件和文件夹,因此您必须[使用 find][3],如下所示:
find /var/www -type d -exec chmod 2775 {} +
将所有文件改为0664
find /var/www -type f -exec chmod 0664 {} +
将用户的 umask 更改为 0002
umask 控制默认的文件创建权限,0002 表示文件有 664 而目录有 775。设置此项(在我的情况下是通过编辑
umask
底部的行/etc/profile
)意味着一个用户创建的文件将可由 www 组中的其他用户写入,而无需chmod
他们。