互联网的开放环境中是一个危险的地方,用户可以被模仿,Server也可以被伪造,而且在通信过程中还时刻存在数据被窃听,篡改和重放。在这样的环境下如何安全可靠的识别用户身份,如何提供业务访问授权?

Kerberos,是一个基于票据的计算机网络认证协议。它的认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 为一种可信任的认证服务,是通过传统的密码技术执行认证服务的。

  1. 关键词说明

在登录鉴权体系中,票据(Ticket)是串联整个登录流程,验证用户身份,以及确保通信信道安全的最为重要的部分。顾名思义,票据与我们日常生活所使用的公车票、电影票等类似,使用者必须通过某种方式,如购买或申请来取得票据,之后即可利用此票据来享受某种服务。

这里先对Kerberos中涉及到的票据做一下说明。

1、TGTGT与GTK_TGTGT

TGTGT也称大大票或者A1,是通过密码相关的密钥加密后生成的票据,其等权限同于密码。同时,客户端生成TGTGT票据时,会其中在包含一个随机密钥GTK_TGTGT。Server通过解密TGTGT后可以得到GTK_TGTGT,用于后续安全信道加解密。

2、TGT与GTK_TGT

TGT(Ticket Granting Ticket),也称大票或者A2。从名称可以知道,TGT是用来授权其它低等级票据的票据,是通过TGTGT登录后,由Server派发的高权限登录凭证。Server加密生成的TGT中包含随机密钥GTK_TGT,并且会与TGT一并通过加密信道返回客户端,用于后续的信道加密。

由中心认证服务器来保存的,保存在认证服务器域名cookie域下面。

3、ST与GTK_ST

ST是业务小票,是通过TGT换取的一种业务票据,用于访问业务鉴权,权限较低;与TGT相同,在ST中包含GTK_ST,会与TGT一并通过加密信道返回客户端,用于后续的信道加密。

由业务系统来保存的,保存在业务系统对应的cookie域下面。

4、SSO

Single Sign On,单点登录。有统一的用户名和密码验证中心为各条产品线提供服务,一旦通过用户可以在各业务系统之间无缝跳转。

2、登录的角色与步骤

在Kerberos体系中,包含三方四角色。三方是指客户端,鉴权服务器,与业务服务器。四种角色是指鉴权服务器可以分为AS(Authentication Server)和TGS(Ticket-Granting Server)两个角色。如下图所示:

Kerberos体系三方四角色交互

在Kerberos流程中,在登录时,首先需要提交TGTGT到AS进行密码验证,如果密码正确则能够得到GTK_TGTGT。此时生成GTK_TGT派发TGT,并使用GTK_TGTGT加密后返回客户端。当客户端收到TGT后,通过TGS换取相应的业务小票ST去访问业务服务器。

具体流程见下面:

kerberos-login-step-1 kerberos-login-step-1 kerberos-login-step-1 kerberos-login-step-1

TIPS

在实际中,为了减少网络交互和登录延时,可以对AS与TGS进行合并,这样业务提交TGTGT后,会在一次交互中获取到TGT与ST。

3、密钥与信道安全

Wtlogin是使用对称加密的方式保证通信信道以及账户安全。在整个登录过程中,涉及到多个密钥,按照生命周期长短可以分为长期和临时两种。

长期密钥

  • PWD: 密码通过运算得到的密钥,只有用户和AS服务器知道
  • KeyOf(AS, TGS): 加密生成TGT的密钥,AS服务器与TGS服务器共享
  • KeyOf(TGS, S): 加密生成ST的密钥,TGS与业务服务器共享

临时密钥

  • GTK_TGTGT
  • GTK_TGT
  • GTK_ST

登录过程中所涉及到的密钥使用情况,如下图所示:

登录加密信道中密钥的使用

登录的第一条命令,客户端使用密码通过运算得到的密钥加密的TGTGT进行登录,此时只有AS服务器有用户的密码信息,可以解开得到GTK_TGTGT,并且使用GTK_TGTGT加密返回客户端的数据。

这里着重分析以下几种恶意情况:

1、窃听

用户密码并没有在网络上传输,而是使用使用密码通过运算得到的密钥加密的TGTGT进行登录,因此及时登录被窃听也可以保证账户的安全性。在第一条登录命令之后的信道,都是通过服务器派发的TGT、ST,以及与之对应的密钥GTK_TGT、GTK_ST加密从而保证信道安全的。

2、伪造客户端、重放

假设,用户的第一条登录命令在网络中被窃听并且重放伪造用户登录,由于TGTGT不是伪客户端生成的,无法获取GTK_TGTGT,虽然AS正确回包,却无法解密得到应答的内容,无法登录成功。

3、伪造服务器

如果用户在发送第一条登录命令时AS服务器被伪造,由于伪造的AS服务器不知道用户密码,因此无法的到GTK_TGTGT,所以无法正确回包,登录也是无法成功的。

在第一条登录命令之后,验证票据的TGS服务器和业务服务器没有记录Session,解密客户端的请求报文必须解密TGT与ST获取到相应的密钥。因此,加密生成TGT与ST的密钥KAS,TGS和KTGS, S的共享以及安全性显得至关重要。

TIPS

1、可以使用动态密钥Vaskey系统来保证KAS,TGS和KTGS, S的定期更换,以及服务器间安全同步共享。

Vaskey系统可以保证在密钥的更换过程中新老密钥的兼容平滑切换,保证对登录系统和业务透明。 此外,Vaskey系统保证不同业务间加密ST的KTGS, S是不同的,从而实现业务间票据隔离,如果某一业务的KTGS, S泄漏不会影响到其他业务的票据安全。

2、在登录后,除了可以获取到TGT和ST之外,针对不同的业务形态还可以自定义各自的票据,从而简化登陆以及实现登陆隔离。

一般来说ST只是用于安全信道的建立。业务根据自己需要发放自己的业务票据。比如二进制协议票据(PC端、无线端统一登陆平台),针对HTTP协议的票据(web统一登陆平台),或者第三方相关票据(Openid、Openkey、以及Oauth的AccessToken等)。

3、统一认证分散登陆(登陆态隔离)

登陆态共享(SSO)在各个产品线间实现用户互拉有明显的效果,但是也带来一个比较严重的安全隐患。由于各个产品线的安全级别不同,这样的处理,使得任何产品线的xss漏洞直接导致了在所有顶级认证域下所有产品线均受影响。

举个例子,用户在CAS登陆,成功之后CAS将认证信息存储到 .arganzheng.me 域下的Cookie里(Skey就是用户的认证信息),然后各个应用都使用这个Cookie来认证,这样当用户访问我们各个应用,如 blog.arganzheng.me,study.arganzheng.me,photo.arganzheng.me, etc. 就不需要再次登陆了。但是任何一个应用出现xss等安全问题,黑客都可以取得这个skey认证信息,从而导致所有产品线都会受到牵连,安全无法得到有效控制。

解决方案其实蛮简单的,就是各个产品线的skey存放在自己的业务域名下,称之为pskey(private skey)。