kerberos学习系列一:原理

1、简介

Kerberos 一词来源于古希腊神话中的 Cerberus —— 守护地狱之门的三头犬。

Kerberos 是一种基于加密 Ticket 的身份认证协议。Kerberos 主要由三个部分组成:Key Distribution Center (即KDC)、Client 和 Service。

优势:

  • 密码无需进行网络传输。基于 Ticket 实现身份认证,保障密钥安全性。
  • 双向认证。整个认证过程中,不仅需要客户端进行认证,待访问的服务也需要进行身份认证。
  • 高性能。一旦Client获得用过访问某个Server的Ticket,该Server就能根据这个Ticket实现对Client的验证,而无须KDC的再次参与。

2、核心概念

Kerberos基础概念可以参考本链接
所有概念可以参考上面链接内容,核心概念可以参考下面内容:

  • Principal:大致可以认为是 Kerberos 世界的用户名,用于标识身份。principal 主要由三部分构成:primary,instance(可选) 和 realm。

    • 包含 instance 的principal,一般会作为server端的principal,如:NameNode,HiverServer2,Presto Coordinator等;
    • 不含有 instance 的principal,一般会作为 客户端的principal,用于身份认证。例子如下图所示:在这里插入图片描述
  • Keytab:“密码本”。包含了多个 principal 与密码的文件,用户可以利用该文件进行身份认证。

  • Ticket Cache:客户端与 KDC 交互完成后,包含身份认证信息的文件,短期有效,需要不断renew。

  • Realm:Kerberos 系统中的一个namespace。不同 Kerberos 环境,可以通过 realm 进行区分。

  • Key Distribution Center(即 KDC), 是 Kerberos 的核心组件,主要由三个部分组成:

    • Kerberos Database: 包含了一个 Realm 中所有的 principal、密码与其他信息。(默认:Berkeley DB)
    • Authentication Service(AS): 进行用户信息认证,为客户端提供 Ticket Granting Tickets(TGT)。
    • Ticket Granting Service(TGS): 验证 TGT 与 Authenticator,为客户端提供 Service Tickets。
    • KDC Admin Account:
      用法:KDC Admin Account指用于管理Kerberos数据库和执行管理操作的管理员帐户。 示例:使用KDC Admin Account登录到Kadmin管理界面,执行各种管理操作。
  • Authenticator:
    用法:Authenticator用于身份验证,并生成Ticket。 示例: 用户进行身份验证并生成Authenticator:kinit user@EXAMPLE.COM 使用Authenticator进行服务访问:kvno service/host@EXAMPLE.COM

  • Credential:
    用法:Credential是Kerberos中表示用户身份的一种凭据,包含了TGT和相关信息。 示例: 当用户通过身份验证后,生成一个Credential:kinit user@EXAMPLE.COM 使用Credential访问受保护资源:klist

  • Ticket:
    用法:Ticket是已通过身份验证的用户的许可证,用于访问受保护的资源。 示例: 用户通过身份验证后,获得一个Ticket:kinit user@EXAMPLE.COM 使用Ticket访问受限资源:klist

  • Kadmin:
    用法:Kadmin用于管理Kerberos数据库和执行管理操作。 示例: 创建Principal:kadmin -q “addprinc user@EXAMPLE.COM” 生成Keytab文件:kadmin -q “ktadd -k keytabfile principal”

  • TGT:
    用法:TGT是用于获取其他服务票据的票据。 示例:用户通过身份验证后,获得一个TGT,用于获取其他受保护资源的许可证。

  • Kerberos Client:
    用法:Kerberos Client指使用Kerberos协议进行身份验证的客户端,可以是用户或服务。 示例:配置客户端以支持Kerberos协议,并使用Kerberos客户端与KDC进行身份验证。

3、原理

3.1 前置知识

  • Kerberos 基于 Ticket 实现身份认证,而非密码。如果客户端无法利用本地密钥,解密出 KDC 返回的加密Ticket,认证将无法通过。

  • 客户端将依次与 Authentication Service, Ticket Granting Service 以及目标Service进行交互,共三次交互。

  • 客户端与其他组件交互时,都将获取到两条信息,其中一条可以通过本地密钥解密出,另外一条将无法解密出。

  • 客户端想要访问的目标服务,将不会直接与KDC交互,而是通过能否正确解密出客户端的请求来进行认证。

  • KDC Database 包含有所有 principal 对应的密码。

  • Kerberos 中信息加密方式一般是对称加密(可配置成非对称加密)。

3.2 原理图

参考文章
在这里插入图片描述

3.3 整体流程

下面,我们将以客户端访问 http 服务为例,解释整个认证过程。

1. 客户端与 Authentication Service

第一步,客户端通过kinit USERNAME或其他方式,将客户端ID, 目标HTTP服务ID, 网络地址(可能是多个机器的IP地址列表,如果想在任何机器上使用,则可能为空),以及TGT有效期的寿命等信息发送给 Authentication Service。
在这里插入图片描述
第二步,Authentication Server 将检查客户端ID是否在KDC数据库中。

在这里插入图片描述
如果 Authentication Server 检查操作没有异常,那么KDC将随机生成一个 key,用于客户端与 Ticket Granting Service(TGS) 通信。这个Key,一般被称为 TGS Session Key。随后 Authentication Server 将发送两条信息给客户端。示意图如下:

在这里插入图片描述
其中一条信息被称为TGT,由TGS的密钥加密,客户端无法解密,包含客户端ID, TGS Session Key等信息。另一条信息由客户端密钥加密,客户端可以正常解密,包含目标 HTTP 服务ID,TGS Session Key等信息。

第三步,客户端利用本地的密钥解密出第二条信息。如果本地密钥无法解密出信息,那么认证失败。示意图如下:
在这里插入图片描述

2. 客户端与 Ticket Granting Service

这时候,客户端有了 TGT(由于本地没有TGS的密钥,导致无法解密出其数据)与 TGS Session Key。

第四步,客户端将做如下操作:
1、“无脑”将 AS 发送过来的TGT(由TGS密钥加密)转发给TGS
2、将包含自身信息的Authenticator(由TGS Session Key加密)发送给TGS

在这里插入图片描述
第五步,TGS 将利用 自身的密钥从TGT中解密出TGS Session Key,然后利用TGS Session Key从Authenticator 中解密出客户端的信息。

在这里插入图片描述
TGS 解密出所有信息后,将进行身份检查,进行认证:

  • 将客户端ID与TGT的客户端ID进行比较
  • 比较来自 Authenticator 的时间戳和TGT的时间戳 (典型的Kerberos系统的容忍度是2分钟,但也可以另行配置)
  • 检查TGT是否过期
  • 检查Authenticator是否已经在TGS的缓存中(为了避免重放攻击)

当所有检查都通过后, TGS 随机生成一个 Key 用于后续客户端与 HTTP 服务交互时进行通信加密使用,即 HTTP Session Key。同样地,TGS 将发送两条信息给客户端: 其中一条是 HTTP Ticket,由 HTTP 服务的密钥进行加密;另一条则由TGS Session Key加密,包含了客户端信息与时间戳。

在这里插入图片描述
第六步,客户端将利用TGS Session Key解密出其中一条信息,另一条信息由于是由目标HTTP服务加密,无法解密。
在这里插入图片描述

3. 客户端与 HTTP Service

这时候,客户端有了HTTP Ticket(由于本地没有HTTP服务的密钥,导致无法解密出其数据)与 HTTP Session Key。

第七步,客户端将:
1、“无脑”将 AS 发送过来的 HTTP Ticket(由HTTP 密钥加密)转发给目标 http 服务。
2、将包含自身信息的Authenticator(由HTTP Session Key加密)发送给 http 服务。
在这里插入图片描述
第八步,HTTP服务首先利用自身的密钥解密出 HTTP Ticket 的信息,得到 HTTP Session Key;随后,利用HTTP Session Key解密出用户的Authenticator信息。

在这里插入图片描述
信息解密完成后,HTTP 服务同样需要做一些信息检查:

  • 将 Authenticator 中的客户端ID与HTTP Ticket中的客户端ID进行比较
  • 比较来自 Authenticator 的时间戳和 HTTP Ticket 的时间戳 (典型的 Kerberos 系统对差异的容忍度是 2 分钟,但也可以另行配置)
  • 检查Ticket是否过期
  • 检查 Authenticator 是否已经在HTTP服务器的缓存中(为了避免重播攻击)

至此,所有的认证过程通过,客户端即可与远程HTTP服务完成了身份认证,可以进行后续的信息通信。

4、不同概念的区别

  • Authenticator用于身份验证,并生成Ticket;
  • KDC是负责认证和授权的核心组件;
  • TGS负责颁发服务票据;
  • AS负责处理初始身份验证请求并颁发TGT。
  • KDC Server是运行KDC组件的服务器;
  • Realm是安全凭据的命名空间;
  • Principal是Kerberos中的身份;
  • Keytab是存储加密凭据的文件;
  • Credential是表示用户身份的一组信息;
  • Ticket是已通过身份验证的用户的许可证;
  • Kadmin是用于管理Kerberos数据库和执行管理操作的服务器;
  • TGT是用于获取其他服务票据的票据。
  • Server是可以在Kerberos中进行身份验证和授权的服务或主机;
  • Kerberos Client是使用Kerberos协议进行身份验证的客户端;
  • KDC Admin Account是用于管理Kerberos数据库和执行管理操作的管理员帐户。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/434105.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网站建设:承诺网站打开速度,这个要求合理吗?

很多甲方都要求网站的打开速度,这个要求合理吗?其实说合理也合理,说不合理也不合理。 承诺打开速度的合理性的一面 要求网站打开速度是一个合理的要求。网站的打开速度对于用户体验和网站的成功至关重要。以下是一些原因说明为什么网站打开速…

Python实现选择排序算法

Python实现选择排序算法 以下是使用Python实现选择排序算法的示例代码&#xff1a; def selection_sort(arr):n len(arr)for i in range(n):min_index i# 找到未排序部分的最小元素的索引for j in range(i 1, n):if arr[j] < arr[min_index]:min_index j# 将最小元素与…

【Python】新手入门(7):变量的数据类型转换

【Python】新手入门&#xff08;7&#xff09;&#xff1a;变量的数据类型转换 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1…

Locust中wait_time中匿名函数使用方法浅析

前言 翻出之前做个压测项&#xff0c;看到locust中对等待时间的实现方式感到好奇&#xff0c;于是总结下来。 源代码实现 def between(min_wait, max_wait):"""Returns a function that will return a random number between min_wait and max_wait.Example:…

【Linux网络】再谈 “协议“

目录 再谈 "协议" 结构化数据的传输 序列化和反序列化 网络版计算器 封装套接字操作 服务端代码 服务进程执行例程 启动网络版服务端 协议定制 客户端代码 代码测试 使用JSON进行序列化与反序列化 我们程序员写的一个个解决我们实际问题&#xff0c;满…

最强照片AI无损放大工具

使用人工智能的能力来放大图像&#xff0c;同时为惊人的结果添加自然的细节。 使用深度学习技术&#xff0c;A.I.GigaPixEL可以放大图像并填满其他调整大小的产品所遗漏的细节。 下载地址&#xff1a;最强照片AI无损放大工具.zip

LeetCode-第201题-数字范围按位与

1.题目描述 给你两个整数 left 和 right &#xff0c;表示区间 [left, right] &#xff0c;返回此区间内所有数字 按位与 的结果&#xff08;包含 left 、right 端点&#xff09;。 2.样例描述 3.思路描述 方法一&#xff1a;按位与&#xff0c;求两端数字二进制的公共前缀&…

数据库系列之:什么是 SAP HANA?

数据库系列之&#xff1a;什么是 SAP HANA&#xff1f; 一、什么是 SAP HANA&#xff1f;二、什么是内存数据库&#xff1f;三、SAP HANA 有多快&#xff1f;四、SAP HANA 的十大优势五、SAP HANA 架构六、数据库设计七、数据库管理八、应用开发九、高级分析十、数据虚拟化 一、…

18.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据分析工具数据与消息配置的实现

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 上一个内容&#xff1a;17.数据分析工具配置功能的实现 码云地址&#xff08;master 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/titan…

中医舌苔笔记

舌诊时按照舌尖-舌中-舌根-舌侧的顺序进行观察。 先看舌体再看舌苔&#xff0c;30秒左右。 如果一次望舌判断不清&#xff0c;可令病人休息3~5分钟后&#xff0c;重新观察一次 舌诊脏腑部位分属图 舌体 胖嫩而边有齿痕为气虚、阳虚。 薄白而润为风寒&#xff1b; 薄白而燥…

CVE-2020-27194:eBPF verifier 整数截断导致的越界读写

前言 影响版本&#xff1a;5.8.x 内核分支&#xff0c;v5.8.15 以及更低的版本 编译选项&#xff1a;CONFIG_BPF_SYSCALL&#xff0c;config 所有带 BPF 字样的编译选项 漏洞概述&#xff1a;eBPF 验证程序中进行 or 操作时&#xff0c;scalar32_min_max_or 函数将 64 位的值赋…

Android开发社招面试总结,Android程序员面试必备的知识点

导语 学历永远是横在我们进人大厂的一道门槛&#xff0c;好像无论怎么努力&#xff0c;总能被那些985,211 按在地上摩擦&#xff01; 不仅要被“他们”看不起&#xff0c;在HR挑选简历&#xff0c;学历这块就直接被刷下去了&#xff0c;连证明自己的机会也没有&#xff0c;学…

社区分享|中华保险基于MeterSphere开展接口自动化测试

中华联合保险集团股份有限公司&#xff08;以下简称为“中华保险”&#xff09;始创于1986年&#xff0c;是全国唯一一家以“中华”冠名的国有控股保险公司。截至2022年12月底&#xff0c;中华保险总资产为1006.06亿元&#xff0c;在全国拥有超过2900个营业网点&#xff0c;员工…

2024 年广西职业院校技能大赛高职组《云计算应用》赛项赛题第 3 套

#需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; 某企业根据自身业务需求&…

模仿Gitee实现站外链接跳转时进行确认

概述 如Gitee等网站&#xff0c;在有外部链接的时候如果不是同域则会出现一个确认页面。本文就带你看看这个功能应该如何实现。 效果 实现 1. 实现思路 将打开链接作为参数传递给一个中间页面&#xff0c;在页面加载的时候判断链接的域名和当前网站是否同域&#xff0c;同域…

web学习笔记(二十六)

目录 1.JS执行队列 1.1JS是单线程 1.2Web Worker 1.3同步和异步 1.4JS执行机制 2.location对象 2.1什么是location对象 2.2url包含的信息 2.3location对象属性 2.4location对象的方法 3.navigator对象和history对象 3.1navigator对象 3.2history对象 1.JS执行队…

基于深度学习的苹果叶片病害检测系统(含UI界面、yolov8、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8 yolov8主要包含以下几种创新&#xff1a;         1. 可以任意更换主干结构&#xff0c;支持几百种网络主干。 数据集&#xff1a;     网上下载的数据集&#x…

Jmeter吞吐量控制器使用

场景&#xff1a;在同一个线程组里&#xff0c;有10个并发&#xff0c;7个做A业务&#xff0c;3个做B业务&#xff0c;要模拟这种场景&#xff0c;可以通过吞吐量模拟器来实现。 添加吞吐量控制器 用法1&#xff1a;Percent Executions 在一个线程组内分别建立两个吞吐量控制…

rtt的io设备框架面向对象学习-电阻屏LCD设备

目录 1.8080电阻屏LCD设备1.1 构造流程1.2 使用 2.spi电阻屏LCD3.i2c电阻屏LCD4.总结 电阻屏LCD通信接口有支持I2c、SPI和8080通信接口的&#xff0c;根据通信接口分立章节。 另外&#xff0c;lcd这块不像其他设备类&#xff0c;rtt没有实现lcd设备类的设备驱动框架层&#xf…

我们发布了一款类Wox和Alfred,全新的桌面端效率工具RunFlow,欢迎大家来体验

RunFlow是一款跨平台的生产力工具&#xff0c;可以启动应用程序和搜索文件等&#xff0c;类似于Windows平台的Wox和PowerToys&#xff0c;同样也类似于Mac平台的Alfred和Raycast。但我们并不与这些工具相同&#xff0c;我们有自己独特的新特性。下面&#xff0c;我们将向您详细…