895959.com所以 OpenStack 须求用户访问其 API,所以 OpenStack 供给用户访问其 API

keystone认证方式:UUID、PKI、Fernet;

keystone认证方法:UUID、PKI、Fernet;

知识点复习:

知识点复习:

通俗的讲,token
是用户的一种凭证,需拿正确的用户名/密码向 Keystone
申请才能收获。假若用户每一回都使用用户名/密码访问 OpenStack
API,简单走漏风声用户音讯,带来安全隐患。所以 OpenStack 须求用户访问其 API
前,必须先得到 token,然后用 token 作为用户凭据访问 OpenStack
API。 

浅显的讲,token
是用户的一种凭证,需拿正确的用户名/密码向 Keystone
申请才能获得。如若用户每一遍都采纳用户名/密码访问 OpenStack
API,简单败露风声用户消息,带来安全隐患。所以 OpenStack 供给用户访问其 API
前,必须先获得 token,然后用 token 作为用户凭据访问 OpenStack
API。 

公开密钥加密,也称为非对称加密(asymmetric
cryptography,加密密钥和解密密钥不平等),在那种密码学方法中,要求有的密钥,分别为公钥(Public
Key)和私钥(Private
Key),公钥是当众的,私钥是非公开的,需用户安妥保管。若是把加密和平消除密的流程当做函数
C(x) 和 D(x),P 和 S 分别表示公钥和私钥,对明文 A 和密文 B
而言,数学的角度上有以下公式:

公开密钥加密,也号称非对称加密(asymmetric
cryptography,加密密钥和平消除密密钥分裂),在那种密码学方法中,要求部分密钥,分别为公钥(Public
Key)和私钥(Private
Key),公钥是当着的,私钥是非公开的,需用户安妥保管。假如把加密和平消除密的流程当做函数
C(x) 和 D(x),P 和 S 分别表示公钥和私钥,对明文 A 和密文 B
而言,数学的角度上有以下公式:

B = C(A,
S)

B = C(A,
S)

A = D(B,
P)

A = D(B,
P)

里头加密函数
C(x), 解密函数 D(x) 以及公钥 P
均是公开的。选拔公钥加密的密文只好用私钥解密,选择私钥加密的密文只可以用公钥解密。非对称加密广大利用在三沙领域,诸如常见的
HTTPS,SSH 登录等。

内部加密函数
C(x), 解密函数 D(x) 以及公钥 P
均是公开的。接纳公钥加密的密文只好用私钥解密,选择私钥加密的密文只可以用公钥解密。非对称加密广大采纳在金昌世界,诸如常见的
HTTPS,SSH 登录等。

数字签名又叫做公钥数字签名,首先使用 Hash
函数对新闻生成摘要,摘要经私钥加密后称为数字签名。接收方用公钥解密该数字签名,并与接受消息生成的摘要做相比较,若是两岸一致,便足以确认该音信的完整性和真正。

数字签名又称为公钥数字签名,首先应用 Hash
函数对音信生成摘要,摘要经私钥加密后称为数字签名。接收方用公钥解密该数字签名,并与接收新闻生成的摘要做比较,假若两岸一致,便足以肯定该音信的完整性和真正。

(1)UUID认证原理:

(1)UUID认证原理:

当用户须求进行操作时(比如访问nova创设虚拟机),用户拿着有效的用户名/密码先去keystone认证,keystone再次回到给用户叁个token(即UUID)。之后用户进行其余操作(如访问nova),先出示这些token给nova-api,nova收到请求后,就用那些token去向keystone实行呼吁验证。keystone通过比对token,以及检查token的有效期,判断token的卓有功能,最终回到给nova结果。

当用户须求展开操作时(比如访问nova创设虚拟机),用户拿着有效的用户名/密码先去keystone认证,keystone再次回到给用户一个token(即UUID)。之后用户实行任何操作(如访问nova),先出示这些token给nova-api,nova收到请求后,就用那几个token去向keystone进行呼吁验证。keystone通过比对token,以及检查token的有效期,判断token的有用,最后回来给nova结果。

缺陷:每便请求都要通过keystone举行表明,造成质量瓶颈。

缺陷:每一趟请求都要通过keystone进行验证,造成品质瓶颈。

 895959.com 1

 895959.com 2

 

 

1.用户输入用户名密码,发送给keystone。

1.用户输入用户名密码,发送给keystone。

2.Keystone验证用户名密码,并且生成token(UUID),发送给客户端。

2.Keystone验证用户名密码,并且生成token(UUID),发送给客户端。

3.客户端缓存UUID token

3.客户端缓存UUID token

4.客户端发送具体的实施请求(nova boot)和UUID给keystone。

4.客户端发送具体的推行请求(nova boot)和UUID给keystone。

5.Keystone从http请求中获取token,并检讨token是或不是可行

5.Keystone从http请求中取得token,并检查token是不是有效

6.Token灵光,处理请求,并再次回到客户端请求结果

6.Token可行,处理请求,并再次来到客户端请求结果

7.Token失效,拒绝客户端请求,再次回到401。

7.Token失效,拒绝客户端请求,再次回到401。

UUID方式源码分析:

UUID格局源码分析:

UUID token
是长度固定为 32 Byte 的随机字符串,由 uuid.uuid4().hex
生成。

UUID token
是长度固定为 32 Byte 的随意字符串,由 uuid.uuid4().hex
生成。

def _get_token_id(self, token_data):
   return uuid.uuid4().hex

def _get_token_id(self, token_data):
   return uuid.uuid4().hex

 

 

变更的样例:144d8a99a42447379ac37f78bf0ef608

扭转的样例:144d8a99a42447379ac37f78bf0ef608

(2)PKI认证原理:

(2)PKI认证原理:

在keystone早先化时,keystone生成了CA的公钥CA.pem和私钥CA.key,同时keystone发生了团结的公钥keystone.pub和私钥keystone.key,然后将keystone.pub进行CA的签名,生成keystone.pem。

在keystone开首化时,keystone生成了CA的公钥CA.pem和私钥CA.key,同时keystone产生了和谐的公钥keystone.pub和私钥keystone.key,然后将keystone.pub举办CA的署名,生成keystone.pem。

当用户拿着用户名/密码去keystone认证后,keystone将用户的骨干新闻通过keystone.key举行加密,并将密文作为token返还给用户。当用户拿着token发送请求时(例如访问nova),nova得到用户token时,通过事先得到keystone的证书keystone.pem(这一进程只需求开始展览1回)进行解密,获取用户新闻。

当用户拿着用户名/密码去keystone认证后,keystone将用户的为主音信透过keystone.key实行加密,并将密文作为token返还给用户。当用户拿着token发送请求时(例如访问nova),nova得到用户token时,通过事先获得keystone的证书keystone.pem(这一进程只需求开始展览壹遍)举行解密,获取用户音信。

对此用户的token,还需实行token的官方时间,以及token照旧否存在进展判定。所以当nova每三遍获得token后还需向keystone询问叁回token的败诉列表,检查token是还是不是失效。这一历程对于keystone的载重依然非凡轻的,所以PKI依然管用化解了keystone质量瓶颈的标题。

对此用户的token,还需举办token的法定时间,以及token照旧否存在进展判断。所以当nova每3遍得到token后还需向keystone询问3回token的挫败列表,检查token是还是不是失效。这一历程对于keystone的载重依旧10分轻的,所以PKI仍旧管用消除了keystone品质瓶颈的标题。

计算:OpenStack服务中的每二个API Endpoint都有一份keystone签发的阐明,失效列表和根证书。API不用在直接去keystone认证token是还是不是合法,只要求根据keystone的注解和失效列表就可以鲜明token是不是合法。不过此间依然会有每一趟都供给请求keystone去取得失效列表的操作,不可制止。

总括:OpenStack服务中的每3个API Endpoint都有一份keystone签发的证件,失效列表和根证书。API不用在一向去keystone认证token是还是不是合法,只要求依据keystone的证明和失效列表就能够分明token是不是合法。不过此间依然会有每便都必要请求keystone去取得失效列表的操作,不可防止。

 895959.com 3

 895959.com 4

 

 

PKI的流水生产线,首先必要动用 keystone-manage
pki_setup命令生成CA及有关的令牌机制,其代码如下所示:

PKI的流水生产线,首先供给动用 keystone-manage
pki_setup命令生成CA及有关的令牌机制,其代码如下所示:

    def
_get_token_id(self, token_data):

    def
_get_token_id(self, token_data):

       
try:

       
try:

           
token_json = jsonutils.dumps(token_data,
cls=utils.PKIEncoder)

           
token_json = jsonutils.dumps(token_data,
cls=utils.PKIEncoder)

           
token_id = str(cms.cms_sign_token(token_json,

           
token_id = str(cms.cms_sign_token(token_json,

             
                                CONF.signing.certfile,

             
                                CONF.signing.certfile,

             
                                CONF.signing.keyfile))  
#DEFAULT_TOKEN_DIGEST_ALGORITHM=sha256

             
                                CONF.signing.keyfile))  
#DEFAULT_TOKEN_DIGEST_ALGORITHM=sha256

其中,‘token_data’是获取的user、role、endpoint、catlog等消息集合,而最关键的讲话是cms使用签名生成token的进度:cms_sign_token,使用默认的sha256措施加密,处理进度使用process,进行多少的读取、处理, 

其中,‘token_data’是获得的user、role、endpoint、catlog等音讯集合,而最重视的语句是cms使用签名生成token的长河:cms_sign_token,使用暗中认可的sha256办法加密,处理进度使用process,进行多少的读取、处理, 

         
 process = subprocess.Popen([‘openssl’, ‘cms’, ‘-sign’,

         
 process = subprocess.Popen([‘openssl’, ‘cms’, ‘-sign’,

             
                   ‘-signer’, signing_cert_file_name,

             
                   ‘-signer’, signing_cert_file_name,

             
                   ‘-inkey’, signing_key_file_name,

             
                   ‘-inkey’, signing_key_file_name,

             
                   ‘-outform’, ‘PEM’,

             
                   ‘-outform’, ‘PEM’,

             
                   ‘-nosmimecap’, ‘-nodetach’,

             
                   ‘-nosmimecap’, ‘-nodetach’,

             
                   ‘-nocerts’, ‘-noattr’, 

             
                   ‘-nocerts’, ‘-noattr’, 

             
                   ‘-md’, message_digest, ],

             
                   ‘-md’, message_digest, ],

             
                  stdin=subprocess.PIPE,

             
                  stdin=subprocess.PIPE,

             
                  stdout=subprocess.PIPE,

             
                  stdout=subprocess.PIPE,

             
                  stderr=subprocess.PIPE,

             
                  stderr=subprocess.PIPE,

             
                  close_fds=True)

             
                  close_fds=True)

说到底output,
err = process.communicate(data)
生成Token-id,这一个历程涉及到openssl相关的加密技术。

最后output,
err = process.communicate(data)
生成Token-id,这几个进程涉及到openssl相关的加密技术。

CMS
token一般都超过1600个字节,样例:

CMS
token一般都超过1600个字节,样例:

 895959.com 5

 895959.com 6

 

 

(3)Fernet认证原理:

(3)Fernet认证原理:

 895959.com 7

 895959.com 8

 

 

1.user在客户端输入用户名密码,发送给keystone。

1.user在客户端输入用户名密码,发送给keystone。

2.Keystone验证用户名密码,并且生成token(UUID),发送给客户端。

2.Keystone验证用户名密码,并且生成token(UUID),发送给客户端。

3.客户端缓存token(UUID)

3.客户端缓存token(UUID)

4.客户端发送具体的实践请求给openstack
API

4.客户端发送具体的推行请求给openstack
API

5、OpenStack
API向 keystone请求token认证

5、OpenStack
API向 keystone请求token认证

6.Keystone从http请求中获取token,并检讨token是还是不是有效

6.Keystone从http请求中取得token,并检查token是还是不是管用

7.Token使得,处理请求,并回到openstack
api请求结果

7.Token实惠,处理请求,并回到openstack
api请求结果

8.Token失效,拒绝客户端请求,再次来到401。

8.Token失效,拒绝客户端请求,再次回到401。

当集群运维较长一段时间后,访问其 API
会变得奇慢无比,究其原因在于 Keystone 数据仓库储存储了多量的 token
导致质量太差,消除的法门是常事清理
token。为了制止上述难题,社区建议了Fernet
token
,fernet
是眼下主流推荐的token格式,它使用 cryptography 对称加密库(symmetric
cryptography,加密密钥和平解决密密钥相同) 加密 token,具体由 AES-CBC
加密和散列函数 SHA256 签名。Fernet 是专为
API token 设计的一种轻量级安全新闻格式,不供给仓库储存于数据库,减弱了磁盘的
IO,带来了必然的天性升高。为了拉长安全性,须要采用 Key
Rotation
 更换密钥。

当集群运营较长一段时间后,访问其 API
会变得奇慢无比,究其原因在于 Keystone 数据库存款和储蓄了多量的 token
导致质量太差,化解的不二法门是时常清理
token。为了幸免上述难点,社区建议了Fernet
token
,fernet
是现阶段主流推荐的token格式,它应用 cryptography 对称加密库(symmetric
cryptography,加密密钥和平解决密密钥相同) 加密 token,具体由 AES-CBC
加密和散列函数 SHA256 签名。Fernet 是专为
API token 设计的一种轻量级安全音信格式,不供给仓库储存于数据库,收缩了磁盘的
IO,带来了自然的品质提高。为了抓好安全性,必要利用 Key
Rotation
 更换密钥。

895959.com 9

895959.com 10

 

 

如上代码申明,token 蕴涵了
user_id,project_id,domain_id,methods,expires_at
等音信,主要的是,它并未 service_catalog,所以 region
的数目并不影响它的轻重。self.pack()
最终调用如下代码对上述音讯加密:

上述代码评释,token 包蕴了
user_id,project_id,domain_id,methods,expires_at
等音讯,主要的是,它从不 service_catalog,所以 region
的多少并不影响它的高低。self.pack()
最后调用如下代码对上述音信加密:

895959.com 11

895959.com 12

 

 

 该token
的分寸相似在 200 多 Byte 左右,样例:

 该token
的轻重相似在 200 多 Byte 左右,样例:

gAAAAABWfX8riU57aj0tkWdoIL6UdbViV-632pv0rw4zk9igCZXgC-sKwhVuVb-wyMVC9e5TFc
7uPfKwNlT6cnzLalb3Hj0K3bc1X9ZXhde9C2ghsSfVuudMhfR8rThNBnh55RzOB8YTyBnl9MoQ
XBO5UIFvC7wLTh_2klihb6hKuUqB6Sj3i_8

gAAAAABWfX8riU57aj0tkWdoIL6UdbViV-632pv0rw4zk9igCZXgC-sKwhVuVb-wyMVC9e5TFc
7uPfKwNlT6cnzLalb3Hj0K3bc1X9ZXhde9C2ghsSfVuudMhfR8rThNBnh55RzOB8YTyBnl9MoQ
XBO5UIFvC7wLTh_2klihb6hKuUqB6Sj3i_8

粗略叙述一下fernet接纳 Key
Rotation
 更换密钥的规律,暗中同意的交替长度是3,当以keystone-manage
fernet-setup生成密钥时,会看到0、1七个目录表征,那分别是怎么样看头呢?

简短叙述一下fernet采取 Key
Rotation
 更换密钥的原理,默许的更替长度是3,当以keystone-manage
fernet-setup生成密钥时,会看到0、1八个目录表征,那分别是怎么看头啊?

 895959.com 13

 895959.com 14

 

 

在此,要求提一下八个概念:

在此,需求提一下多个概念:

primary
key(主密钥)有且只有1个,名为为x,当前用于加密解密token

primary
key(主密钥)有且唯有三个,名为为x,当前用来加密解密token

secondary
key(次次密钥)有x-三个,从Primary退役下来的,用于解密当初它加密过的token

secondary
key(次次密钥)有x-3个,从Primary退役下来的,用于解密当初它加密过的token

staged
key(次密钥)有且只有一个,命名为0,准备下八个rotation时变成Primary
key,能够解密token

staged
key(次密钥)有且唯有二个,命名为0,准备下3个rotation时改为Primary
key,可以解密token

那么上述0
表示的是staged key,1 代表的是primary key,

那正是说上述0
表示的是staged key,1 表示的是primary key,

primary
key绝相比此外两种key,它的目录最高,并且能够加密、也得以解密;

primary
key绝相比较其它三种key,它的目录最高,并且能够加密、也足以解密;

staged key
相较于secondary key,它更有时机成为primary key。

staged key
相较于secondary key,它更有空子变成primary key。

 AES256加密token,SHA256
HMAC验证完整性,

 AES256加密token,SHA256
HMAC验证完整性,

只要Keystone具有访问这一个key的权位,token就不须求在keystone数据库中储存

只要Keystone具有访问这么些key的权柄,token就不要求在keystone数据库中储存

fernet的数据品质最佳,原因是它不供给后端持久化操作(选择 Key
Rotation
限期 更换密钥,只要Keystone具有访问这几个key的权杖,更新后的token就不须要在keystone数据库中蕴藏,缓解了数据库负载压力),并且token的表达,使用的是密钥实行解密,能够直接得出token
Data的消息,从而举行token的逾期认证。它的破产原因,只大概是token过期了,可能是token放到了cache缓存中,不过已经被回收了。追根究底,依然token过期了。

fernet的数额质量最棒,原因是它不需求后端持久化操作(选择 Key
Rotation
定期 更换密钥,只要Keystone具有访问这个key的权杖,更新后的token就不须求在keystone数据库中储存,缓解了数据库负载压力),并且token的辨证,使用的是密钥进行解密,能够直接得出token
Data的信息,从而实行token的超时认证。它的失败原因,只恐怕是token过期了,只怕是token放到了cache缓存中,但是已经被回收了。归根结底,如故token过期了。