前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >​空谈Security之Authentication和Authorization

​空谈Security之Authentication和Authorization

作者头像
Bruce Li
发布2020-06-29 11:17:17
9600
发布2020-06-29 11:17:17
举报

authentication和authorization这两个单词看起来很像,并且它们经常被一起提及到,但是,请注意,它们指代的是不同的概念,authentication指的是认证登陆;而authorization指的是权限保护。

首先,我们来看一看kafka提供的authentication和authorization机制:

从上面截图可以看出,总的来讲,kafka的authentication有两种方式:SSL和SASL;authorization则是基于ACL(access control list)。

1

大家可能都知道,https是基于SSL协议,相比于http协议,它最大的好处就是加密(encryption),这样即使有人在路由器上抓包,也看不到http的明文内容。这也是上面截图中7.2节的标题叫做“Encryption and Authentication using SSL”的原因。

SSL除了用来做encryption,同时也可以用来做authentication。我们在淘宝上买东西,需要先登陆,输入用户名密码,这就是基本的用户名密码登陆;另外,有的时候,为了保障账号安全,输入用户名密码之后,我们还需要输入一个手机验证码作为二次验证,这就是额外的二次验证机制(two-factor authentication)。对于一些public的网站,用户随时变化,很多都采用的是这种用户名密码的authentication方式。

但是,对于一些公司内网,主要面向公司员工,每次都输入用户名密码就显得很麻烦,这时就可以使用SSL(X509 client certificate,ssh等)的认证方式。简单理解,基于这种认证方式,在需要登陆的时候,客户端发送请求给服务器;服务器端找到对应用户的公钥,然后生成一个随机数r,用公钥加密这个数,发回给客户端;客户端用私钥解密,得到r,然后再把r加上session key做一个hash摘要,发给服务器;服务器端用同样的算法对随机数+seesion key生成摘要,然后比较两个是否相同,相同的话就认证成功;否则,认证失败。其实,这个流程就是验证https的一个反向流程。除了这里提到的公司内网的案例,还有我们经常使用的github,采用ssh协议也是这个原理。

基于SSL的encryption,会涉及到两种加密:非对称加密(asymmetric encryption)和对称加密(symmetric encryption)。建立连接过程中,公钥加密私钥解密随机数的过程就是非对称加密;而这个随机数作为密钥进行后续加密的过程就是对称加密。非对称加密由于加密效率相对较差,所以常用于信息摘要加密等场景(下面会提到的JWT就是一个应用场景),对称加密则更多用于实际数据加密。

2

kafka提供了多种基于SASL的认证机制,如下图所示:

其中第二种“SASL/PLAIN”就是上面提到的用户名密码认证,对于这种认证方式,我们又可以选择用SSL加密或者不用,类比就是https和http。下面是一个典型的SASL/PLAIN+SSL客户端配置:

代码语言:javascript
复制
security.protocol=SASL_SSL      //ssl to encription
sasl.mechanism=PLAIN           //username+password
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="alice" password="alice-secret";
ssl.truststore.location=/var/private/ssl/client.truststore.jks
ssl.truststore.password=test1234

从截图中第四种方式“SASL/OAUTHBEARER”可以看到,kafka还支持oauth的认证方式。oauth2是oauth的升级版本,一般来说,oauth2常用的两种方式是:client credentials和authorization code,分别适用于technical user和end user访问受保护资源的场景。

oauth2经常都会和JWT(json web token)一起结合使用,用JWT来传递认证授权信息,下图是一个JWT的例子:

如何保证JWT的安全性呢?关键又是信息摘要:基于一种hash加密算法(图中为RS256),token生成端把header+payload部分用私钥加密生成摘要,第三方得到这个token之后用公钥验证摘要,过程中token有任何修改,摘要验证都会失败。

3

authorization的本质就是“某人可以做某事”,kafka的ACL配置语法就是基于这样概念:

"Principals User:Bob and User:Alice are allowed to perform Operation Read and Write on Topic Test-Topic from IP 198.51.100.0 and IP 198.51.100.1" https://kafka.apache.org/documentation/#security_authz

其实上面提到的oauth只是一个关于授权的协议,从其英文就可以看出:Open Authorization。如果同时要实现认证,则需要组合一些其它的协议,比如:openid或者saml2.0等。

References

  • https://kafka.apache.org/documentation/#security
  • https://oauth.net/2/
  • https://jwt.io/
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 天马行空布鲁斯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
SSL 证书
腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档