Kerberos如何获得主体或客户名称?

时间:2015-11-30 15:07:46

标签: java jsp kerberos

我在AD中配置了一个用户委托的kerberos票证:

  

klist的

     

票证缓存:文件:/ tmp / krb5cc_527

     

默认主体:user1 @ EXAMPLE

     

有效开始Expires Service principal 11/27/15 16:28:27 11/28/15 02:28:27 krbtgt/EXAMPLE.com@EXAMPLE.COM

我怎样才能得到'user1'?在这个客户端域帐户(客户端jsp?或服务器端?)我想在按钮单击后提取此值并将其传回(使用backurl)到另一个Java应用程序。

修改 我的Apache配置:

week        year        DateValue                 
----------- ----------- ------------------------- 
49          2010        2010-11-29 00:00:00.0     
50          2010        2010-12-06 00:00:00.0     
51          2010        2010-12-13 00:00:00.0     
52          2010        2010-12-20 00:00:00.0     
53          2010        2010-12-27 00:00:00.0     
2           2011        2011-01-03 00:00:00.0     
3           2011        2011-01-10 00:00:00.0     
4           2011        2011-01-17 00:00:00.0     
5           2011        2011-01-24 00:00:00.0     
6           2011        2011-01-31 00:00:00.0

但我收到了

<Location /kerb >

     AuthType Kerberos

     AuthName "auth-realm"
     KrbMethodNegotiate off
     KrbMethodK5Passwd off
     KrbServiceName HTTP
     Krb5Keytab /etc/krb5.keytab
     require valid-user
</Location>
 ProxyPreserveHost On
 ProxyPass /kerb ajp://120.201.131.169:8019/myApp
 ProxyPassReverse /kerb ajp://120.201.131.169:8019/myApp

3 个答案:

答案 0 :(得分:1)

这取决于。在我的例子中,我有一个配置了mod_kerb的Apache服务器,并通过AJP将http请求转发给Tomcat。

在这种情况下,Tomcat AJP conector配置了tomcatAuthentication=false,我可以使用request.getRemoteUser()从JSP和Servlet获得用户身份验证。

显然,用户字符串会在@之后附带域信息,因此您必须考虑它。

如果您对我的解决方案感兴趣,我可以详细说明我的答案。

修改

我编辑我的答案,提供有关配置Tomcat以使用Kerberos的更多信息。

配置NTP

首先,在每个系统AD服务器,Apache服务器和Tomcat服务器中配置NTP客户端是很常见的。如果没有日期和时间同步,则会出现clock skew too greatpostdating问题。

为服务器

创建AD主体

您需要在AD中创建一个主体以用于服务器主体身份验证。有必要获取此主体的keytab文件。对不起,我无法告诉你如何做到这一点。

在Apache服务器上安装和配置Kerberos

获得服务器主体和密钥表文件后,就可以配置Apache服务器了。将kerberos安装到该系统并配置/etc/krb5.conf。此文件的示例是:

HERE.YOUR.KERB.DOMAIN = {
    kdc = your.dns.kerb.domain
    admin_server = your.dns.kerb.domain
}

检查:

kinit -k -t keytab.file HTTP/principal.dns.name@HERE.YOUR.KERB.DOMAIN
klist

您的服务器配置正确。

安装并配置mod_auth_kerb

安装mod_auth_kerb apache模块,并在每个locationdirectoryvirtual host或您需要的任何内容中配置其使用,请参阅下文。此配置非常依赖于您的kerberos服务器,您必须使用一些参数作为KDC验证,协商,是否具有权威性,...

最重要的参数是Krb5Keytab,但您可以查看this page以了解所有参数。这里有一个示例location

<Location /sample/>
    AuthType Kerberos
    AuthName "auth-realm"
    KrbMethodNegotiate on
    KrbMethodK5Passwd off
    Krb5Keytab /your/path/to/keytab.file
    require valid-user
</Location>

当您尝试访问此位置时http://your.apache.server/sample Apache将尝试通过kerberos检查用户凭据。

AJP配置

对于AJP配置(我之前已经回答过这个问题,但我在这里剪切并粘贴并适应这个问题),程序如下:

  • 为AJP安装Apache模块,通常称为libapache2-mod-jk。 (在debian / ubuntu中,您可以运行sudo apt-get install libapache2-mod-jk )。
  • 然后你将有一个名为jk或类似的新模块。你必须启用它(在debian / ubuntu中你可以运行sudo a2enmod jk )。
  • 默认配置主要是服务,打开它看看JkWorkersFile指向哪里。需要此文件来配置管理与tomcat应用程序通信的workers
  • 创建工作人员文件(如果不存在)。工作文件或多或少如下。

示例工作者文件:

ps=/
worker.list=worker1,worker2,...

# worker1 definition
worker.worker1.port=8009
worker.worker1.host=host or ip
worker.worker1.type=ajp13

# worker2 definition
....

每个worker都可以指向不同的tomcat服务器。端口必须与配置为$CATALINA_HOME/conf/server.xml的端口相同。在这个文件中有一个AJP协议的连接器:

<Connector port="8009" protocol="AJP/1.3" 
    redirectPort="8443" tomcatAuthentication="false"/>

每个工人都必须指向这个端口。

最后,您可以使用JkMount workerName配置您的位置(或其他),以指示Apache必须将此网址转发给正确的工作人员:

<Location /sample/>
    JkMount worker1
    AuthType Kerberos
    AuthName "auth-realm"
    KrbMethodNegotiate on
    KrbMethodK5Passwd off
    Krb5Keytab /your/path/to/keytab.file
    require valid-user
</Location>

有大量样本文档。在这里您使用的是Tomcat官方文档:https://tomcat.apache.org/connectors-doc/webserver_howto/apache.html

Web应用程序身份验证

您不需要在web.xml中配置任何有关安全性约束的内容,使用此配置,Apache将对用户进行身份验证而不是Tomcat,并且Tomcat将在HTTP请求中接收用户的主体名称。< / p>

Tomcat(以及任何其他servlet容器)将用户的主体封装到request.getRemoteUser()

希望它有所帮助。

答案 1 :(得分:1)

我明白了!我不知道到底出了什么问题,但现在它确实有效。 我可以通过以下配置简单地从HTTP Header获取主体(我将此配置从/conf.d移动到main /conf/httpd.conf文件中)。什么是进口的。在RHEL httpd服务器上,apache用户应该有权读取/etc/krb5.keytab。就我而言:

  

ps -ef | grep httpd

     

apache 27537 27535 0 16:18? 00:00:00 / usr / sbin / httpd

<VirtualHost myhost.domain.com:80>

ServerName myhost.domain.com

<Location /myApp >
#   SSLRequireSSL
AuthType Kerberos     
KrbMethodNegotiate On
KrbMethodK5Passwd Off
KrbServiceName HTTP/nmyhost.domain.com@EXAMPLE.COM
KrbAuthRealms EXAMPLE.COM
Krb5KeyTab /etc/krb5.keytab
require valid-user

RewriteEngine On
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule . - [E=RU:%1]
Header add X-Remote-User "%{RU}e" env=RU  
</Location>

ProxyRequests Off
ProxyPreserveHost On
ProxyPass /myApp ajp://126.101.100.169:8029/myApp
ProxyPassReverse /myApp ajp://126.101.100.169:8029/myApp

</VirtualHost>

答案 2 :(得分:0)

尝试检查您的密钥表文件。我遇到了类似的问题,当我运行

cat httpd.keytab

它显示纯文本,这是不正常的,keytab文件应包含ASCII字符,它是一个二进制文件。必须使用域管理员帐户“ $ user.name”重新生成它,然后它才能工作。