目标:客户端使用 OTP(AuthType basic)通过 apache 2.4 反向代理进行身份验证,然后转发到后端服务器(apache 2.2),在那里需要进一步的个人身份验证(Kerberos)。两个因素都成功后,客户端即可获得访问权限。
关于可能的解决方案,我假设我们可以忽略 otp / kerberos 身份验证对,并且可以更一般地讨论两个基本身份验证。
限制:必须使用代理上的 OTP 和后端上的 Kerberos 身份验证。后端上的当前 Apache 2.2 无法替换。子目录“sub”(见下文)无法更改。由于专有 otp 模块,必须使用 Apache 2.4 作为代理(无法用 nginx 或 squid 替换)。
迄今为止的准备/配置:
所有必要的代理模块均已到位(我们使用的是 SuSE 12.2)
/etc/apache2/loadmodules.conf:
LoadModule proxy_module
LoadModule proxy_http_module
LoadModule proxy_html_module
LoadModule xml2enc_module
并启用$ a2emod [module]
虚拟主机配置目前如下所示:
<VirtualHost myproxy.domain.com:443>
DocumentRoot "/srv/www/myproxy"
ServerName myproxy.domain.com:443
# requests must point to the subdir /sub
RewriteEngine on
RewriteRule ^/$ sub/ [R]
SSLEngine on
SSLCertificateFile /etc/apache2/ssl.crt/pubkey.pem
SSLCertificateKeyFile /etc/apache2/ssl.key/server.key
# no open forwarding proxy:
ProxyRequests off
# use SSL between proxy and backend in a loose fashion
# i.e. do not check cert validity etc.
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
# try to forward 2nd authentication to backend srv ?
SetEnv Proxy-Chain-Auth On
ProxyPass /sub https://mybackend.domain.com/sub/
ProxyPassReverse /sub https://mybackend.domain.com/sub/
ProxyPreserveHost On
<Proxy https://mybackend.domain.com/sub/>
AuthType basic
AuthName "OTP protected Login"
AuthBasicProvider someOTPprovider
Require valid-user
someValidationURL https://xyz/validate
</Proxy>
</VirtualHost>
当前成就:
- SSL 正常,没有握手或其他投诉(如前所述(请参阅 SSLProxy 类别中的“offs”)。
- 使用 OTP 进行身份验证步骤 1 没问题(可以在 otp srv 上看到)
- 弹出第二个身份验证对话框并要求输入后端凭证
- 后端的 Kerberos 身份验证正常(仅当直接使用时,即没有代理请求)
问题:
第二因素/后端的身份验证输入未到达后端,但停留在代理处,引发错误
[:error] [pid 12804] Rejecting authentication for user 'someuser' [auth_basic:error] [pid 12804] [client ip:port] AH01617: user someuser: authentication failure for "/sub/": Password Mismatch
并再次询问第一个因素 otp。
进一步的日志信息:第一个(正)otp请求总是在后端apache error_log中引发错误:
[error] [client ip] krb5_get_init_creds_password() failed: Looping
detected inside krb5_get_in_tkt
我进一步尝试了其他选项,例如CacheDisable [url_to_backend]
或RequestHeader unset Authorization
,但无济于事。