Kafka开启使用 SASL_PLAINTEXT认证

1、进入config目录,增加如下配置文件:

    (1)touch kafka_server_jaas.conf

      配置如下:       

KafkaServer {
            org.apache.kafka.common.security.plain.PlainLoginModule required
            username="admin"
            password="admin"
            user_admin="admin"
            user_alice="alice";
        };

      在KafkaServer部分,username和password是broker用于初始化连接到其他的broker,在上面配置中,admin用户为broker间的通讯,user_userName定义了所有连接到 broker和 broker验证的所有的客户端连接包括其他 broker的用户密码,user_userName必须配置admin用户,否则报错。  

    (2)touch kafka_cilent_jaas.conf

      配置如下:       

KafkaClient {
                org.apache.kafka.common.security.plain.PlainLoginModule required
                username="admin"
                password="admin";
        };

      在KafkaClient部分,username和password是客户端用来配置客户端连接broker的用户,在上面配置中,客户端使用admin用户连接到broker。 

2、更改server.properties配置文件:

listeners=SASL_PLAINTEXT://ip:9092
    # 使用的认证协议 
    security.inter.broker.protocol=SASL_PLAINTEXT
    #SASL机制 
    sasl.enabled.mechanisms=PLAIN  
    sasl.mechanism.inter.broker.protocol=PLAIN   
    # 完成身份验证的类 
    authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer 
     # 如果没有找到ACL(访问控制列表)配置,则允许任何操作。 
    #allow.everyone.if.no.acl.found=true
    super.users=User:admin
  修改consuer和producer的配置文件consumer.properties和producer.properties,分别增加如下配置:
    security.protocol=SASL_PLAINTEXT
    sasl.mechanism=PLAIN

3、 切换到kafka目录下bin路径:

   JAAS文件作为每个broker的jvm参数,在kafka-server-start.sh脚本中增加如下配置(可在最上面):

    export KAFKA_OPTS=" -Djava.security.auth.login.config=/data/kafka/kafka_2.11-1.1.0/config/kafka_server_jaas.conf"

   在kafka-console-consumer.sh和kafka-console-producer.sh中添加:

    export KAFKA_OPTS=" -Djava.security.auth.login.config=/data/kafka/kafka_2.11-1.1.0/config/kafka_client_jaas.conf"

  启动zookeeper和kafka:

    bin/zookeeper-server-start.sh config/zookeeper.properties & (&代表后台运行)

    bin/kafka-server-start.sh config/server.properties &

   输入命令,启动生产者:

    bin/kafka-console-producer.sh --broker-list 10.100.17.79:9092 --topic test --producer.config config/producer.properties

   输入命令,启动消费者

    bin/kafka-console-consumer.sh --bootstrap-server 10.100.17.79:9092 --topic test --from-beginning --consumer.config config/consumer.properties

  如果消费者启动不了或者无法消费指定topic,尝试设置所使用用户的组权限(当前使用用户admin为超级用户,不需要配置权限)

4、利用kafka-acls.sh为topic设置ACL:

    bin/kafka-acls.sh --authorizer-properties zookeeper.connect=ip:2181 --add --allow-principal  User:admin  --group test-consumer-group --topic test

  注意,如果admin要作为消费端连接alice-topic的话,必须对其使用的group(test-consumer-group)也赋权(group 在consumer.properties中有默认配置group.id)

  权限操作例子:

    1)增加权限:

      # 为用户 alice 在 test(topic)上添加读写的权限

      bin/kafka-acls.sh --authorizer-properties zookeeper.connect=ip:2181 --add --allow-principal User:alice --operation Read --operation Write --topic test

      # 对于 topic 为 test 的消息队列,拒绝来自 ip 为192.168.1.100账户为 zhangsan 进行 read 操作,其他用户都允许

      bin/kafka-acls.sh --authorizer-properties zookeeper.connect=ip:2181 --add --allow-principal User:* --allow-host * --deny-principal User:zhangsan

       --deny-host 192.168.1.100 --operation Read --topic test

      # 为 zhangsan 和 alice 添加all,以允许来自 ip 为192.168.1.100或者192.168.1.101的读写请求

      bin/kafka-acls.sh --authorizer-properties zookeeper.connect=ip:2181 --add --allow-principal User:zhangsan --allow-principal User:alice --allow-host 192.168.1.100 --allow-host 192.168.1.101 --operation Read --operation Write --topic test

    2) 获取权限列表:

      # 列出 topic 为 test 的所有权限账户

      bin/kafka-acls.sh --authorizer-properties zookeeper.connect=ip:2181 --list --topic test

    3) 移除权限:

      # 移除 acl

      bin/kafka-acls.sh --authorizer-properties zookeeper.connect=ip:2181 --remove --allow-principal User:zhangsan --allow-principal User:Alice --allow-host 192.168.1.100 --allow-host 192.168.1.101 --operation Read --operation Write --topic test

以上完成Kafka的SASL_PLAINTEXT认证。 

Kafka 配额

Kafka配额管理所能配置的对象(或者说粒度)有3种:

  • user + clientid
  • user
  • clientid

这3种都是对接入的client的身份进行的认定方式。其中,clientid是每个接入kafka集群的client的一个身份标志,在ProduceRequest和FetchRequest中都需要带上;user只有在开启了身份认证的kafka集群才有。

上面我们已经开启了sasl身份认证,下面讲下如果使用user来进行配额

可配置的选项包括:

  • producer_byte_rate。发布者单位时间(每秒)内可以发布到单台broker的字节数。
  • consumer_byte_rate。消费者单位时间(每秒)内可以从单台broker拉取的字节数。

kafka官方的二进制包中,包含了一个脚本bin/kafka-configs.sh,支持针对userclient-id(user,client-id)等三种纬度设置配额(也是通过修改zk来实现的)。

bin/kafka-configs.sh  --zookeeper localhost:2181 --alter --add-config 'producer_byte_rate=1024,consumer_byte_rate=2048' --entity-type users --entity-name user1

超额处理

如果连接超过了配额值会怎么样呢?kafka给出的处理方式是:延时回复给业务方,不使用特定返回码。

具体到producer还是consumer,处理方式又有所不同:

  • Producer。如果Producer超额了,先把数据append到log文件,再计算延时时间,并在ProduceResponse的ThrottleTime字段填上延时的时间(v2,只在0.10.0版本以上支持)。
  • Consumer。如果Consumer超额了,先计算延时时间,在延时到期后再去从log读取数据并返回给Consumer。否则无法起到限制对文件系统的读蜂拥。在v1(0.9.0以上版本)和v2版本的FetchResponse中有ThrottleTime字段,表示因为超过配额而延时了多久。