在 Ubuntu 14.04 LTS 上运行 apache 2.4.7 服务器时,我遇到了“限制文件扩展名”配置设置问题,这是互联网安全中心 (CIS) 推荐的。基本思想是 (1) 限制所有文件,然后 (2) 仅允许访问要提供的文件类型。
MAIN_APACHE2.conf 文件的相关部分包括以下内容:
<Directory />
Require all denied
AllowOverride None
Options None
<LimitExcept GET HEAD OPTIONS>
Require all denied
</LimitExcept>
</Directory>
<FilesMatch "^.*$">
Require all denied
</FilesMatch>
包含的 V_HOST.conf 文件的相关部分包括以下内容:
DocumentRoot /var/www/html
<Directory /var/www/html>
Require all granted
<FilesMatch "^.*\.(htm)$">
Require all granted
</FilesMatch>
</Directory>
服务器上唯一的文件是位于 vHost 文档根目录中的完全独立的测试文件“index.htm”。尝试使用此配置访问服务器会导致 403 错误。我认为这个问题可能是 FilesMatch 如何合并的问题,尤其是与 vHost 设置和嵌套的 Directory 指令有关,因此我在 V_HOST.conf 文件中替换了以下内容:
<Directory /var/www/html>
Require all granted
<FilesMatch "^.*$">
Require all granted
</FilesMatch>
</Directory>
令我有些惊讶的是,这个方法竟然有效!那么...我遗漏了什么?这是正则表达式的问题吗?我是否遗漏了 Apache 服务器需要读取的某些“其他”文件?我尝试了许多其他表达式,尝试了 MAIN_APACHE2.conf 中的所有 FilesMatch(Directory 指令之外),但此时我还是卡住了!
非常感谢任何指点。当然,如果我在 Stack Overflow 或其他地方有此信息,请告诉我。
答案1
经过进一步思考后,我得出了以下答案:
在 mod-dir 指令分配给“index.htm”之前,该FilesMatch
指令针对“目录”命中应用DirectoryIndex
。因此,必须通过“null”条件测试才能处理请求。这样,此设置(除了对 V_HOST.conf 文件的更改外,其余均相同)即可工作:
<Directory /var/www/html>
Require all granted
<FilesMatch "((^$)|(^.+\.(htm|ico)$))">
Require all granted
</FilesMatch>
</Directory>
注意:我还借此机会“收紧”了对允许的带扩展名文件的要求,要求在划分扩展名的句点之前确实有一些字符,这使得“.ht”类型文件(即以单个“。”开头的文件名)不太可能在未来的配置更改中被无意中允许。
答案2
FilesMatch 按照它们在合并配置文件中出现的顺序应用。您的问题暗示的布局不明确,但您的结果暗示相对顺序并不像您“期望的那样”。