GSS-API 与Kerberos 的关系
Kerberos 是GSS-API 的实现,当然也有其他的实现如NTLm,dce之类的,如下图所适:
-----------------------------------
应用程序(APP)
-----------------------------------
RPC(可选)
------------------------------------
GSS API
------------------------------------
PROVIDER(提供商实现api)
------------------------------------
kerberos / ntlm / dce
-------------------------------------
# JAAS/GSS-API/SASL/Kerberos简介
如果将Kerberos引入到一个分布式系统中提供身份认证与服务授权时,还涉及到一系列与安全有关的框架技术与接口协议,包括:如何对认证的对象或访问的资源进行抽象?应用通过什么样的接口进行Kerberos认证?如何保障跨节点通信时的安全传输?Java Security中均提供了现成的实现。
JAAS
JAAS是Java Authentication and Authorization Service的缩写,提供了认证与授权相关的服务框架与接口定义:
- 认证:认证主要是验证一个用户的身份。
- 授权:授权用户访问或操作某些敏感的资源。
前一篇文章<Java认证与授权服务JAAS基础概念>已经做了详细的介绍。
2. GSS-API
Java GSS-API是 Generic Security Services Application Program Interface的缩写,主要应用于跨应用程序之间的安全信息交换(secure message exchanges), RFC 2853提供了详细的接口协议定义。应用程序可以通过GSS-API访问Kerberos服务。
JAAS的认证请求,通常先于GSS-API的调用。也就是说,先通过JAAS的接口完成登录认证,而后通过GSS-API来确保后面交换信息的安全性。两者经常被联合一起使用,但也可以单独使用,例如,基于JAAS也可以完成一些简单的认证与授权,一些别的场景下,也可以只使用GSS-API而不使用JAAS。
2.1 使用 GSS-API 的应用程序的可移植性
GSS-API 为应用程序提供了以下几种类型的可移植性:
-
机制无关性。GSS-API 提供了一个用于实现安全性的通用接口。通过指定缺省的安全机制,应用程序无需了解要应用的机制以及该机制的任何详细信息。
-
协议无关性。GSS-API 与任何通信协议或协议套件均无关。例如,GSS-API 可用于使用套接字、RCP 或 TCP/IP 的应用程序。
RPCSEC_GSS 是用于将 GSS-API 与 RPC 顺利集成的附加层。有关更多信息,请参见使用 GSS-API 的远程过程调用。
-
平台无关性。GSS-API 与运行应用程序的操作系统的类型无关。
-
保护质量无关性。保护质量 (Quality of Protection, QOP) 是指一种算法类型,用于加密数据或生成加密标记。通过 GSS-API,程序员可使用 GSS-API 所提供的缺省设置忽略 QOP。另一方面,应用程序可以根据需要指定 QOP。
2.2 GSS-API 中的安全服务
GSS-API 提供了三种类型的安全服务:
-
验证-验证是 GSS-API 提供的基本安全性。验证是指对身份进行验证。如果用户通过了验证,则系统会假设其有权以该用户名进行操作。
-
完整性-完整性是指对数据的有效性进行验证。即使数据来自有效用户,数据本身也可能会损坏或遭到破坏。完整性可确保消息与预期的一样完整(未增减任何内容)。GSS-API 提供的数据附带有一个名为消息完整性代码 (Message Integrity Code, MIC) 的加密标记。MIC 可用于证明收到的数据与发送者所传送的数据是否相同。
-
保密性-保密性可确保拦截了消息的第三方难以阅读消息内容。验证和完整性机制都不会修改数据。如果数据由于某种原因而被拦截,则其他人可以阅读该数据。因此,可通过 GSS-API 对数据进行加密,前提是提供了支持加密的基础机制。这种数据加密称为保密性。
SASL
SASL是_Simple Authentication and Security Layer_的缩写,主要应用于跨节点通信时的认证与数据加密,如Client与Server基于RPC进行通信时,可以基于SASL来提供身份认证以及数据加密能力。
当SASL中使用Kerberos服务时,也需要使用到GSS-API来与Kerberos之间进行安全信息交换。
Kerberos
回忆一下之前一篇文章<图解Kerberos协议原理>中讲到的Kerberos认证与授权的几个关键步骤:
- [Login] 用户输入用户名/密码信息进行登录。
- [Client/AS] Client到AS进行认证,获取TGT。
- [Client/TGS] Client基于TGT以及Client/TGS Session Key去TGS去获取Service Ticket(Client-To-Server Ticket)。
- [Client/Server] Client基于 Client-To-Server Ticket以及Client/Server SessionKey去Server端请求建立连接,该过程Client/Server可相互进行认证。
- [Client/Server] 连接建立之后,Client可正常往Server端发送服务请求。
第1步,在Client端完成对密码信息的单向加密。
第2步,基于JAAS进行认证。
第3,4步,则基于GSS-API进行交互。
第4,5步建立连接与发送服务请求的过程,则通常基于SASL框架。
总结
本文主要介绍了在一个分布式系统中引入Kerberos认证时所涉及到的框架技术,简要总结如下:
- JAAS 认证与授权服务框架与接口定义
- GSS-API 跨应用程序之间的安全信息交换,如Kerberos授权时Client与TGS/SS之间的信息交换。
- SASL 主要应用于跨节点通信时的认证与数据加密。
===================================================================================================
数字证书: 由CA(大家都信赖的第三方机构)派发,内容包括:
(1).Common Name(证书所有人姓名,简称CN,其实就是证书的名字)
(2).Version(版本,现在一般是V3了)
(3).Issuer(发证机关)
(4).Validity(有效日期)
(5).Subject(证书信息,你会发现它和Issuer里面的内容是一样的)
(6).Subject's Public Key Info(证书所有人的公钥)
(7).Extension(扩展信息)
(8).Certificate Signature Algorithm(公钥加密算法)
(9).证书的数字签名(生成步骤是: 先将证书内容hash,再对hash结果用CA的私钥和证书中的加密算法加密,得到的就是数字签名)
验证证书是否为真的方法(这个验证是为了保证证书的内容真的是CA所写,而不是伪造的,比如说证书的内容上写了允许xx使用xx公司的xx功能):
将证书里的数字签名使用CA的公钥解密得到A,同时对证书内容进行hash得到B,比对A和B是否一致,如果一致,则认为证书是CA颁发的,即真的,
所以说数字签名的作用是用来验证证书是否为真(证书为真即代表里面的内容都是真的,包括证书所有人公钥等)
验证证书持有人是否为本人的方法(为了避免真的证书被人盗用,所以也需要这个验证):
验证方使用证书中的公钥加密一段信息发给 证书持有人,如果证书持有人是本人,那他肯定有证书中公钥对应的私钥,那他就肯定能解密这段信息,
只要把解密的信息再发给验证方,即可证明自己是本人,反之,则认为不是本人
通过以上2个验证,即可以保证发过来的证书是真的,并且持有人也是本人,
-------------------------------------------------------------------------
ssl: 是一种间于传输层(比如TCP/IP)和应用层(比如HTTP)的协议. 它通过"握手协议"和"传输协议"来解决传输安全的问题.
SSL的基本思想是用非对称加密来建立链接(握手阶段),用对称加密来传输数据(传输阶段)。这样既保证了密钥分发的安全,也保证了通信的效率(因为非对称加密更耗时)。
sasl: 是作用在认证层上,是一种身份认证框架,sasl验证架构决定服务器本身如何存储客户端的身份证书以及如何核验客户端提供的密码。
如果客户端能成功通过验证,服务器端就能确定用户的身份, 并借此决定用户具有怎样的权限。
sasl的常见具体实现有plain、kerberos等, 就好比slf4j是框架,log4j是具体实现
如果要将Kerberos与SASL一起使用,则将需要另一种间接级别:GSSAPI(最常与Kerberos一起使用,但也可以允许其他机制)。
SSL和SASL区别:
1. SASL用于认证,SSL主要用于对传输的数据进行加密
2. SASL允许选择不同的机制来对客户端进行身份验证,如可以选择使用GSSAPI,Kerberos,NTLM等,而SSL被绑定为基于证书进行身份验证。
JAAS: 是用于处理身份验证和授权的通用Java框架