下一场用 token 作为用户凭据访问 OpenStack,然后用 token 作为用户凭据访问 OpenStack

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举办说明,造成品质瓶颈。

 图片 1

 图片 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(这一进程只需求进行一次)进行解密,获取用户音讯。

当用户拿着用户名/密码去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每三遍获得token后还需向keystone询问一遍token的败诉列表,检查token是不是失效。这一经过对于keystone的载荷照旧格外轻的,所以PKI依然有效缓解了keystone品质瓶颈的题材。

总括:OpenStack服务中的每一个API Endpoint都有一份keystone签发的阐明,失效列表和根证书。API不用在直接去keystone认证token是或不是合法,只须求依照keystone的证书和失效列表就可以规定token是还是不是合法。但是此间如故会有每一次都亟待请求keystone去取得失效列表的操作,不可防止。

统计:OpenStack服务中的每一个API Endpoint都有一份keystone签发的讲明,失效列表和根证书。API不用在直接去keystone认证token是或不是合法,只必要按照keystone的证书和失效列表就可以规定token是或不是合法。不过此间依然会有每便都亟待请求keystone去取得失效列表的操作,不可幸免。

 图片 3

 图片 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个字节,样例:

 图片 5

 图片 6

 

 

(3)Fernet认证原理:

(3)Fernet认证原理:

 图片 7

 图片 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
 更换密钥。

图片 9

图片 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()
最终调用如下代码对上述音信加密:

图片 11

图片 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八个目录表征,那分别是如何意思呢?

 图片 13

 图片 14

 

 

在此,必要提一下四个概念:

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

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

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

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

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

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

staged
key(次密钥)有且唯有一个,命名为0,准备下一个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过期了。

 

 

相关文章