Keystone的签名证书是建立在PKI基础之上的。在介绍Keystone之前,先介绍数据加密和PKI的基本概念。
1)权威认证机构(Certification Authoity):简称CA,是PKI的核心组成部分,称作认证中心。它是数字证书的签发机构。CA是PKI应用中权威的、可信任的、公正的第三方机构。
2)CA私钥:非对称加密算法中的密钥分为公钥和私钥,公钥可对外暴露,私钥则须对外保密。简单来说,私钥可以用来签名和解密,公钥则用来解签与加密。
3)CA公钥证书:CA公钥证书中包含了CA的公钥信息,可以用CA公钥证书对CA颁发的证书进行签名验证,以确认CA机构颁发证书的合法性。
4)签名私钥:用户自己负责保存私钥,签名私钥不能泄露,可以用来对传输数据进行签名以保证数据的合法性。
5)签名公钥证书:由CA机构颁发,签名证书上有CA的签名,以表明该签名证书的合法性。同时证书中保存的公钥(公钥与签名私钥为非对称密钥对)可以用来对数据进行解签。
图11-3说明如何用公、私钥与数字签名保证数据的完整性和不可抵赖性。A的公钥就是来源于CA颁发的签名公钥证书,Bob可以和CA中心交互,CA中心利用CA的公钥进行签名验证确认证书的合法性,Bob再用得到CA确认的、合法的A的公钥来验证Alice的签名,这样就可以保证数据的安全。
在Keystone的F版本之前,生成令牌ID的方法只有UUID一种方式。生成的令牌保存在Keystone的后台数据库中,同时通过网络传给客户端,客户端有了令牌ID之后,会包含这一信息。Keystone在拿到这些信息之后,将会提取令牌ID和后台数据库中的值进行比较,以验证请求的合法性。
这样的方式会存在并发的问题,如果有大量的用户并发对Keystone请求,Ketstone将会成为一个性能瓶颈。而且,用户通过Keystone的初始认证后,在访问相关的服务时,会附加上Keystone返回给用户的令牌,这些服务需要同Keystone交互验证这个令牌的合法性,这样会加重Keystone的性能负担。
Keystone在F版本后引入了PKI机制,可以有效地解决Keystone交互频繁造成的性能瓶颈的问题,同时也提高了安全性。Keystone利用PKI生成签名证书的流程如下:
图11-3 公钥、私钥与数字签名的原理
1)客户端发送用户名密码信息到Keystone进行验证。Keystone校验用户名密码以及可访问资源等信息为合法之后,Keystone充当CA角色,用CA签名私钥对令牌元数据(元数据具体为该令牌颁发给的用户、用户所在的租户信息、用户在该租户下的用户角色,以及该令牌可访问的服务目录等信息)进行签名,以生成签名后的令牌。
2)令牌通过网络发送到客户端,客户端收到令牌后缓存在客户端本地。
3)各服务向Keystone认证时,Keystone向每个服务端点发送CA的公钥证书和用户签名后的令牌对应的签名公钥证书。
4)客户端发送API请求到服务端点的同时附加上令牌信息。服务端点提取令牌信息,服务端点用本地存放的用户的签名公钥证书进行验签,确认用户的合法性与访问权限。
5)服务端点处理合法的请求,拒绝未通过验证的请求。
引入PKI对用户的令牌进行签名后,只要合法用户不泄露Keystone颁发给自己的私钥,其他用户将无法盗用或冒充这个合法用户,否则非法用户无法通过Keystone或者服务端点的签名签证。这极大地提升了Openstack用户的安全性。
而且,通过在服务端点本地存放CA的公钥证书和用户的签名公钥证书,可以实现本地对Token合法性的验证,不用和Keystone交互,大大减轻了Keystone的负担,使其避免成为系统瓶颈。