专栏首页天马行空布鲁斯​空谈Security之Authentication和Authorization

​空谈Security之Authentication和Authorization

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客户端配置:

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/

本文分享自微信公众号 - 天马行空布鲁斯(gh_2feda5c053bd),作者:huazailmh

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 空谈stateless和stateful

    其实,关于这两个词语,我们经常听到,网上也有很多文章介绍,大家可以自行搜索。这里只谈一谈个人对它们的理解。

    Bruce Li
  • 浅析一个postgresql的死锁问题

    之前写过一篇文章(浅析一个sql server数据库事务死锁问题),简单分析了一个sql server数据库的死锁问题及索引对执行计划的影响;这里继续分享一个p...

    Bruce Li
  • Security知识阶段汇总

    去年参与了很多公司组织的security活动,并且给自己team,其他team做过一些security相关的分享,今年公司security相关的活动又陆续开始了...

    Bruce Li
  • HTML中点击<a>超链接标签使其不跳转

    最近使用前端框架,需要使用一个<a>超链接标签的样式,但又不要让他跳转,所以搜集了网上的资料查到几个方法:

    浩Coding
  • Python全栈开发之文件操作

    在终端/资源管理器、 中可以执行常规的文件/目录管理操作 ,如果希望通过代码来实现,需要导入os模块

    py3study
  • linux网络编程之socket(十一):套接字I/O超时设置方法和用select实现超时

    注:如无特殊说明,sockfd 原始状态都是阻塞的。 一、使用alarm 函数设置超时 void handler(int sig) { } signal(SIG...

    s1mba
  • 《手把手教你》系列基础篇之2-python+ selenium-打开和关闭浏览器(详细)

    本节介绍如何初始化一个webdriver实例对象driver,然后打开和关闭firefox浏览器。要用selenium打开fiefox浏览器。首先需要去下载一个...

    北京-宏哥
  • SQLServer数据库文件组相关知识笔记

    数据库文件被组织在称为“文件组”的逻辑组中。文件组是所创建对象(如表或索引)的目标容器,对象数据将分散在其所在目标文件组的文件中,文件组可以按你要求的方式来控制...

    IT技术分享社区
  • SQLServer数据库文件组相关知识笔记

    数据库文件被组织在称为“文件组”的逻辑组中。文件组是所创建对象(如表或索引)的目标容器,对象数据将分散在其所在目标文件组的文件中,文件组可以按你要求的方式来控制...

    IT技术分享社区
  • [二十五]JavaIO之RandomAccessFile

    noteless

扫码关注云+社区

领取腾讯云代金券