FilesMatch 配置用于限制所提供文件扩展名

FilesMatch 配置用于限制所提供文件扩展名

在 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 按照它们在合并配置文件中出现的顺序应用。您的问题暗示的布局不明确,但您的结果暗示相对顺序并不像您“期望的那样”。

相关内容