保护 Ubuntu/Apache 中的 www 目录而不限制需要它的人的访问?

保护 Ubuntu/Apache 中的 www 目录而不限制需要它的人的访问?

我正在设置 Apache2/Ubuntu Web 服务器,但我不知道如何实现我需要的安全设置。

在 www 文件夹 - 网络根目录 - 我的www-数据组(apache 和 PHP 帐户)需要具有有限的权限,以防止在 Apache 下运行的任何脚本在未经明确许可的情况下修改或删除文件。但是,使用 WinSCP 或类似方式连接以将文件传输到 www 文件夹的用户需要拥有完全权限,以便他们可以将文件复制到 Web 根目录并删除旧文件等。

理想情况下,我似乎需要一组 - www-data - 对网络服务器的操作具有有限的权限,并且一组 - 比如说“webdevelopers”来包含任何从事网络项目的人员 - 对 www 文件夹具有完全权限。

那些定期设置 Web 服务器的人能否告诉我如何正确保护您的 Web 根目录,同时允许开发人员根据需要添加和删除文件?

答案1

您的 apache 和 PHP 脚本应该在同一用户下运行。

您可能会想到的一个想法(这是 garethTheRed 的想法)是创建一个www-devs包含您的开发人员的组,将所有权更改为/www-dataapache: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,这对wwwwww-data组可以对文件执行的操作没有影响。

相关内容