使用 Apache for Cloudfront 重写基本身份验证

使用 Apache for Cloudfront 重写基本身份验证

我有一个网站,其中所有页面都通过 AWS Cloudfront(目前 TTL 为 0)。

站点域名为 www.example.com,这是 cloudfront 发行版的 CNAME。然后 Cloudfront 使用 origin.www.example.com 从我的 Web 服务器请求该站点,并添加自定义标头以进行身份​​验证。

但是现在我还需要向网站添加基本身份验证,直到网站启动。我尝试在 RewriteCond 中使用 LA-U:REMOTE_USER

此配置有效,但没有身份验证:

<VirtualHost *:80>

    ServerName www.example.com
    ServerAlias www.example.com

    ServerAdmin [email protected]

    DocumentRoot /var/www/www.example.com/trunk

    <IfModule mpm_itk_module>
        AssignUserId www_site www_site
    </IfModule>

    <LocationMatch "^(.*\.php)$">
        ProxyPass fcgi://127.0.0.1:9154/var/www/www.example.com/trunk
    </LocationMatch>

    Alias "/robots.txt" "/var/www/norobots.txt"

    <Directory /var/www/www.example.com>
        RewriteEngine on
        RewriteCond  %{HTTP:X-PSK-Auth}  !^mypassword$
        RewriteRule  .* - [F]
    </Directory>

    CustomLog /var/www/www.example.com/apachelogs/www.example.com-access.log combined
    ErrorLog /var/www/www.example.com/apachelogs/www.example.com-error.log

</VirtualHost>
curl http://cxcglobal.demonow.website/

返回站点 HTML。此外

curl --header "X-PSK-Auth:mypassword" "http://cxcglobal.demonow.website/

返回站点源代码。

但是当我将配置修改为

<VirtualHost *:80>

    ServerName www.example.com
    ServerAlias origin.www.example.com

    ServerAdmin [email protected]

    DocumentRoot /var/www/www.example.com/trunk

    <IfModule mpm_itk_module>
        AssignUserId www_site www_site
    </IfModule>

    <LocationMatch "^(.*\.php)$">
        ProxyPass fcgi://127.0.0.1:9154/var/www/www.example.com/trunk
    </LocationMatch>

    Alias "/robots.txt" "/var/www/norobots.txt"

    <Directory /var/www/www.example.com>
        RewriteEngine on
        RewriteCond  %{HTTP:X-PSK-Auth}  !^mypassword$
        RewriteRule  .* - [F]

        RewriteCond %{LA-U:WxLaRwvCQ2yAf5KJREMOTE_USER} !^$
        RewriteRule ^/(.*) http://origin.www.example.com/$1   [P,L]

        AuthUserFile /etc/apache2/staging.passwd
        AuthType Basic
        AuthName "Review security udpates"
        Require valid-user

        LogLevel alert rewrite:trace3

    </Directory>

    CustomLog /var/www/www.example.com/apachelogs/www.example.com-access.log combined
    ErrorLog /var/www/www.example.com/apachelogs/www.example.com-error.log

</VirtualHost>

我收到一个错误:

curl http://www.example.com/
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Unauthorized</title>
</head><body>
<h1>Unauthorized</h1>
<p>This server could not verify that you
are authorized to access the document
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
<hr>
<address>Apache/2.4.18 (Ubuntu) Server at origin.www.example.com Port 80</address>
</body></html>

对于两个 curl 请求。我在站点特定错误日志中没有发现任何错误,在全局 apache 错误日志中也没有发现任何错误。我也找不到重写日志的任何条目。

答案1

更好的方法可能是使用 lambda 直接在 cloudfront 上处理身份验证...

我自己还没有尝试过,但我发现了这个资源......

http://engineering.widen.com/blog/AWS-CloudFront-User-Authentication-using-Lambda@Edge/

这看起来相对简单。Lambda@Edge 允许您运行代码来检查和修改传入的请求。

相关内容