Kafka初探3A

阅读路径

  1. 谷歌搜索kafka中文介绍及翻译
  2. 学习成熟的kafka的dockerfile及compose
  3. 阅读官方文档介绍性章节
  4. 阅读官方文档security章节

主要问题

  • 重启要全面

    • 更改了配置文件重启测试时,记得先删除kafka的log(数据)目录
    • zookeeper也需要一并重置
    • 不然的话可能会遇到1 partitions have leader brokers without a matching listener, including [test-0]
  • 先配置认证

    • kafka调试3A的时候最好先不开启鉴权,先调试认证
    • kafka、hbase等apache家一众的java大数据项目的认证是类似的,涉及SASL和JAAS和SSL
      • kafka配置SSL可以用于传输层的加密,同时可选用于认证
      • JAAS是java语言内部的认证授权框架,实现了(或使用内置的)具体认证细节的模块后,可以用它处理认证过程、管理认证session和鉴权policy等等
      • SASL是规定了一些认证流程和接口&不涉及具体认证细节算法的认证规范
        • SASL是一个规范,自然就有对应的实现,网络服务以及客户端可以调用其实现进行符合SASL框架的认证交互
      • 在kafka中配置SASL的大部分配置是写在JAAS所负责解析的配置文件中的,自然就产生了在kafka中JAAS和SASL的调用关系是什么的问题,谁在谁之上?还是并列调用(JAAS只是读个配置而已)?
        • 在读了认证模块相关代码后,确认是先调用JAAS加载kafka自己编写的认证模块,而这个模块是一个adapter适配器,在其中调用sasl进行认证。即由JAAS调用SASL
        • 吐槽一下,如果用kerberos的话加上GSSAPI会有JAAS-SASL-GSSAPI三层类似的认证抽象层层调用,这就是架构嘛hhhh
  • 再配置鉴权

    • 场景中多用户多topic再开启鉴权比较好,不然徒增不少麻烦
    • 不认证但开启鉴权的问题:
      • 一般outside外部访问方向会开启认证
      • inside集群内部访问不开启认证且使用PLAINTEXT明文传输
        • 导致不开启认证 && 开启鉴权时,kafka会为inside方向没有认证的请求默认判定为User:ANONYMOUS用户
      • kafka的所有broker需要走inside方向登录自己以及其他broker进行同步
      • 鉴权所使用的访问控制ACL规则存储在zk中,不手动显式进行添加就不存在ACL规则
      • 最终导致kafka启动后无法登录自己,且日志中显示有User:ANONYMOUS用户的请求并被拒绝
        • 此时读写消息会报错Error while fetching metadata with correlation id 28 : {test=LEADER_NOT_AVAILABLE}
    • 解决的办法至少有下面几种
      • 在properties中设置User:ANONYMOUS是superuser,拥有绝对的权限
        • 或为User:ANONYMOUS配置相应的高权限ACL规则(还没有做具体实验)
        • 在outside方向没有ANONYMOUS用户存在时,我觉得安全性可以接受,尽管superuser和anonymous放一起很怪
      • inside方向传输层使用SSL,并给与证书对应的用户superuser
        • 同理也可以给证书用户很高的访问控制权限
        • 安全性最高,但配置也麻烦
      • properties开启KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND
        • 即不存在ACL策略应用于本资源时,任何人都可以访问,非常不安全

搭建运行

镜像

  • 在dockerhub和google搜索kafka容器化相关内容,找到wurstmeister/kafka-docker/
    • 下载量大,star多
    • Dockerfile entrypoint清晰
    • Tag管理简洁规范
    • Env配置注入灵活

编排

  • 编排目前使用docker-compose
  • 示例中zookeeper没有特殊的配置
  • 示例中kafka
    • 配置主要通过环境变量注入
    • 认证相关的jaas配置文件通过volume挂载进etc目录
  zookeeper:
    image: wurstmeister/zookeeper:3.4.6
    ports:
      - "172.26.0.2:2181:2181"
    networks:
      ninestates: {}

  kafka:
    image: wurstmeister/kafka:2.13-2.6.0
    ports:
      - "172.26.0.2:9092:9092"
      - "172.26.0.2:9093:9093"
    environment:
      # kafka基础配置
      KAFKA_BROKER_ID: 1
      KAFKA_CREATE_TOPICS: "test:1:1"
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: INSIDE://172.26.0.2:9092,OUTSIDE://172.26.0.2:9093
      KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9093
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:SASL_PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      # 以下是认证鉴权相关配置
      #KAFKA_HEAP_OPTS: "-Xmx1G -Xms1G -Djava.security.auth.login.config=\\/etc\\/jaas\\/kafka_server_jaas.conf"
      KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/jaas/kafka_server_jaas.conf"
      KAFKA_SASL_MECHANISM: PLAIN
      KAFKA_SASL_ENABLED_MECHANISMS: PLAIN
      KAFKA_SUPER_USERS: "User:admin;User:ANONYMOUS"
      KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.authorizer.AclAuthorizer
      #KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: "true"
    volumes:
      - "/var/kafka/:/kafka"
      - "./kafka/jaas/:/etc/jaas"
    networks:
      ninestates: {}

配置约定

基础配置

配置解释

  • KAFKA_BROKER_ID:每个broker在集群中的唯一ID
  • KAFKA_CREATE_TOPICS:启动时自动创建topic,topic名:分区数:副本数
  • KAFKA_ZOOKEEPER_CONNECT:kafka集群使用的zk集群地址
  • KAFKA_ADVERTISED_LISTENERS、KAFKA_LISTENERS
    • URI的协议名INSIDE和OUTSIDE是别名,kafka并不理解其含义
    • 多个Listener通过指定不同的URI监听不同的socket,为不同的客户端差异服务
    • SECURITY_PROTOCOL_MAP是别名到传输层安全机制的映射,如OUTSIDE使用SASL认证,传输层使用PLAINTEXT明文传输
    • INTER_BROKER_LISTENER_NAME指定哪个别名所属的listener用于集群内部通信

安全配置

配置解释

  • KAFKA_HEAP_OPTS 或 KAFKA_OPTS:指定java启动时读取jaas配置文件的路径
  • KAFKA_SASL_MECHANISM:SASL框架内使用的插件认证机制
  • KAFKA_SASL_ENABLED_MECHANISMS:SASL框架内允许使用插件认证机制
  • KAFKA_SUPER_USERS:超级用户,分号分割
  • KAFKA_AUTHORIZER_CLASS_NAME:
    • 指定鉴权插件路径
    • 同时也是鉴权开启开关
    • 关闭Authorization的话注释此项即可

JAAS配置文件

  • 以下是kafka开启SASL认证时,通过jaas配置文件传递给sasl的配置内容
  • username和password是kafka集群内部通讯使用的用户名和密码
    • 但是目前的配置在outside的listener开启认证,所以不涉及内部通讯
  • user_username="password"是用于登陆的用户名和密码
    • 可以看到sasl使用plain认证机制时用户名和密码是明文写在配置文件中的
kafka_server_jaas.conf: 

KafkaServer {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="admin-secret"
    user_admin="admin-secret"
    user_alice="alice-secret";
};
  • 以下是客户端与服务端对称的jaas配置文件
    • 由于配置内容不多,所以可以写在客户端的properties配置文件中,如下下图
    • 如果非要使用jaas.conf文件的话,java程序启动时同样需要指定-Djava.security.auth.login.config=路径
kafka_client_jaas.conf:

    sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \
        username="alice" \
        password="alice-secret";
kafka_client_alice.properties:

security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="alice" password="alice-secret";
group.id=test-group

生产消费

无认证鉴权
  • 消费./kafka-console-producer.sh --bootstrap-server 127.0.0.1:9092 --topic test
  • 生产./kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic test --from-beginning
有认证鉴权
  • 消费./kafka-console-consumer.sh --bootstrap-server 172.26.0.2:9093 --topic test --from-beginning --consumer.config /etc/jaas/kafka_client.properties
  • 生产./kafka-console-producer.sh --bootstrap-server 172.26.0.2:9093 --topic test --producer.config /etc/jaas/kafka_client.properties

ACL配置

  • 进入kafka容器后需要unset KAFKA_OPTS避免去读取用于连接zookeeper的jaas配置
  • ./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=zookeeper:2181 --add --allow-principal User:alice --operation Read --topic test
  • ./kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=zookeeper:2181 --add --allow-principal User:alice --operation Read --group test-group
    • 注意consumer读取时涉及对自己所属consumer-group的组相关信息的读取
    • 不加的话会报 org.apache.kafka.common.errors.GroupAuthorizationException: Not authorized to access group: console-consumer-5462

Finally

  • 第一次记录大数据平台方面的学习,欢迎评论交流
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容