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/