上一篇文章讲到了kafka中的ACL,也提到了是以插件式的形式实现的,本文就来聊聊基于ranger的kafka访问控制。
【ranger插件安装】
要使用ranger插件,首先需要对ranger的kafka插件包进行解压缩,然后进入解压缩后的目录,修改安装的配置文件`install.properties`,具体修改的配置项包括:# 插件安装位置(通常就是kafka的安装位置)
COMPONENT_INSTALL_DIR_NAME=/opt/kafka
# ranger服务端的地址(拉取策略的URL)
POLICY_MGR_URL=http://192.168.3.31:6080
# kafka服务的名称
REPOSITORY_NAME=hncscwc-kafka
CUSTOM_USER=kafka
CUSTOM_GROUP=kafka 注:CUSTOM_USER和CUSTOM_GROUP是执行脚本的系统用户及用户组,也就是说对应的用户与用户组必须存在。
完成配置后,执行`enable-kafka-plugin.sh`脚本,将ranger插件需要的配置文件及jar包拷贝到kafka安装目录的正确位置中。
对于ranger也开启kerberos的场景下,即插件需要通过https的方式从ranger服务端拉取策略。
可以先直接修改插件目录下`install/conf.templates/enable/ranger-kafka-secruity-changes.cfg`文件中的配置项`ranger.plugin.kafka.policy.rest.ssl.config.file`的值,例如:ranger.plugin.kafka.policy.rest.ssl.config.file %REST_SSL_CONFIG_FILE_PATH% mod create-if-not-exists 同样在上面的install.properties中也添加对应的配置项:# https的配置信息
REST_SSL_CONFIG_FILE_PATH=/opt/kafka/config/ranger-policymgr-ssl.xml 这样,执行完`enable-kafka-plugin.sh`后,配置文件`ranger-policymgr-ssl.xml`会拷贝到正确的位置中,同时配置文件`ranger-kafka-security.xml`中对应的配置项的值也是正确的。<property>
<name>ranger.plugin.kafka.policy.rest.ssl.config.file</name>
<value>/opt/kafka/config/ranger-policymgr-ssl.xml</value>
<description>
Path to the file containing SSL details to contact Ranger Admin
</description>
</property> 否则,需要手动修改该配置文件的值(默认值为`/etc/kafka/conf/ranger-policymgr-ssl.xml`),或者将配置文件拷贝到对应路径中。
最后,还需要修改配置文件`server.properties`,指定鉴权类为ranger插件中对应的实现类。authorizer.class.name=org.apache.ranger.authorization.kafka.authorizer.RangerKafkaAuthorizer 完成这些操作后,重启kafka服务进程。
【服务端配置】
这里主要就是添加一个kafka的服务,如下图所示:
对于ranger本身也开启kerberos的情况下,需要增加配置项`policy.download.auth.users`并正确配置kafka服务使用的kerberos的用户。
之后重启kafka服务后,在ranger的管理界面就可以看到对应的插件模块来拉取策略的日志信息了。
配置注意事项:
按照上面的步骤配置操作后,重启服务后可能有如下的错误信息:[2022-08-15 19:25:35,779] ERROR addResourceIfReadable(ranger-kafka-audit.xml): couldn't find resource file location (org.apache.ranger.authorization.hadoop.config.RangerConfiguration)
[2022-08-15 19:25:35,781] ERROR addResourceIfReadable(ranger-kafka-security.xml): couldn't find resource file location (org.apache.ranger.authorization.hadoop.config.RangerConfiguration)
[2022-08-15 19:25:35,781] ERROR addResourceIfReadable(ranger-kafka-policymgr-ssl.xml): couldn't find resource file location (org.apache.ranger.authorization.hadoop.config.RangerConfiguration)
[2022-08-15 19:25:35,783] INFO PolicyEngineOptions: { evaluatorType: auto, evaluateDelegateAdminOnly: false, disableContextEnrichers: false, disableCustomConditions: false, disableTagPolicyEvaluation: false, enableTagEnricherWithLocalRefresher: false, disableTrieLookupPrefilter: false, optimizeTrieForRetrieval: false, cacheAuditResult: false } (org.apache.ranger.authorization.hadoop.config.RangerPluginConfig)
[2022-08-15 19:25:35,804] INFO Calling plugin.init() (org.apache.ranger.authorization.kafka.authorizer.RangerKafkaAuthorizer) 出现该错误意味着没有正确加载到插件所需要的配置文件,这样也就无法正确到ranger服务端完成策略信息的拉取。
之所以会出现这个错误,是因为插件中的配置类`RangerConfiguration`实际上是继承了hadoop中的配置类`org.apache.hadoop.conf.Configuration`,添加了对应的配置文件(资源后),默认会从CLASSPATH指定的路径中查找配置文件并读取,而实际kafka启动时的CLASSPATH并未指定配置文件的路径,因此会存在这样的错误信息。
可以通过在启动脚本`kafka-run-class.sh`脚本中给CLASSPATH添加对应的路径即可。
- ranger开启kerberos情况下,客户端拉取策略失败问题
ranger服务端也开启kerberos的情况下,插件去拉取策略的方式不再是http,而是https。而插件中的rest客户端延用hadoop中的机制,从配置文件中读取`hadoop.security.authentication`的认证方式以决定使用http还是https。而这个配置项是存在于配置文件`core-site.xml`中的。
未正确配置的话,会有如下错误:[2022-08-15 19:37:10,883] WARN Error getting policies. secureMode=false, user=kafka/hdp-kafka-hdp-kafka-0@BIGDATA.COM (auth:KERBEROS), response={"httpStatusCode":400,"statusCode":0}, serviceName=hncscwc-kafka (org.apache.ranger.admin.client.RangerAdminRESTClient) 因此,需要手动在kafka服务的配置文件目录下,添加`core-site.xml`配置文件,并增加对应的配置项:<configuration>
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
</configuration> 【插件使用与验证】
在ranger服务端可以看到插件成功拉取到策略后,剩下的就是策略的配置与具体的验证工作了。
对于策略的配置,也就是对不同的资源,设置不同用户在不同IP下的可操作权限,对我们而言,最常见的还是topic的生产消费了,添加允许指定用户生产消费的策略如下所示:
在服务端通过命令进行生产消费的验证如下所示:
使用过程中,也还有一些需要注意的地方。例如:topic中的生产和消费操作,这实际上对应于原生权限中的write+describe和read+describe,因此拒绝其中的一个操作而允许另外一个操作,其实连带describe权限也就拒绝了,那么实际上两个操作都不能正确执行(不管生产或消费都需要describe操作权限);另外,topic中的消费权限不像原生命令中"--consumer"的操作会同时设置topic和consumergroup的权限,ranger中需要分别进行权限的设置才行。
【总结】
本文介绍了kafka中如何正确配置ranger插件,并基于ranger进行权限控制,以及安装部署使用中容易踩坑的地方。
好了,这就是本文的全部内容,如果觉得本文对您有帮助,请多多转发,也欢迎加我微信交流~
本文分享自微信公众号 - hncscwc(gh_383bc7486c1a)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
|