答案1
从安全角度来看,使用同一 Apache 用户设置网页并不是一个好主意。 Apache 用户应该能够读取网页,但不能写入网页。
因此,在标准配置下,Web结构通常是所有人都可读,而当需要写入时,通常是Apache用户可写,这是一个安全噩梦。
避免这种情况的策略之一是安装/使用 mod_ruid2。https://github.com/mind04/mod-ruid2
对于Debian来说,这样做就足够了:
apt-get install libapache2-mod-ruid2
请注意 Apache 默认用户随发行版的不同而变化。在 Debian 中,它是 www-data,在 RH/CentOS 中,它是 apache,在 SuSE 中,它是 wwwrun。从现在起我将把它称为 Apache 默认用户。
如果您没有在虚拟主机中定义任何指令,它将以传统方式运行;否则行为将会改变。
它的想法是让一个进程在虚拟主机中运行,并且用户有权访问该虚拟主机,因此,这些文件将拥有该所有权,并且如您所愿,其他用户将无法读取它们。通常,您为每个虚拟主机定义一个用户。
在虚拟主机中的虚拟主机或目录指令中,您可以定义对该目录有效的用户和组。 user:usergroup 是 Apache 在访问虚拟主机/目录时将使用的有效权限,因此,属于该组的任何用户都将能够写入/查看目录。
<Directory "/vhostdir/">
RMode config
RUidGid user usergroup
....
因此,在写入目录时,如果文件由一组用户管理,则现在可以将文件创建为 660,其所有权为 user:usergroup。同样,这些文件也可以由具有全局读取权限的其他用户创建;但是对于写入来说,它不会是 Apache 默认用户,而是另一个用户。
那么mod_ruid2的优点是:
- 在虚拟主机环境中,用户无法读取其他用户的文件;
- 在单个用户中,您仍然可以以其他用户的身份创建文件,并且 Apache 默认用户和 ruid2 用户都无法覆盖它们
- 更重要的是,写入的文件现在将由 ruid2 用户完成,而不再由 Apache 默认用户全局完成。
来自 github 页面:
关于 mod_ruid2 是一个适用于 apache 2.0、2.2 和 2.4 的 suexec 模块,基于 mod_ruid 和 mod_suid2
-它只运行在Linux上,因为只有Linux内核实现了所需的进程功能。 - 它比 mod_suid2 具有更好的性能,因为它不需要在一个请求后杀死 httpd 子级。它利用内核功能,并在收到新请求后再次使用 suids。 -存在一些安全问题,例如,如果攻击者成功利用httpd进程,他可以设置有效功能并将setuid设置为root。我建议在内核(grsec)中使用一些安全补丁,或者其他东西。
-主要有两种操作模式:stat和config 1.config是默认的,必须定义uid和gid。如果没有定义 [ug]id,则使用默认用户和组。
- stat httpd setuid 和 setgid 到请求文件名(脚本)/目录的 uid 和 gid 如果您使用 mod_vhost_alias 进行虚拟主机,这很好
安装 1. 从这里下载并安装最新的 libcap 2. 运行 /apachedir/bin/apxs -a -i -l cap -c mod_ruid2.c 3. 配置 httpd.conf 4. 重新启动 apache
配置选项: RMode config|stat(默认为 config) RUidGid user|#uid group|#gid - 当 RMode 为 config 时,设置为此 uid 和 gid
RMinUidGid user|#uid group|#gid - 当 uid/gid < 小于 min uid/gid 时设置为默认 uid/gid RDefaultUidGid user|#uid group|#gid
RGroups group1 group2 - 通过 setgroups @none 设置的附加组 - 清除所有先前定义的组。
RDocumentChrRoot - 设置 chroot 目录和其中的文档根目录
例子:
<VirtualHost example.com> ServerAdmin [email protected] RDocumentChRoot /home /example.com/public_html ServerName example.com ServerAlias www.example.com RMode config # unnecessary since config is the default RUidGid user1 group1 RGroups apachetmp <Directory /home/example.com/public_html/dir> RMode stat </Directory> <Directory /home/example.com/public_html/dir/test> RMode config RUidGid user2 group2 RGroups groups1 </Directory> <Directory /home/example.com/public_html/dir/test/123> RUidGid user3 group3 </Directory> <Location /yustadir> RMode config RUidGid user4 user4 RGroups groups4 </Location>