这是我想要实现的结果:
客户端浏览器(在我的情况下为Chrome)在50070上命中Apache HTTPd服务器(server1)。客户端浏览器无法访问Kerberos KDC并且不携带Kerberos / GSS身份验证数据。
Apache HTTPd可以访问KDC并配置为需要Kerberos身份验证,但使用密码备份(即KrbMethodK5Passwd
为On
,因此它接受" {{1} }"在HTTP标头中。)
由于备用选项,客户端浏览器会提示用户输入登录名和密码(因为客户端没有提供Kerberos票证)。 Apache HTTPd根据Kerberos验证提供的登录名和密码,并获取正确的用户主体Kerberos票证并将其保留在内存中(由于Authorization: Basic
选项,它还将其保存到/ tmp)。
Apache HTTPd反向代理到后端服务器(server2),后端服务器也侦听端口50070.后端服务器正在运行Jetty,它只接受Kerberos,没有任何密码/基本身份验证后备 - 如果有&#39 ;没有Kerberos票,没有条目。 Apache HTTPd使用login + pass向服务器2发送从KDC获得的用户主体Kerberos票证。
在我目前的配置中,第1,2和2点3成功工作 - 即客户端到server1身份验证工作正常,我可以看到Apache在server1上短暂保存用户主票。
但是,我很难强制Apache HTTPd使用获取的用户Kerberos票证来对server2进行身份验证。基本上,根本不会向server2发送任何身份验证详细信息。
这是我的配置:
KrbSaveCredentials
我也尝试使用<VirtualHost 1.2.3.4:50070>
ServerAlias server1.example.com:50070
ServerAlias server1:50070
ProxyPreserveHost Off
ProxyRequests Off
ProxyPass / http://server2.example.com:50070/ retry=0
ProxyPassReverse / http://server2.example.com:50070/ retry=0
<Proxy *>
Order allow,deny
Allow from all
</Proxy>
ErrorLog logs/error_log
TransferLog logs/access_log
LogLevel debug
<Location />
Options None
AuthType Kerberos
AuthName "NameNode"
KrbMethodNegotiate on
KrbMethodK5Passwd on
KrbServiceName HTTP
KrbAuthRealms EXAMPLE.COM
Krb5Keytab /etc/httpd/conf/http.keytab
KrbSaveCredentials on
KrbLocalUserMapping on
Require valid-user
</Location>
</VirtualHost>
提供的SetEnv proxy-chain-auth
,我认为它按设计工作,确实发送了&#34; mod_proxy_http
&#34;的确切内容。客户端来到server1的标头,转发到server2,但是server2除了Kerberos之外不支持任何东西(即&#34; Authorization: Basic ...
&#34;),并在其日志中抱怨未知的auth方法。
有没有办法强制Apache HTTPd使用从KDC获得的Kerberos票证,使用客户端浏览器提供的登录名和密码,然后使用Negotiate方法(带票证)与目标服务器2进行身份验证我反向代理?