问题背景
Ckafka的访问限制是一个常见的需求,特别是开通了公网访问的实例。这个功能主要使用ACL来实现。ACL是Ckafka安全模块的一部分,在介绍ACL配置之前,会简单介绍一下Ckafka的安全模块。
Ckafka的安全模块包含三部分:认证(authentication)、数据传输加密(encryption)和授权(authorization)。认证指的是客户端建立与服务端连接所需要执行的鉴权步骤,这里最常见的关键词为SASL;数据传输加密顾名思义,这里最常见的关键词是SSL;授权指的是客户端是否有权限访问特定的资源比如Cluster、Topic。这里认证和授权的主要区别在于,认证操作在连接建立前进行,授权操作在连接建立后进行。
场景
客户的实例开通了[公网路由接入](https://cloud.tencent.com/document/product/597/45990),通过外网访问和内网访问两种方式访问实例。为了安全,需要对以外网访问的客户端进行读写权限限制。
具体需求
对于某个Topic,规则如下:
- 让所有内网访问可以实现读写。
- 只允许指定外网地址 可以进行读操作(没指定的外网地址不能读),拒绝所有外网写 。
分析
从ACL的规则来看,Ckafka好像是无法实现这个需求的。因为前面提到,ACL(授权操作)在连接建立后进行的,同时ACL验证需要请求携带用户信息,在这种情况下内网访问通常是直连,不会携带用户信息,因此无法通过验证。这也是为什么[用户访问控制,ACL 与用户管理](https://cloud.tencent.com/document/product/597/31528)里面特别提到。
如果您在开通公网访问路由的同时还使用了 PLAINTEXT 方式接入 Kafka,那么之前为 Topic 设置的 ACL 仍然会生效;如果希望 PLAINTEXT 方式的访问不受影响,请为 PLAINTEXT 需要访问的 Topic 添加全部用户的可读写的权限。
但这里又有一个问题,如果ACL里面开通了Topic的全部用户的可读写的权限,那么需求2就会无效。为了解决这个问题,考虑为所有的内网ip添加Topic的读写权限。
最佳实践
按网段方式设置ip的Topic读写策略。
对于一些较老的实例,可能需要提交工单开通该功能,如下图所示。内网访问的机器可能比较多,但是大多属于一个或几个相同的网段,通过这种方式,就可以批量设置内网IP。