新普金娱乐网址


2016年仍旧都过半了,可自己还一事无成,你吧?

少壮的时段里,我也曾死心塌地

keystone令牌两种生成格局

  • 十二月 29, 2018
  • 数学
  • 没有评论

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

知识点复习:

矢量化指的是用数组表明式代替循环来操作数组里的各样元素。

深切浅出的讲,token
是用户的一种凭证,需拿正确的用户名/密码向 Keystone
申请才能赢得。倘若用户每趟都拔取用户名/密码访问 OpenStack
API,容易走漏风声用户信息,带来安全隐患。所以 OpenStack 要求用户访问其 API
前,必须先拿走 token,然后用 token 作为用户凭据访问 OpenStack
API。 

NumPy提供的通用函数(既ufunc函数)是一种对ndarray中的数据举办元素级别运算的函数。

公开密钥加密,也号称非对称加密(asymmetric
cryptography,加密密钥和解密密钥不一致),在那种密码学方法中,需要部分密钥,分别为公钥(Public
Key)和私钥(Private
Key),公钥是开诚布公的,私钥是非公开的,需用户妥善保管。如若把加密和解密的流水线当做函数
C(x) 和 D(x),P 和 S 分别代表公钥和私钥,对明文 A 和密文 B
而言,数学的角度上有以下公式:

诸如,square函数统计各要素的平方,rint函数将各因素四舍五入:

B = C(A,
S)

图片 1

A = D(B,
P)

还有一部分函数接受2个参数,叫二元ufunc,比如add函数和maximum函数:

其中加密函数
C(x), 解密函数 D(x) 以及公钥 P
均是当众的。拔取公钥加密的密文只好用私钥解密,接纳私钥加密的密文只好用公钥解密。非对称加密常见利用在汉中世界,诸如常见的
HTTPS,SSH 登录等。

图片 2

数字签名又称为公钥数字签名,首先利用 Hash
函数对音讯生成摘要,摘要经私钥加密后称为数字签名。接收方用公钥解密该数字签名,并与吸纳消息生成的摘要做相比较,假诺两者一致,便足以肯定该音讯的完整性和忠实。

numpy.where函数

(1)UUID认证原理:

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

numpy.where函数是大年底一表明式 x if condition else y 的矢量化版本,例如:

症结:每便请求都要因此keystone举办认证,造成性能瓶颈。

图片 3

 图片 4

np.where函数的第二个参数和第几个参数不是必需的,它们都得以是标量值,例如:

 

图片 5

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

数学和总括模式

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

譬如np.sum函数可以对数组里的因素求和:

3.客户端缓存UUID token

图片 6

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

对此二维数组,sum函数也是将有所因素求和,可是二维数组是有横轴和竖轴五个样子的,所以sum函数对于二维数组还是可以按照方向进行求和:

5.Keystone从http请求中拿到token,并检查token是否行得通

图片 7

6.Token使得,处理请求,并回到客户端请求结果

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

UUID模式源码分析:

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

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

 

转变的样例:144d8a99a42447379ac37f78bf0ef608

(2)PKI认证原理:

在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(这一经过只需要开展一回)进行解密,获取用户音信。

对此用户的token,还需举行token的官方时间,以及token仍旧否留存进展判定。所以当nova每两遍得到token后还需向keystone询问一回token的挫折列表,检查token是否失效。这一经过对于keystone的载重如故相当轻的,所以PKI仍旧实惠缓解了keystone性能瓶颈的问题。

小结:OpenStack服务中的每一个API Endpoint都有一份keystone签发的证件,失效列表和根证书。API不用在平素去keystone认证token是否合法,只需要依照keystone的证件和失灵列表就足以确定token是否合法。不过这里依旧会有每回都亟待请求keystone去获取失效列表的操作,不可避免。

 图片 8

 

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

    def
_get_token_id(self, token_data):

       
try:

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

           
token_id = str(cms.cms_sign_token(token_json,

             
                                CONF.signing.certfile,

             
                                CONF.signing.keyfile))  
#DEFAULT_TOKEN_DIGEST_ALGORITHM=sha256

其中,‘token_data’是赢得的user、role、endpoint、catlog等音讯集合,而最根本的说话是cms使用签名生成token的经过:cms_sign_token,使用默认的sha256措施加密,处理过程使用process,举办多少的读取、处理, 

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

             
                   ‘-signer’, signing_cert_file_name,

             
                   ‘-inkey’, signing_key_file_name,

             
                   ‘-outform’, ‘PEM’,

             
                   ‘-nosmimecap’, ‘-nodetach’,

             
                   ‘-nocerts’, ‘-noattr’, 

             
                   ‘-md’, message_digest, ],

             
                  stdin=subprocess.PIPE,

             
                  stdout=subprocess.PIPE,

             
                  stderr=subprocess.PIPE,

             
                  close_fds=True)

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

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

 图片 9

 

(3)Fernet认证原理:

 图片 10

 

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

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

3.客户端缓存token(UUID)

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

5、OpenStack
API向 keystone请求token认证

6.Keystone从http请求中拿到token,并检查token是否行得通

7.Token卓有效率,处理请求,并回到openstack
api请求结果

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

当集群运行较长一段时间后,访问其 API
会变得奇慢无比,究其原因在于 Keystone 数据库存储了大气的 token
导致性能太差,解决的艺术是平日清理
token。为了制止上述问题,社区指出了Fernet
token
,fernet
是眼下主流推荐的token格式,它采用 cryptography 对称加密库(symmetric
cryptography,加密密钥和解密密钥相同) 加密 token,具体由 AES-CBC
加密和散列函数 SHA256 签名。Fernet 是专为
API token 设计的一种轻量级安全音信格式,不需要仓储于数据库,裁减了磁盘的
IO,带来了肯定的特性提高。为了加强安全性,需要采取 Key
Rotation
 更换密钥。

图片 11

 

如上代码注解,token 包含了
user_id,project_id,domain_id,methods,expires_at
等音讯,首要的是,它从未 service_catalog,所以 region
的数目并不影响它的高低。self.pack()最终调用如下代码对上述音讯加密:

图片 12

 

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

gAAAAABWfX8riU57aj0tkWdoIL6UdbViV-632pv0rw4zk9igCZXgC-sKwhVuVb-wyMVC9e5TFc
7uPfKwNlT6cnzLalb3Hj0K3bc1X9ZXhde9C2ghsSfVuudMhfR8rThNBnh55RzOB8YTyBnl9MoQ
XBO5UIFvC7wLTh_2klihb6hKuUqB6Sj3i_8

简单易行叙述一下fernet采纳 Key
Rotation
 更换密钥的原理,默认的交替长度是3,当以keystone-manage
fernet-setup生成密钥时,会看到0、1三个目录表征,这分别是哪些看头啊?

 图片 13

 

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

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

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

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

这就是说上述0
表示的是staged key,1 表示的是primary key,

primary
key相比此外二种key,它的目录最高,并且可以加密、也足以解密;

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

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

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

fernet的多寡性能最好,原因是它不需要后端持久化操作(采用 Key
Rotation
期限 更换密钥,只要Keystone具有访问这么些key的权位,更新后的token就不需要在keystone数据库中存储,缓解了数据库负载压力),并且token的印证,使用的是密钥举行解密,可以直接得出token
Data的消息,从而举行token的晚点认证。它的破产原因,只可能是token过期了,或者是token放到了cache缓存中,不过已经被回收了。归根结蒂,依然token过期了。

 

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图