在我的Apache配置中,我首先拒绝访问整个文件系统:
<Directory />
Require all denied
</Directory>
然后,在每个虚拟主机的配置中,我允许不受限制的访问:
<VirtualHost ...>
<Directory /var/www/example.com/>
Require all granted
</Directory>
</VirtualHost>
或要求经过身份验证的访问权限:
<VirtualHost ...>
<Directory /var/www/example.com/>
AuthType Basic
AuthName "example.com"
AuthUserFile htpasswd
Require valid-user
</Directory>
</VirtualHost>
我在Apache文档中注意到:
我想知道使用<Location />
是否可能需要对特定虚拟主机进行身份验证访问:
<VirtualHost ...>
<Location />
AuthType Basic
AuthName "example.com"
AuthUserFile htpasswd
Require valid-user
</Location>
</VirtualHost>
但Apache文档指出:
<Location> directives should not be used to control access to filesystem locations.
这让我想知道是否一般是<Location>
指令的建议,以及在某些情况下是否可以使用<Location />
指令作为< em>异常允许访问,换句话说,Apache <Location>
指令可以安全地用于配置对服务器的访问吗?
答案 0 :(得分:2)
否。同样来自Apache文档:
我的理解是,因为任何<Location>
指令都可能推翻任何<Directory>
指令[1],所以限制性最小的<Location>
指令的限制性不得超过限制性最强的{{1}整个服务器上的指令 。
从合理的<Directory>
默认<Directory />
开始并遵循上述规则将要求任何Require all denied
指令的限制性不低于<Location>
,这当然会使Require all denied
根本无法访问服务器。
另请注意,<Location>
指令的目的是配置驻留在文件系统之外的资源。
底线是对于可能触及文件系统的任何请求,对于可能适用于任何这些请求的任何<Location>
指令,适用的<Location>
指令不得包含{{ 1}}陈述。[2]
[1]:例如,使用符号链接
[2]:可以使用文件系统权限或apparmor等工具通过在某些Require
指令中包含Require
语句来缓解打开的安全漏洞,但请记住Defense In Depth的原则。