信息安全越来越重要,企业外面越来越多的开始器重信息安全。其中在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 requireduseKeyTab=truekeyTab=""principal=""useTicketCache=falsestoreKey=truedebug=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格调:
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...
当客户端和服务端都实现当前,后续的通信应该应用wrap
和unwrap
对数据进行“加密”后发送。
SASL
SASL作为高层次框架,定义的是一套接口,看一下接口定义,就能领会到其实GSSAPI是其中一种实现,这个事实:
换句话说,在进行基于kerberos认证的时候,既能够间接应用GSSAPI层接口,也能够应用sasl层的接口。
论断
基于本文的探讨,须要明确上面几个概念:
- kerberos的登录流程,是由LoginContet/LoginModule实现的,成绩是Subject
- 在Subject的doAs代码块中,须要应用GSSAPI或SASL接口,二选其一
- GSSAPI或SASL并不定义,也不实现通信,用户代码本人设计协议来互传token
- GSSAPI下基于http的token互传其实就是SPNEGO协定