通过 Apache 反向代理的 REMOTE_USER

通过 Apache 反向代理的 REMOTE_USER

我有一个启用了 mod_proxy 的 Apache Web 服务器和一个虚拟主机 proxy.domain.com。此代理配置为使用 AuthType Basic 提示用户输入凭据。然后,通过 ProxyPass 和 ProxyReverse 代理即可访问 web.domain.com 的内容。但是,REMOTE_USER 变量为空。我尝试了各种方法来实现这一点,包括使用 mod_rewrite 和 mod_headers,但所有尝试都失败了。有没有人比我幸运?

谢谢。

答案1

通过 mod_headers、mod_rewrite 和 mod_proxy 可以实现这一点。

在代理上,我假设您的身份验证已正常工作并正确设置了 REMOTE_USER。如果是这样,则将 REMOTE_USER 的值放入后端的 Proxy-User 标头中,如下所示:

RewriteRule .* - [E=PROXY_USER:%{LA-U:REMOTE_USER}] # note mod_rewrite's lookahead option
RequestHeader set Proxy-User %{PROXY_USER}e

事情的经过如下:

  1. RewriteRule 会针对每个请求触发,并将环境变量 PROXY_USER 设置为等于 REMOTE_USER 的值,该值应该已经由 auth 模块设置。
  2. RequestHeader 设置了一个名为 Proxy-User 的请求标头,其值为 PROXY_USER

现在在后端,您可以提取该标题值并像这样设置 REMOTE_USER:

RewriteCond %{HTTP:Proxy-user} ^(.*)$
RewriteRule .* - [E=REMOTE_USER:%1]

事情的经过如下:

  1. RewriteCondition 检查 Proxy-User 标头的值,看它是否与模式 ^.*$ 匹配(它会匹配)。括号告诉 mod_rewrite 将该值存储在 %1 中。
  2. 然后,RewriteRule 使用 %1 中的值设置环境变量 REMOTE_USER。

答案2

在 apache 2.4 上,尝试获取由修改 LDAP 服务器mod_kerb,这就是有效的。

假设你正在寻找AUTHORIZE_sAMAccountName

RewriteEngine On
RewriteRule .* - [E=THE_ACCOUNT_NAME:%{ENV:AUTHORIZE_sAMAccountName}] 
RequestHeader set MY_ACCOUNT_NAME %{THE_ACCOUNT_NAME}e

此后,可以记录 HEADER例如:

CustomLog /tmp/custom.log "%h %l %u %t \"%r\" %>s %b %{MY_ACCOUNT_NAME}i"

参考:

答案3

在后端,如果您不想使用 mod_rewrite,也可以使用标准 mod_auth_basic。假设您将用户作为 X-Remote-User 传入:

<Location />
  AuthBasicFake "%{HTTP:X-Remote-User}" "password"
</Location>

这只在 2.4 中有效,但具有设置 true mod_auth 的其他方面(即 PHP 的身份验证支持)的额外好处

答案4

填充标题的示例X-远程用户内容为远程用户变量,并将该标头发送到后端代理(apache 2.4.6)。

# Example for Apache 2.4.6

<VirtualHost *:80>

RewriteEngine on
<Location />

    ###############################################
    # Your authentication logic here
    AuthType .......
    AuthName .......
    AuthBasicProvider .......
    .... etc
    Require valid-user
    ###############################################

    RewriteCond %{LA-U:REMOTE_USER} (.+)
    RewriteRule . - [E=RU:%1]
    RequestHeader set X-Remote-User %{RU}e

</Location>

    ProxyTimeout 300
    ProxyPass / http://localhost:81/
    ProxyPassReverse / http://localhost:81/

</VirtualHost>

相关内容