Kerberos认证协议

安全协议:Kerberos认证协议

一、简介

Kerberos由MIT于1988年开发,用于分布式环境中,完成服务器与用户之间的相互认证。设计者的设计初衷是要用Kerberos的三个头来守卫网络之门。三个头分别包括:认证、账目清算和审计。

Kerberos要解决的问题

在一个开放的分布式网络环境中,用户通过工作站访问服务器提供的服务,存在许多问题:

  • 工作站上的用户可以冒充另一个用户操作
  • 用户可以改变工作站的地址冒充另一台工作站
  • 用户可以窃听并回放他人的信息交换,获得对于某种服务的访问权或中断服务的运行
  • 使用假冒服务器从而骗得用户的机密信息

Kerberos的解决方案

  • 在一个分布式的Client/Server体系的机构中,引入一个可信任的第三方(Kerberos服务器),让其提供认证服务。
  • 使用共享**加密技术

Kerberos基本性质

  • 安全:使网络窃听者不能获得必要的信息来伪装成另一个客户。
  • 可靠:对所有以Kerberos进行控制访问的服务来说,客户无法通过Kerberos服务器的认证就意味着无法获得所需要的服务。
  • 透明:用户除了需要输入一个口令外,不必知道认证过程的存在以及细节。
  • 可伸缩:可支持大量用户和服务器。
二、协议具体内容

三个重要概念

  • 认证服务器(AS):它将所有用户的口令集中存放在本地数据库中;而且它与每一个应用服务器共享一个唯一的**(这些**通过物理或其他安全的方式发放)
  • 客户端(C):代替用户与服务器进行信息交换
  • 票据(Ticket):身份或权利的证明
    Ticket由AS以数据报形式发放给C。

一个简单的认证对话

Kerberos认证协议
上图就是一个简单的认证对话过程,总共有三步:

  1. C → AS : IDc || Pc || IDv
  2. AS → C : Ticket
  3. C → V : IDc || Ticket

其中Ticket = EKv[ IDc || ADc || IDv]

符号说明:
C :客户端
AS :认证服务器
V :服务(服务器)
IDc :在C上的用户标志
IDv :在V上的用户标志
Pc :在C上的用户口令
ADc :C的1网络地址
Kv :AS与V共享的加***
|| :级联

过程理解

  1. C → AS : IDc || Pc || IDv
    在这一步中,C向AS发送自己的身份,口令以及要申请的服务。也就是C向AS说,我是谁谁谁,这是我的密码,我要啥啥啥服务,帮我认证一下,给我张票。
  2. AS → C : Ticket
    在这一步中,AS验证C的真实性(验证IDc 的口令是不是 Pc ),验证通过就给C发张Ticket,Ticket用AS与V共享的**加密了C的身份,C的地址以及V的身份。
  3. C → V : IDc || Ticket
    第三步,C向V发送自己的身份以及票据,请求服务。V收到消息后,得到C的身份以及票据,使用AS与V之间的共享**解密后得到票据里的信息,看C是否与Ticket中的C一致

存在的两个最突出的问题

  • 用户每次访问一次新的服务就需要一个新的票据,导致用户多次输入口令。
  • 用明文传递的用户口令会被窃听

解决方案

  • 使用票据许可服务器(TGS Ticket Grant Server)TGS向通过认证的用户发放票据,AS只需认证用户
  • Ticket重用,设置生命期,在生命期内票据都可使用,不需频繁申请。

改进的认证对话
Kerberos认证协议
改进的认证对话有五步:

  • Once per user logon session
  1. C → AS :IDc || IDtgs
  2. AS → C : EKc[Tickettgs]
    其中Tickettgs = EKtgs[IDc || ADc || IDtgs || TS1 || Lifetime1]
    符号说明:
    IDtgs : TGS的标志符
    Kc :由用户口令导出的**
    TS1 :时间戳
    Lifetime1 :生存期
  • Once per type of service
  1. C → TGS :IDc || IDv || Tickettgs
  2. TGS → C :Ticketv
    其中Ticketv = EKv[IDc || ADc || IDv || TS2 || Lifetime2]
    符号说明:
    Kv :TGS和服务器共享的**
  • Once per service session
  1. C → V :IDc || Ticketv

过程解释

  1. C → AS :IDc || IDtgs
    这一步中,用户只需要将自己的标识符以及TGS的标识符传递给AS,不需要传递明文口令
  2. AS → C : EKc[Tickettgs]
    第二步中,AS使用由C的口令衍生的**加密票据,该消息只有AS与C双方之间才能解读,票据当中包含C的标识符,地址,TGS的标识符,时间戳以及生存周期(防止重放攻击),票据的信息由AS与TGS之间的**进行加密,这样保证了只有对应的TGS能验证
  3. C → TGS :IDc || IDv || Tickettgs
    C将票据以及自己的身份和要申请的服务发送给TGS,TGS验证票据,检查有效期。
  4. TGS → C :Ticketv
    验证通过后,TGS向C发送票据,该票据的信息包括了C的标识符,地址,V的标识符,生存周期,时间戳,这些信息经由TGS和服务器之间共享的**进行加密
  5. C → V :IDc || Ticketv
    最后一步,C凭借票据和身份获取服务

可以看到,在改进的方法中,口令不需在网络上频繁的传输,身份的认真也经过了加密,设置了生存期,在生存期内票据可以重用

存在的问题

  • 生存期长短的设置,太长,不太方便保护安全性,敌手窃取到Ticket后就可以在生存期结束前获得合法用户的资源,太短又要多次重复输入口令
  • 服务器不能向用户认证自己

解决方案

  • 会话**(Session Key) 让AS以安全的方式向C和TGS提供同一个会话**,然后C向TGS出示用Session Key加密的个人信息 || Ticket 来证明身份。同样,TGS向C核V做同样的事情
  • 认证符 使用Session Key加密(用户ID、地址、时间戳)的报文

Kerberos 第四版
Kerberos认证协议
具体步骤:

  • 认证服务交换:获得票据许可票据
  1. C → AS :IDc || IDtgs || TG1
  2. AS → C : EKc[Kc,tgs || IDtgs || TS2 || Lifetime2 || Tickettgs]
    其中Tickettgs = EKtgs[Kc,tgs || IDc || ADc || IDtgs || TS2 || Lifetime2]
    符号说明:
    Kc,tgs : 由AS生成允许客户端和TGS间安全交换报文
  • 票据许可服务交换:获得服务许可票据
  1. C → TGS :IDv || Tickettgs || Authenticatorc
  2. TGS → C :Kc,tgs[KC,V || IDv || TS4 || Ticketv]
    其中Ticketv = EKv[KC,V || IDc || ADc || IDv || TS4 || Lifetime4]
    Authenticatorc = EKc,tgs[IDc || ADc || TS3]
    符号说明:
    Authenticatorc :由客户端产生认证符,证明票据的有效性
  • 客户端/服务器端认证交换:获得服务
  1. C → V : Ticketv || Authenticatorc
  2. V → C :EKv[TS5 + 1]
    其中:
    Authenticatorc = EKc,v[IDc || ADc || TS5]
    第六步可以使C确信不是就回答的重放

过程分析
第四版觉改进的会话多了会话的**,每次交换用的**都由上一步生成,票据都经过加密再传递给C,儿C向V发送服务请求,V会向C发送加密的数据,这个数据证明服务器不是敌手伪装的。

请求其他域的服务器的服务
先占坑,有空再写。