我正在设置 Apache2/Ubuntu Web 服务器,但我不知道如何实现我需要的安全设置。
在 www 文件夹 - 网络根目录 - 我的www-数据组(apache 和 PHP 帐户)需要具有有限的权限,以防止在 Apache 下运行的任何脚本在未经明确许可的情况下修改或删除文件。但是,使用 WinSCP 或类似方式连接以将文件传输到 www 文件夹的用户需要拥有完全权限,以便他们可以将文件复制到 Web 根目录并删除旧文件等。
理想情况下,我似乎需要一组 - www-data - 对网络服务器的操作具有有限的权限,并且一组 - 比如说“webdevelopers”来包含任何从事网络项目的人员 - 对 www 文件夹具有完全权限。
那些定期设置 Web 服务器的人能否告诉我如何正确保护您的 Web 根目录,同时允许开发人员根据需要添加和删除文件?
答案1
您的 apache 和 PHP 脚本应该在同一用户下运行。
您可能会想到的一个想法(这是 garethTheRed 的想法)是创建一个www-devs
包含您的开发人员的组,将所有权更改为/www-data
,apache:www-devs
并将模式设置为0570
。
这将导致 Web 服务器能够从目录中读取,但不能写入。小组成员www-devs
将能够写作。然而,这有一个主要问题,开发人员添加的新文件将归开发人员所有。 Apache 既不是这些文件的所有者,也不是拥有它们的组。因此 apache 将无法读取它们。
最好的解决方案是使用文件系统 ACL。您可以使用 ACL 添加多个具有不同权限的不同组。您还可以设置新文件继承这些权限。
groupadd www-devs
setfacl -R -d -m g:www-devs:rwX -m g:www:r-X /www-data
setfacl -R -m g:www-devs:rwX -m g:www:r-X /www-data
第一setfacl
行设置创建的任何新文件的默认权限。第二setfacl
行设置现有文件的权限。
权限最终看起来像这样:
$ getfacl --all-effective /www-data
getfacl: Removing leading '/' from absolute path names
# file: www-data
# owner: apache
# group: www
user::r-x
group::r-x #effective:r-x
group:www:r-x #effective:r-x
group:www-devs:rwx #effective:rwx
mask::rwx
other::---
default:user::rwx
default:group::rwx #effective:rwx
default:group:www:r-x #effective:r-x
default:group:www-devs:rwx #effective:rwx
default:mask::rwx
default:other::rwx
这表明该www
组只有读和执行权限,而www-dev
具有读写和执行权限。
让我们尝试创建一个文件:
$ touch /www-data/foo
$ getfacl --all-effective /www-data/foo
getfacl: Removing leading '/' from absolute path names
# file: www-data/foo
# owner: root
# group: root
user::rw-
group::rwx #effective:rw-
group:www:r-x #effective:r--
group:www-devs:rwx #effective:rw-
mask::rw-
other::rw-
这表明在刚刚创建的文件上,www
只有读权限,而www-devs
有读和写权限。请注意,我touch
以 root 身份运行该命令,因此 root 是实际拥有该文件的人。但由于 ACL,这对www
和www-data
组可以对文件执行的操作没有影响。