前言:

信息安全越来越重要,企业外面越来越多的开始器重信息安全。其中在java/大数据领域很容易遇到SASL/Kerberos这些概念。比如:hadoop,kafka等常见的大数据组件。接下来理清这些概念

Kerberos名词:

  1. Realm认证管理域,通常是服务端和客户端在一个域内才能进行认证。
  2. Principal客户端和服务端的名称,通常Client命名规则为name@REALM,Server命名规则为name/hostname@REALM
  3. keytab每个principal的配套密码,可代替手动输入密码
  4. krb5.conf记录KDC的host与定义realm规则的配置文件

例如:

你的hadoop有十台主机,/etc/hosts配置的host为hadoop[1-10].hadoop.com,name在定义你的Kerberos的Realm时就是HADOOP.COM,你创建的客户端的服务端的principal都是以@HADOOP.COM结尾。

Client通过解析Server的principal中的hostname部分来通过/etc/hosts来映射出Server的IP,所以使用Kerberos一定要配置Server所有的hosts

安装

  1. 执行yum install krb5-server krb5-libs krb5-auth-dialog
  2. 编辑/etc/krb5.conf,配置realm和kdc等配置
  3. 执行kdb5_util create  -s  -r HADOOP.COM来生成AD(Account Database),存放principal和密码
  4. 启动服务systemctl start krb5kdc.servicesystemctl start kadmin.service
  5. 在kdc服务器中通过kadmin.local命令进入AD,通过下面命令来生成pricipalxst -k /etc/test.keytab test@HADOOP.COM

命令:

  1. kinit -kt /path/testkeytab [principal]:向KDC申请并缓存TGT
  2. klist:查看当前主机用户下principal已经缓存的TGT以及有效期
  3. kdestory:销毁TGT
  4. kadmin.local:在kdc主机root下执行可利用root/admin@BDXSD.CM进入AD命令行界面,可执行以下命令
    1. listprincs:查看所有的principals
    2. [add/del]princ [name]:添加/删除principal
    3. xst -l /path/namekeytab [principal]:为principal生成keytay

认证流程: 

术语解释:

JAAS

JAAS全称为 Java Authentication Authorization Service,中文含义即Java认证和授权服务。使用可插入方式将认证和授权逻辑和应用程序分离开。用户程序可以指定使用哪个JAAS配置文件。

常见的Kerberos认证的JAAS文件如下:

Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
serviceName="xxx"
keyTab="/etc/security/keytabs/xxx.keytab"
principal="xxx/manager@PAUL.COM"
userTicketCache=true;
};

loginModule

LoginModule需要配置为全限定名。LoginModule的类型直接决定了该entry需要通过何种方式认证。

一个entry中可以配置多个LoginModule。如果配置了多个LoginModule,认证流程会按照顺序依次执行各个LoginModule。但是有些flag的值会中断认证流程

flag

flag是枚举类型(LoginModuleControlFlag),它的值和含义如下列表所示:

  • Required:要求LoginModule成功。无论成功与否,认证流程都会继续走后面的LoginModule。
  • Requisite:要求LoginModule成功。如果成功,认证流程会继续走后面的LoginModule,如果失败,认证流程终止。
  • Sufficient:不要求LoginModule成功。如果成功,认证流程终止返回应用,如果失败认证流程会继续走后面的LoginModule。
  • Optional:不要求LoginModule成功。无论成功与否,认证流程都会继续走后面的LoginModule。

整个认证流程是否成功的判定标准:

  1. 仅当所有的Required和Requisite LoginModule成功,认证流程才成功。
  2. 如果配置了Sufficient LoginModule,并且它认证成功,要求在它之前所有的Required和Requisite LoginModule都成功,认证流程才算成功。
  3. 如果没有配置任何Required和Requisite LoginModule,Sufficient或Optional LoginModule至少成功任意一个,认证流程才算成功。

options

options为LoginModule接收的认证选项。格式为0或多个key=value,常用于传递认证附属参数。在LoginModule中使用一个Map来接收并处理这些参数。

Java通过配置VM参数的方式,指定应用使用哪个JAAS配置文件。VM参数配置方法如下:

-Djava.security.auth.login.config==/path/to/jaas.conf // 注意:这里使用"=="来覆盖JVM默认的jaas配置文件

在应用中获取JAAS配置信息,可以在应用中通过Java代码方式获取JAAS配置文件内容。代码如下:

Configuration.getConfiguration().getAppConfigurationEntry("entryName");

LoginModule

即登录模块。不同的LoginModule对应了不同的认证方式。例如Krb5LoginModule使用Kerberos作为认证方式,FileLoginModule使用外部保存的密码文件,通过用户名密码方式登录等。

Subject

认证的主体,可以代表一个人,一个角色一个进程等。认证成功之后可以从LoginContext获取Subject,代表一种身份,用户可以通过这个身份执行一些需要权限才能运行的逻辑。

Principal

可认为是一种权限。一个Subject可以包含多个Principal。用户认证成功之后,把授予的Principal加入到和该用户关联的Subject中,该用户便具有了这个Principal的权限。

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

认证底层:

Krb5LoginModule

登录kerberos,要跟KDC交互,这个流程的具体定义,这里不赘述。

这个登录的动作实现在com.sun.security.auth.module.Krb5LoginModule。Krb5LoginModule是LoginModule的实现。

public class Krb5LoginModule implements LoginModule

以LoginContext作为入口,会初始化LoginModule,默认地,它基于jaas配置文件来实例化LoginModule的具体实现。jaas文件前面介绍过:一个名字和一对{}组成了一个Entry,能够同时写多个Entry,只要通知LoginContext你要初始化哪个Entry名字即可。

为什么说”默认基于jaas配置”呢。因为默认LoginContext是从java.security.auth.login.config指向的jaas文件读取Entry的。用户能够自定义实现LoginModule

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

登录的主体被称为Subject,可以理解为各种Token之类的封装。基于Subject.doAs系列办法进行授权代码的调用。doAs这个代码块,称为Context,参考:

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

GSSAPI

到这里应该搞清楚了如何通过KDC拿到Subject,接下是GSSAPI。

登录只是获取了某种Token,然而Token的合法性必须通过通信双方进行至多一次交互能力确定,这就是GSSAPI做的事件。

然而,在GSSAPI中并没有涉及到具体的通信协议和形式!

GSSAPI客户端首先调用initSecContext,将byte[]发给服务端(任何形式),服务端收到byte[]后,调用acceptSecContext,将byte[]发还给客户端,客户端再次调用initSecContext,到这里就实现了认证,“替换了token”。

SASL

SASL作为高层次框架,定义的是一套接口,看一下接口定义,就能领会到其实GSSAPI是其中一种实现,换句话说,在进行基于kerberos认证的时候,既能够间接应用GSSAPI层接口,也能够应用sasl层的接口。

总结:

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

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

kerberos认证相关概念和流程相关推荐

  1. Kafka 认证三:添加 Kerberos 认证详细流程

    背景 上一章节介绍了 Kerberos 服务端和客户端的部署过程,本章节继续介绍 Kafka 添加 Kerberos 认证的部署流程,及 Java API 操作的注意事项. sasl.kerberos ...

  2. Spark操作Hive(开启Kerberos认证)代码提交华为云DAYU的MRS Spark组件--方法流程及注意事项

    背景: 最近在测试华为云DAYU MRS Spark操作Hive的流程,因kerberos认证的问题一直测试失败. 代码示例: val sparkSession = SparkSession.buil ...

  3. Kerberos认证流程详解

    Kerberos是诞生于上个世纪90年代的计算机认证协议,被广泛应用于各大操作系统和Hadoop生态系统中.了解Kerberos认证的流程将有助于解决Hadoop集群中的安全配置过程中的问题.为此,本 ...

  4. NTLM及Kerberos认证流程

    NTLM及Kerberos认证流程 NTLM认证 1.概念 NTLM是NT LAN Manager的缩写,NTLM 是指 telnet 的一种验证身份方式,即问询/应答身份验证协议,是 Windows ...

  5. kerberos认证搭建安装

    kerberos认证搭建安装 一.Kerberos简介 1.Kerberos 2.Kerberos认证流程 2.1客户端认证 2.2服务授权 2.3服务请求 3.kdc集群 3.1安装包 3.2术语 ...

  6. kerberos认证_初识 Windows域认证体系 Kerberos认证

    关键词: Kerberos认证 域控制器(Domain Controller,DC) 密钥分发中心(Key Distribution Center,KDC) 帐户数据库(Account Databas ...

  7. 【kerberos】kerberos 认证 详情介绍

    文章目录 1.概述 2.简单认证 2.详细认证 1.概述 本文章是视频:Kerberos认证详解 笔记. Kerberos是诞生于上个世纪90年代的计算机认证协议,被广泛应用于各大操作系统和Hadoo ...

  8. 基于对称加密的密钥分配和Kerberos认证

    基于对称加密的密钥分配和Kerberos认证 对于对称加密,加密双方必须共享同一密钥,而且必须保护密钥不被他人读取.此外,常常需要频繁地改变密钥来减少某个攻击者可能知道密钥带来的数据泄露.因此,任何密 ...

  9. Kerberos认证原理

    文章目录 Kerberos介绍 第一步:AS(Authentication Service)Exchange 第二步:TGS(Ticket Granting Service)Exchange 第三步: ...

最新文章

  1. socket可以写成单例嘛_精读《设计模式 - Singleton 单例模式》
  2. ComponentOne WebChart for ASP.NET基础
  3. 药品查询APP开发流程(七)--开发—yao.js
  4. 201621123028《Java程序设计》第5周学习总结
  5. 洛谷——P1583 魔法照片
  6. java.io.IOException: No FileSystem for scheme: hdfs转载加自己笔记
  7. Sudoku Extension UVALive - 4763
  8. 单精度浮点数与十六进制转换
  9. mysql 吧库下的表名都加_mysql数据库表名大小写问题
  10. 如何对待第一个女朋友
  11. 今天我开通了51cto的博客
  12. python elseif用法_Python关键字简介
  13. Linux 命令(141)—— nmap 命令
  14. URLDecoder用法
  15. 研发项目wbs分解简单案例_2013信息系统项目管理师案例分析之工作分解结构(WBS)案例...
  16. 火山引擎举办视频云科技原力峰会,发布面向体验的全新视频云产品矩阵
  17. 关于修改文件拒绝访问的问题
  18. 中国社科中外合作办学双证博士创新与领导力管理学博士
  19. 为什么学习Vue框架??
  20. Python快速爬虫技巧

热门文章

  1. c#量化交易_量化交易从入门到放弃(1)
  2. c语言中 hr是什么字符,Heat Treatment  的缩写(HR)C
  3. java 字符串转换成map_java中string类型转换成map
  4. Java学习笔记——程序逻辑控制
  5. [原]【Visual C++】游戏开发笔记十六 讲解一个完整的回合制游戏demo
  6. 旅行商问题(travelling salesman problem, TSP) 解题报告
  7. 删除压缩包密码的方式有几种?
  8. Ubunu安装一个更新版本的gda(2.3.2到 3.0.4)
  9. Flutter的基础知识之Dart语法
  10. 一些常用工具下载链接