关于java:理清SASLGSSAPIKerberos

55次阅读

共计 2040 个字符,预计需要花费 6 分钟才能阅读完成。

信息安全越来越重要,企业外面越来越多的开始器重信息安全。其中在 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 格调:

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 是其中一种实现,这个事实:

换句话说,在进行基于 kerberos 认证的时候,既能够间接应用 GSSAPI 层接口,也能够应用 sasl 层的接口。

论断

基于本文的探讨,须要明确上面几个概念:

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

正文完
 0