制作自己的kerberos身份验证票证

hfwmuf9z  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(525)

我使用的是java类org.apache.hadoop.security。apachehadoop2.5.0中的authentication.server.authenticationfilter作为我们希望添加kerberos身份验证的tomcat6servlet前面的过滤器。
我试图针对这个过滤器编写一些测试用例,以便我们更好地了解它的工作原理和作用。
为了让筛选器对用户进行身份验证,它正在读取http请求的“authorization”头,期望值包含“negotiate”
我对kerberos工作原理的理解使我相信,在创建类似以下内容的http请求时,我应该能够编写代码:

// normally the server principal keytab is not available from the client side,
// but for the purpose of making test cases I see no problem with sharing the keytab
// between the client side and the server side
javax.security.auth.kerberos.Keytab kt = KeyTab.getInstance("keytab");
KerberosKey keys[] = kt.getKeys("HTTP/voltage-pp-0000.albert.int@ALBERTS.INT");
SomeTokenType token = new SomeTokenType();
<code to set token parameters>

// my understanding of Kerberos is that the only cyphertext key 
// needed on this token
// is one of the server principal's keys from the Keytab file 
// (which does contain ~5 
// keys of different sizes and types, I've checked)
EncryptedTokenType etoken = <encrypt token with a key from keys> 
byte[] array = etoken.getBytes();

httprequest.addHeader("Authorization","Negotiate " + new Base64(0).encode(array));

所以,这里的问题是:
体现在“授权协商”中发送的kerberos auth令牌的java类是什么?
身份验证令牌的哪些字段必须设置为哪些值?
使用什么加密算法来针对keytab密钥加密auth令牌?
什么是最好的keytab键?
一旦加密,对身份验证令牌进行字节序列化的机制是什么?

xxls0lw8

xxls0lw81#

你说得对,用这种方法“伪造”一张票是可能的。但是,据我所知,没有标准的kerberos api可以做到这一点。
您基本上需要对整个kerberos协议进行反向工程,以创建基于keytab的服务票证。服务票格式记录在这里
https://www.ietf.org/rfc/rfc4120.txt
您可以使用keytab中的任何键来加密服务票据。一旦您有了服务票证,您就需要实现这个rfc来创建协商头。
http://tools.ietf.org/html/rfc4559
一般来说,为客户机主体获取一个keytab并使用它和kinit来获取服务票证以进行测试要简单得多。您的方法可以工作,而且可能有黑客代码在某处实现它,但是在kerberos环境中进行测试是一种非常不标准的方法。

相关问题