【Java】理清SASL/GSSAPI/Kerberos

理清SASL/GSSAPI/Kerberos

P_Chou水冗发布于 今天 08:57

信息安全越来越重要,企业里面越来越多的开始重视信息安全。其中在java/大数据领域很容易遇到SASL/Kerberos这些概念。比如:hadoop,kafka等常见的大数据组件。本文试图理清楚这些概念之间的真正联系。

  • Kerberos: 一种基于中心认证服务器的中心化认证协议和框架。应用程序访问服务前需使用此框架进行登录认证,以在应用程序之间形成动态可控的受信。中心化登录服务器称为KDC。
  • GSSAPI: 在jdk中,作为对kerberos认证实现的一部分。
  • Krb5LoginModule: 在jdk中,负责从KDC获取登录凭证,是kerberos认证实现的一部分。
  • SASL: 在jdk中定义的一种通用的基于客户端和服务端的认证框架,GSSAPI是其实现之一。

Krb5LoginModule

为了说清楚问题,我们自底向上来看。登录kerberos,显然要跟KDC交互,可以从网上查到这个流程的具体定义,这里不赘述。这个登录的动作实现在com.sun.security.auth.module.Krb5LoginModule(不同的jdk-vendor可以有不同的实现)。Krb5LoginModule是一个实现了LoginModule

LoginContext作为入口,会初始化LoginModule,默认地,它基于jaas配置文件来实例化LoginModule的具体实现。jaas文件长这个样子:

EsClient {

com.sun.security.auth.module.Krb5LoginModule required

useKeyTab=true

keyTab=""

principal=""

useTicketCache=false

storeKey=true

debug=true;

};

一个名字和一对{}组成了一个Entry,可以同时写多个Entry,只要告诉LoginContext你要初始化哪个Entry名字即可。

为什么说"默认基于jaas配置"呢。因为默认LoginContext是从java.security.auth.login.config指向的jaas文件读取Entry的。但用户可以自己实现这种provider。

我们可以自定义实现LoginModule:JAAS LoginModule Developer's Guide

LoginContext提供login方法来登录,内部就是调用实例化的LoginModule来登录的。于是Krb5LoginModule作为LoginModule的实现,也是在login被调用的时候跟KDC发生交互的。

登录的成果被称为Subject,可以理解为各种Token之类的东西的封装。基于Subject.doAs系列方法进行授权代码的调用。这块是jdk一贯的API风格:

【Java】理清SASL/GSSAPI/Kerberos

doAs这个代码块,我们称为Context,其中的代码可以利用某种机制

参考:

  • Java Authentication and Authorization Service (JAAS) Reference Guide
  • JAAS Authentication

GSSAPI

到这里应该搞清楚了如何通过KDC拿到Subject,现在轮到GSSAPI了。登录只是获取了某种Token,但是Token的合法性必需通过通信双方进行至少一次交互才能确定,这就是GSSAPI做的事情。然而,必需事先区分的是,在GSSAPI中并没有涉及到具体的通信协议和方式!通信可以是直接通过tcp自己设计包封装,也可以通过http遵循SPNEGO...

下面代码都需要写在
GSSAPI客户端首先调用initSecContext,将得到的byte[]发给服务端(任何方式),服务端用收到的byte[],调用acceptSecContext,将得到的byte[]发还给客户端,客户端再次调用initSecContext,一般到这里就结束了。完成了认证,“交换了token”。

JDK文档中的包含的客户端和服务端的示例如下

https://docs.oracle.com/javas...

https://docs.oracle.com/javas...

当客户端和服务端都完成以后,后续的通信应该使用wrapunwrap对数据进行“加密”后发送。

SASL

SASL作为高层次框架,定义的是一套接口,看一下接口定义,就能体会到其实GSSAPI是其中一种实现,这个事实:

【Java】理清SASL/GSSAPI/Kerberos

【Java】理清SASL/GSSAPI/Kerberos

换句话说,在进行基于kerberos认证的时候,既可以直接使用GSSAPI层接口,也可以使用sasl层的接口。

结论

基于本文的讨论,需要明确下面几个概念:

  • kerberos的登录流程,是由LoginContet/LoginModule完成的,成果是Subject
  • 在Subject的doAs代码块中,需要使用GSSAPI或SASL接口,二选其一
  • GSSAPI或SASL并不定义,也不实现通信,用户代码自己设计协议来互传token
  • GSSAPI下基于http的token互传其实就是SPNEGO协议

java

阅读 103发布于 今天 08:57

本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议


全干工程师

分享和记录个人技术经验,由于接触的东西比较杂,可能什么都写,看官见谅

avatar

P_Chou水冗

大数据spark/flink/hadoop/elasticsearch/kafka架构与开发

5k 声望

157 粉丝

0 条评论

得票时间

avatar

P_Chou水冗

大数据spark/flink/hadoop/elasticsearch/kafka架构与开发

5k 声望

157 粉丝

宣传栏

信息安全越来越重要,企业里面越来越多的开始重视信息安全。其中在java/大数据领域很容易遇到SASL/Kerberos这些概念。比如:hadoop,kafka等常见的大数据组件。本文试图理清楚这些概念之间的真正联系。

  • Kerberos: 一种基于中心认证服务器的中心化认证协议和框架。应用程序访问服务前需使用此框架进行登录认证,以在应用程序之间形成动态可控的受信。中心化登录服务器称为KDC。
  • GSSAPI: 在jdk中,作为对kerberos认证实现的一部分。
  • Krb5LoginModule: 在jdk中,负责从KDC获取登录凭证,是kerberos认证实现的一部分。
  • SASL: 在jdk中定义的一种通用的基于客户端和服务端的认证框架,GSSAPI是其实现之一。

Krb5LoginModule

为了说清楚问题,我们自底向上来看。登录kerberos,显然要跟KDC交互,可以从网上查到这个流程的具体定义,这里不赘述。这个登录的动作实现在com.sun.security.auth.module.Krb5LoginModule(不同的jdk-vendor可以有不同的实现)。Krb5LoginModule是一个实现了LoginModule

LoginContext作为入口,会初始化LoginModule,默认地,它基于jaas配置文件来实例化LoginModule的具体实现。jaas文件长这个样子:

EsClient {

com.sun.security.auth.module.Krb5LoginModule required

useKeyTab=true

keyTab=""

principal=""

useTicketCache=false

storeKey=true

debug=true;

};

一个名字和一对{}组成了一个Entry,可以同时写多个Entry,只要告诉LoginContext你要初始化哪个Entry名字即可。

为什么说"默认基于jaas配置"呢。因为默认LoginContext是从java.security.auth.login.config指向的jaas文件读取Entry的。但用户可以自己实现这种provider。

我们可以自定义实现LoginModule:JAAS LoginModule Developer's Guide

LoginContext提供login方法来登录,内部就是调用实例化的LoginModule来登录的。于是Krb5LoginModule作为LoginModule的实现,也是在login被调用的时候跟KDC发生交互的。

登录的成果被称为Subject,可以理解为各种Token之类的东西的封装。基于Subject.doAs系列方法进行授权代码的调用。这块是jdk一贯的API风格:

【Java】理清SASL/GSSAPI/Kerberos

doAs这个代码块,我们称为Context,其中的代码可以利用某种机制

参考:

  • Java Authentication and Authorization Service (JAAS) Reference Guide
  • JAAS Authentication

GSSAPI

到这里应该搞清楚了如何通过KDC拿到Subject,现在轮到GSSAPI了。登录只是获取了某种Token,但是Token的合法性必需通过通信双方进行至少一次交互才能确定,这就是GSSAPI做的事情。然而,必需事先区分的是,在GSSAPI中并没有涉及到具体的通信协议和方式!通信可以是直接通过tcp自己设计包封装,也可以通过http遵循SPNEGO...

下面代码都需要写在
GSSAPI客户端首先调用initSecContext,将得到的byte[]发给服务端(任何方式),服务端用收到的byte[],调用acceptSecContext,将得到的byte[]发还给客户端,客户端再次调用initSecContext,一般到这里就结束了。完成了认证,“交换了token”。

JDK文档中的包含的客户端和服务端的示例如下

https://docs.oracle.com/javas...

https://docs.oracle.com/javas...

当客户端和服务端都完成以后,后续的通信应该使用wrapunwrap对数据进行“加密”后发送。

SASL

SASL作为高层次框架,定义的是一套接口,看一下接口定义,就能体会到其实GSSAPI是其中一种实现,这个事实:

【Java】理清SASL/GSSAPI/Kerberos

【Java】理清SASL/GSSAPI/Kerberos

换句话说,在进行基于kerberos认证的时候,既可以直接使用GSSAPI层接口,也可以使用sasl层的接口。

结论

基于本文的讨论,需要明确下面几个概念:

  • kerberos的登录流程,是由LoginContet/LoginModule完成的,成果是Subject
  • 在Subject的doAs代码块中,需要使用GSSAPI或SASL接口,二选其一
  • GSSAPI或SASL并不定义,也不实现通信,用户代码自己设计协议来互传token
  • GSSAPI下基于http的token互传其实就是SPNEGO协议

以上是 【Java】理清SASL/GSSAPI/Kerberos 的全部内容, 来源链接: utcz.com/a/107992.html

回到顶部