java - Kerberos 如何获取主体或客户端名称?

标签 java jsp kerberos

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

klist

Ticket cache: FILE:/tmp/krb5cc_527

Default principal: user1@EXAMPLE

Valid starting 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 配置:
<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

但是我收到了
[Sun Dec 13 18:17:32 2015] [debug] src/mod_auth_kerb.c(1944): [client
 126.185.3.202] kerb_authenticate_user entered with user (NULL) and auth_type Kerberos

最佳答案

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

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

显然,用户字符串在 @ 之后带有域信息。所以你必须考虑它。

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

编辑

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

配置 NTP

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

为服务器创建 AD 主体

您需要在 AD 中创建一个主体以用于服务器主体身份验证。有必要为此主体获取 key 表文件。对不起,我不能告诉你怎么做。

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

获得服务器主体和 key 表文件后,就该配置 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 模块并在每个 location 中配置其使用, directory , virtual 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观点。需要此文件来配置 workers管理与 tomcat 应用程序的通信。
  • 创建 worker 文件(如果它不存在)。 worker 文件或多或少如下。

  • 示例 worker 文件:
    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 协议(protocol)的连接器:
    <Connector port="8009" protocol="AJP/1.3" 
        redirectPort="8443" tomcatAuthentication="false"/>
    

    每个 worker 都必须指向这个端口。

    最后,您可以使用 JkMount workerName 配置您的位置(或其他)。指示 Apache 必须将此 url 转发给适当的工作人员:
    <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.xml 中配置任何有关安全约束的内容。 ,使用此配置,Apache 将验证用户而不是 Tomcat,并且 Tomcat 将在 HTTP 请求中接收用户的主体名称。

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

    希望能帮助到你。

    关于java - Kerberos 如何获取主体或客户端名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34001683/

    相关文章:

    jsp - Tomcat:获取文件路径

    c# - 从 .Net 应用程序(控制台)访问受 kerberos 保护的 webhdfs

    centos - 如何在 CentOS 上卸载 kerberos

    java - Java 8 中是否有等效于 Javascript 的 Array.map?

    java - 没有摄像头的 SurfaceView : preview after start rotated on 90 degree

    java - struts 1.0逻辑标签选择——if/else逻辑

    jsp - 如何在jsp中设置request.getParameter :setProperty

    java - 当父框架设置为不可调整大小时,JPanel 会调整大小

    java - 生成随机二进制数据,例如 23ABFF

    encryption - Kerberos key 表文件包含多个条目