【问题标题】:Kerberos how to get principal or client name?Kerberos 如何获取主体或客户端名称?
【发布时间】:2016-03-04 06:29:51
【问题描述】:

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

klist

票证缓存:FILE:/tmp/krb5cc_527

默认主体:user1@EXAMPLE

有效的开始过期服务主体 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

【问题讨论】:

    标签: java jsp kerberos


    【解决方案1】:

    尝试检查您的密钥表文件。我有类似的问题,当我跑的时候

    cat httpd.keytab

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

    【讨论】:

      【解决方案2】:

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

      ps -ef | grep httpd

      阿帕奇 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>
      

      【讨论】:

        【解决方案3】:

        这取决于。在我的例子中,我有一个配置了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 中创建一个主体以用于服务器主体身份验证。有必要为此主体获取密钥表文件。对不起,我不能告诉你怎么做。

        在 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 必须将此 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()

        希望对你有帮助。

        【讨论】:

        • 听起来不错!我知道我也有 mod_auth_kerb,但我不熟悉配置(它是管理方面的......)。您能否详细说明并粘贴一些 apache、kerberos、tomcat 配置?我有 RHEL 和配置了 Kerberos 的 httpd apache。在同一台主机上,我有带有 myGui 应用程序的 tomcat8。
        • 好的,我要整理一些资料,今晚我会发布。
        • 我能再问一个问题吗?我需要配置这个工人吗?我有 mod_proxy_ajp 模块。我想知道如何将 mod_auth_kerb 与 mod_proxy_ajp 结合起来?我可以创建工作人员文件吗?
        • 您尝试了哪个版本的 apache?我只有 2.2。
        • 我向您展示的配置已经使用 apache 2.22.4mod_auth_kerbmod_jk 进行了测试。我没有使用mod_proxy_ajp 的经验,但我想按照我告诉你的非常相似的方式使用它不会有任何问题。
        猜你喜欢
        • 2012-12-23
        • 2018-12-01
        • 2012-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-07
        • 2014-12-16
        相关资源
        最近更新 更多