我在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
答案 0 :(得分:1)
这取决于。在我的例子中,我有一个配置了mod_kerb
的Apache服务器,并通过AJP将http请求转发给Tomcat。
在这种情况下,Tomcat AJP conector配置了tomcatAuthentication=false
,我可以使用request.getRemoteUser()
从JSP和Servlet获得用户身份验证。
显然,用户字符串会在@
之后附带域信息,因此您必须考虑它。
如果您对我的解决方案感兴趣,我可以详细说明我的答案。
我编辑我的答案,提供有关配置Tomcat以使用Kerberos的更多信息。
首先,在每个系统AD服务器,Apache服务器和Tomcat服务器中配置NTP客户端是很常见的。如果没有日期和时间同步,则会出现clock skew too great
或postdating
问题。
您需要在AD中创建一个主体以用于服务器主体身份验证。有必要获取此主体的keytab文件。对不起,我无法告诉你如何做到这一点。
获得服务器主体和密钥表文件后,就可以配置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
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配置(我之前已经回答过这个问题,但我在这里剪切并粘贴并适应这个问题),程序如下:
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.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”重新生成它,然后它才能工作。