Apache 2.4 无需身份验证配置即可在 VirtualHost 中运行

Apache 2.4 无需身份验证配置即可在 VirtualHost 中运行

我正在设置一个全新的服务器 — 我实际上只是启动了一个 AWS EC2 实例,全新安装了 apache 和 mod_ssl,并且配置接近最简单的配置。Apache 似乎忽略了块LogLevel中的任何身份验证配置(包括) 。VirtualHost

这是 amzn2.x86_64 Linux 上的 Apache 2.4.51。

我首先将 HTTP 重定向到 HTTPS,然后按照以下基本说明进行操作Apache 2.4 身份验证和授权. 这让我得到了以下 virtual.conf:

<VirtualHost _default_:80>
        DocumentRoot /var/www/html
        RewriteEngine On
        RewriteCond %{HTTPS} !=on
        RewriteCond %{HTTP_HOST} !^(localhost|127.0.0.1)
        RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [R,L]
</VirtualHost>

<VirtualHost *:443>
        LogLevel debug
        SSLEngine on
        SSLCertificateFile /etc/pki/tls/certs/ca.crt
        SSLCertificateKeyFile /etc/pki/tls/private/ca.key
        <Directory "/var/www/html">
                AllowOverride All
                Options Indexes FollowSymLinks
                AuthType Basic
                AuthName "Restricted Files"
                # (Following line optional)
                AuthBasicProvider file
                AuthUserFile "/mount/local/apache/passwd/passwords"
                Require user someuser
        </Directory>
        DocumentRoot /var/www/html
</VirtualHost>

总体而言,上述操作似乎有效,但身份验证除外。如果我在 Web 浏览器中访问我的 IP 地址,它会正确重定向到 443,它会从指定的(非标准)路径提供证书,并且我可以看到它记录debug级别活动,至少对于 mod_ssl 而言。但是,它只从/var/www/html/(注意::/var/www/html是一个符号链接)。

我发现另一个问题,这促使我去寻找任何Require all granted指令。

# pwd
/etc/httpd/conf.d
# grep Require * 2>/dev/null
autoindex.conf:# Required modules: mod_authz_core, mod_authz_host,
autoindex.conf:    Require all granted
ssl.conf:#   With SSLRequire you can do per-directory access control based
ssl.conf:#SSLRequire (    %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
ssl.conf:#   o StrictRequire:
ssl.conf:#     This denies access when "SSLRequireSSL" or "SSLRequire" applied even
ssl.conf:#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
userdir.conf:    Require method GET POST OPTIONS
virtual.conf:       Require user someuser
welcome.conf:    Require all granted

中的那个autoindex.conf位于<Directory "/usr/share/httpd/icons">块内,而 中的那个welcome.conf位于 中<Directory /usr/share/httpd/noindex>。我做过查找一个/etc/httpd/conf/http.conf

# Further relax access to the default document root:
<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

注意,在此安装中(通过yumAmazon Linux 2),主配置文件是/etc/httpd/conf/http.conf。该文件的最后一行是IncludeOptional conf.d/*.conf。我上面发布的主要配置在/etc/httpd/conf.d/virtual.conf

我尝试注释掉它Require all granted并重新启动服务器,但没有变化。那时我注意到它似乎根本没有做任何事情。前面提到的问题显示了他的日志文件中的一些条目。但是,即使我有,我也没有在日志文件中LogLevel debug看到任何与它相关的内容,就像他一样。¯_(ツ)_/¯authz_core

此时,我尝试在<VirtualHost>块内部进行一些修改:

  • 我尝试将线条包裹AuthType basicRequire user someuser一个<RequireAll>块中
  • 我尝试Require all denied在之前添加Require user
  • 我尝试使用.htaccess具有相同配置的文件
  • 我尝试改变AllowOverride AllAllowOverride All AuthConfig使用.htaccess文件
  • 我尝试将日志记录扩展到LogLevel debug auth_basic:trace1 authz_core:trace1

在所有情况下,均无变化,配置解析正常。服务器仅提供页面,日志文件中没有任何内容。

然而conf/httpd.conf,如果我在块内的主文件中进行更改<Directory "/var/www/html">,则一切将按预期进行:

  • 更改Require all grantedRequire all denied(而不是注释掉)会阻止所有访问
  • 更改AllowOverride noneAllowOverride AuthConfig使我的.htaccess文件具有与块中相同的身份验证配置,<VirtualHost>按预期工作 - 它要求用户名和密码
  • 使用日志记录LogLevel debug auth_basic:trace1 authz_core:trace1可以让我记录很多日志

因此,总而言之,即使我的<VirtualHost>配置通常可以正常工作(重定向、SSL、除身份验证之外的所有内容的调试),但它似乎会默默地忽略任何auth配置,包括LogLevel

在短期内,我通过撤消我在主配置文件中所做的所有更改解决了我的问题,因此在软件更新期间不会覆盖这些更改,然后将它们放入conf/00-override.conf

<Directory "/var/www/html">
    AllowOverride All
    AuthType Basic
    AuthName "Restricted Files"
    # (Following line optional)
    AuthBasicProvider file
    AuthUserFile "/mount/local/apache/passwd/passwords"
    Require user someuser
</Directory>

但是,如果能够在虚拟主机级别配置授权就更好了。有什么想法吗?

相关内容