Apache2 - 使用mod_auth_kerb启用“不需要登录,但允许登录”

时间:2014-01-21 13:54:24

标签: apache kerberos

我已经在这个问题上搜索了几天,在mod_auth_kerb源代码中搜索并进行了大量实验,但无济于事,所以我真的希望有人能指出我正确的方向......

我已经使用Apache :: AuthCookie工作多年(在apache 1.x和apache 2.x(主要是2.2.x)上)并且最近使用AuthCookie开发了一个单点登录解决方案(此时仅用于authz)和mod_auth_pubtkt用于针对AD后端(通过LDAP)进行身份验证。这一切都运行良好,现在我正在考虑为启动其Web浏览器之前登录到AD域的Windows用户添加Kerberos。 这是有效的(为我的单点登录服务器生成keytab,现在可以验证通过用户的浏览器和Apache发送给它的Kerberos票证),但我需要将其设为可选。也就是说,我需要设置Apache 2.2.x,以便在没有检查Kerberos标头的情况下,没有创建错误或挑战(IE,例如,提示输入凭据,我不想要)。 / p>

在我的SSO CGI代码中,我基本上想看看是否填充了$ ENV {REMOTE_USER}(通过mod_auth_kerb)并相应地采取行动(如果不是),如果不是,请执行我现在所做的事情(询问用户的表单中的信用卡,对LDAP服务器进行身份验证并以此方式继续)。

我认为这样可行:

<Location /whatever>
   AuthName DualExp
   AuthType Kerberos
   KrbAuthRealms mumble
   KrbServiceName HTTP/mumble@blah
   Krb5Keytab /etc/apache2/my.krb5tab
   KrbMethodNegotiate on
   KrbMethodK5Passwd off
   KrbLocalUserMapping on
   KrbAuthoritative off
   require valid-user
   AuthType Site::NullAuth
   PerlAuthenHandler Site::NullAuth->always
</Location>

Site :: NullAuth是一个非常简单的mod_perl authen处理程序,它总是只返回“OK”。

当mod_auth_kerb的“KrbAuthoritative”设置为“off”时,看起来Site :: NullAuth一直被调用,而不仅仅是失败(即没有mod_auth_kerb的Kerberos头),这是第一个惊喜。如果mod_auth_kerb在成功时设置的用户对于Site :: NullAuth看起来不是不可用,那就没问题了。由于NullAuth最后被调用,我最终没有用户设置。或者至少我认为这是正在发生的事情。在NullAuth中,我这样做是为了检查用户:

sub always {
   my ($auth_type, $r) = @_;
   my $auth_user = $r->user;
   my $prev_user = "";
   $prev_user = $r->prev->user if $r->prev;
   $r->server->log_error("user authenticated as $auth_user and prev is $prev_user");
   return OK;
}

并且看不到$ r-&gt;用户或$ r-&gt; prev-&gt;用户。

有没有人可以在这里尝试其他任何东西?

谢谢,

...史蒂夫

2 个答案:

答案 0 :(得分:1)

SPNEGO与浏览器的互动方式如下:

  1. 来自未经身份验证的用户的请求,没有会话cookie
  2. 服务器代码要求使用401响应进行Kerberos身份验证,并使用“WWW-Authentication:Negotiate”响应标头
  3. 浏览器使用服务主体名称的服务票证回复该响应
  4. 通常,浏览器会尝试从系统中获取用户的Kerberos令牌,如果没有,则提示创建凭据 - 首先创建TGT,然后请求SPN票证到Kerberos服务器。

    因此,您无法避免浏览器的凭据提示对话框,因为如果浏览器在触发身份验证过程之前支持Kerberos / SPNEGO身份验证,则代码无法获取信息。

    顺便说一句,如果SPNEGO身份验证失败(用户确实取消了凭据提示),由于简单的cookie跟踪,您的代码可以回退到另一个身份验证。

答案 1 :(得分:0)

没有简单的方法可以让它与I.E.一起使用。我最终做的是使用mod_rewrite筛选出来自异地的所有IE客户端,并希望所有本地IE客户端都已经拥有票证。 rfc 1918地址用于隐藏我们的真实地址。

# Add a rewrite rule for offsite hosts

RewriteEngine On
RewriteLog /etc/httpd/logs/ssl_rewrite_log
RewriteLogLevel 2

# IE fails hard if the user does not have a tgt for SPNEGO
# and either attempts NTLM or fails altogether depending on
# exact version. Redirect all "offsite" login attempts to
# form rather than attempt pass-thru SPNEGO login.

RewriteCond   %{HTTP_USER_AGENT}           ^Mozilla.*MSIE
RewriteCond   %{REMOTE_ADDR}          !^172\.16\..*$
RewriteRule   ^/login/          /login-simple/   [PT]