如何使用基本身份验证保护在 Apache2 虚拟主机中反向代理的 Tomcat webapp?

Posted

技术标签:

【中文标题】如何使用基本身份验证保护在 Apache2 虚拟主机中反向代理的 Tomcat webapp?【英文标题】:How can I protect a Tomcat webapp that's reverse proxied in an Apache2 virtual host using basic authentication? 【发布时间】:2012-02-16 19:57:36 【问题描述】:

我无法弄清楚如何添加基本 HTTP 身份验证来密码保护在生产 Web 服务器上运行的开发测试环境。主站点和测试环境都是虚拟主机,它们使用 AJP 代理来提供单独的 Tomcat webapp 实例。我们需要防止公众在不更改 Tomcat 环境中的 web.xml 的情况下访问测试环境,必须使用 Apache 而不是 Tomcat 来实现保护。但是,虚拟主机中的 ProxyPass 和 ProxyPassReverse 指令似乎覆盖了对 .htaccess 或我放在 控制块中的任何内容的使用,而我似乎无法在 控件的主体中使用像 AuthType 这样的指令挡在旁边。我对 Apache(或 Tomcat)不是很有经验,并且不确定哪些指令可以应用在哪里以及哪些可能会覆盖其他指令。因为需要在生产服务器上进行更改,所以我不能轻易试验,以免造成停机。

httpd.conf 本身很简单:

LoadModule  proxy_http_module   /usr/lib/apache2/modules/mod_proxy_http.so
LoadModule  headers_module      /usr/lib/apache2/modules/mod_headers.so

LoadFile    /usr/lib/libxml2.so

相关的虚拟主机文件,/etc/apache2/sites-available/dev443如下:

<IfModule mod_ssl.c>
<VirtualHost dev.mydomain.com:80443>
    ServerName  dev.mydomain.com:80443
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/dev

    ProxyPass / ajp://127.0.0.1:8010/
    ProxyPassReverse / ajp://127.0.0.1:8010/

    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/dev/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All 
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log

    LogLevel info

    CustomLog /var/log/apache2/ssl_access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

    SSLEngine on

    SSLCertificateFile    /etc/ssl/certs/server.crt
    SSLCertificateKeyFile /etc/ssl/private/server.key
    SSLCACertificateFile  /etc/ssl/certs/intermediate.crt

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
        SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /usr/lib/cgi-bin>
        SSLOptions +StdEnvVars
    </Directory>

    BrowserMatch "MSIE [2-6]" \
        nokeepalive ssl-unclean-shutdown \
        downgrade-1.0 force-response-1.0
    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

</VirtualHost>
</IfModule>

我可以在控制块内移动 AJP 代理配置吗?我查看了this *** Q&A,这表明它支持身份验证。它会在控制块内得到支持吗(解决方案在 httpd.conf 中有)?

目前,我们正在使用防火墙按 IP 进行过滤,但是参与该项目的一些人需要在家中访问测试环境,并且他们没有固定的 IP 地址用于互联网连接,因此密码保护将涉及从长远来看,维护更少,为远程工作提供更大的灵活性。

为了记录,涉及以下版本:Apache:2.2.14 / Tomcat:7.0.23 / Java:SE 1.6.0_26-b03 / OS:Ubuntu 10.04 LTS

【问题讨论】:

【参考方案1】:

Shane Madden 提出了一个可行的解决方案,可以在 here 找到。 documentation 指定允许相关指令的上下文包括但没有提及,尽管它似乎并且实际上是等效/可互换的,除了内容来源的区别。以下实现了我想要的:

<Location />
    ProxyPass ajp://127.0.0.1:8010/
    ProxyPassReverse ajp://127.0.0.1:8010/
    AuthType Basic
    AuthName "something"
    AuthUserFile /path/to/htpasswd
    Require valid-user
</Location>

【讨论】:

以上是关于如何使用基本身份验证保护在 Apache2 虚拟主机中反向代理的 Tomcat webapp?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用基本身份验证保护 Spring Cloud Eureka 服务?

如何使用基于令牌的 HTTP 基本身份验证保护 MVC 4 .NET SPA 模板中的 WebAPI?

如何使用基本身份验证保护 android/ios 应用程序的 Web API

Apache 2.4 和 php-fpm 不会为 php 页面触发 apache http 基本身份验证

Spring boot 2.1.x 如何使用基本身份验证保护执行器端点

如何在客户端保护 Firebase 身份验证? [复制]