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数据库和执行管理操作的管理员帐户。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker数据卷篇

1. 数据卷(容器数据管理) 引言:在之前的nginx案例中,修改nginx的html页面时,需要进入nginx内部。并且因为没有编辑器,修改文件也很麻烦。 这就是因为容器与数据(容器内文件)耦合带…

Scrapy与分布式开发(3):Scrapy核心组件与运行机制

Scrapy核心组件与运行机制 引言 这一章开始讲解Scrapy核心组件的功能与作用,通过流程图了解整体的运行机制,然后了解它的安装与项目创建,为后续实战做好准备。 Scrapy定义 Scrapy是一个为了爬取网站数据、提取结构性数据而编写的应用框架…

Claude3荣登榜首,亚马逊云科技为您提供先行体验!

Claude3荣登榜首,亚马逊云科技为您提供先行体验! 个人简介前言抢先体验关于Amazon BedrockAmazon Bedrock 的功能 Claude3体验教程登录Amazon Bedrock试用体验管理权限详细操作步骤1.提交应用场景详细信息2.请求模型的访问权限3.请求成功,开始…

【LeetCode】674. 最长连续递增序列(简单)——代码随想录算法训练营Day52

题目链接&#xff1a; 题目描述 给定一个未经排序的整数数组&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r&#xff08;l < r&#xff09;确定&#xff0c;如果对于每个 l < i < r&#xff0c…

Mybatis实现分页查询数据(代码实操讲解)

在MyBatis中实现分页查询的常见方式有两种&#xff1a;使用MyBatis内置的分页插件如PageHelper&#xff0c;或者手动编写分页的SQL语句。下面我将为你提供两种方式的示例代码。 使用PageHelper分页插件 首先&#xff0c;确保你的项目中已经添加了PageHelper的依赖。在Maven项…

overleaf latex 笔记

overleaf: www.overleaf.com 导入.tex文件 1.代码空一行&#xff0c;代表文字另起一段 2. 1 2 3 排序 \begin{enumerate} \item \item \item \end{enumerate} 3.插入图片 上传图片并命名 \usepackage{float}导包\begin{figure}[H]&#xff1a;表示将图…

面试题--02

粘包问题 粘包问题是在TCP协议下&#xff0c;发送方发送的多个数据包在接收方接收时&#xff0c;数据之间没有明确的分界线&#xff0c;导致接收方无法正确区分每个数据包&#xff0c;从而无法正确读取数据。 解决办法&#xff1a; 1、服务器和客户端提前协商好每个消息的长度…

数据分析Pandas专栏---第十四章<Pandas训练题(中)>

前言: 继续上一篇: 数据分析Pandas专栏---第十三章&#xff1c;Pandas训练题(初)&#xff1e;-CSDN博客 正文: 题1: 如何将DataFrame的列按照指定的顺序进行排序&#xff1f; 题目&#xff1a; 给定一个DataFrame&#xff0c;包含订单编号、商品名称、商品数量等列&…

【网络安全】漏洞挖掘入门教程(非常详细),小白是如何挖漏洞(技巧篇)0基础入门到精通!

温馨提示&#xff1a; 初学者最好不要上手就去搞漏洞挖掘&#xff0c;因为漏洞挖掘需要很多的系统基础知识和一些理论知识做铺垫&#xff0c;而且难度较大…… 较合理的途径应该从漏洞利用入手&#xff0c;不妨分析一些公开的CVE漏洞。很多漏洞都有比较好的资料&#xff0c;分…

【四】【SQL Server】如何运用SQL Server中查询设计器通关数据库期末查询大题

数据库学生选择1122 数据库展示 course表展示 SC表展示 student表展示 数据库学生选课1122_3 第十一题 第十二题 第十三题 第十四题 第十五题 数据库学生选课1122_4 第十六题 第十七题 第十八题 第十九题 第二十题 数据库学生选课1122_5 第二十一题 第二十二题 结尾 最后&…

保留数据的重装系统教程!(win10系统)

上车警告&#xff01;&#xff01;&#xff01; 本教程无需思考&#xff0c;跟着操作一步一步来就能完成系统的重装。原理是将C盘系统重装&#xff0c;其他盘符数据保存。适用于系统盘重装数据或更改系统版本。 重要提示&#xff01;&#xff01;&#xff01; C盘有重要学习资…

Long-term Correlation Tracking LCT目标跟踪算法原理详解(个人学习笔记)

目录 1. 算法总览2. 算法详解2.1. 基础相关滤波跟踪2.2. 各模块详解2.2.1. 相关跟踪2.2.2. 在线检测器 3. 算法实现3.1. 算法步骤3.2. 实现细节 4. 相关讨论&总结 1. 算法总览 LCT的总体流程如上图所示&#xff0c;其思想为&#xff1a;将长时跟踪&#xff08;long-term tr…

第五节 JDBC驱动程序类型

JDBC驱动程序是什么&#xff1f; JDBC驱动程序在JDBC API中实现定义的接口&#xff0c;用于与数据库服务器进行交互。 例如&#xff0c;使用JDBC驱动程序&#xff0c;可以通过发送SQL或数据库命令&#xff0c;然后使用Java接收结果来打开数据库连接并与数据库进行交互。 JDK…

18.四数之和

题目&#xff1a;给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#x…

(力扣题库)字符串相乘(C++)

题意如下&#xff1a; 给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 "2"…

每日一题 — 有效三角形的个数

611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 双指针思想&#xff0c;先将数据排序 然后先固定最大的数Max&#xff0c;也就是数组最后的数再定义一左一右两个下标 left 、 right&#xff0c;当这个值相加大于最大的数&#xff0c;那么他两…

Pytorch学习 day05(RandomCrop、Transforms工具使用总结)

RandomCrop 将PIL或Tensor格式的输入图片&#xff0c;随机裁剪指定尺寸的部分输入尺寸可以为序列或单个整形数字代码如下&#xff1a; from PIL import Image from torchvision import transforms from torch.utils.tensorboard import SummaryWriterimg Image.open("i…

token的无感刷新

Token的无感刷新通常通过以下步骤实现&#xff1a; 用户登录时&#xff0c;服务器生成一个访问令牌&#xff08;Access Token&#xff09;和一个刷新令牌&#xff08;Refresh Token&#xff09;&#xff0c;并将其返回给客户端。 客户端在每个请求中携带访问令牌&#xff0c;以…

百度换肤js

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>05 图片切换</title><style type"text/css">*{padding: 0;margin: 0;}#box{border: 1px solid #ccc;width: 430px;height: 70px…

python高级之元类

python高级之元类 一、Type创建类1、传统方式创建类2、非传统方式 二、元类三、总结 一、Type创建类 class A(object):def __init__(self, name):self.name namedef __new__(cls, *args, **kwargs):data object.__new__(cls)return data根据类创建对象 objA(‘kobe’) 1、执…