如何在正在运行的群集中为ACL创建Kafka用户和使用者组?

时间:2018-12-10 06:38:44

标签: apache-kafka

我在SASL_PLAINTEXT模式下使用Kafka 2.1,并且为了控制主题上的ACL,我需要创建用户和组。那么如何在正在运行的群集中创建用户?

我知道我可以使用kafka-consumer-groups.sh创建和列出组。但是当我尝试列出组时,它会抛出Failed to find brokers to send ListGroups异常。

2 个答案:

答案 0 :(得分:1)

在JAAS配置文件中配置了SASL PLAIN机制的用户(及其密码)。假设您有多个Kafka节点,则应在所有节点上保持此文件同步。 here in the Kafka Docs是一些有关如何配置它的示例。因此,除非您对此文件有一些共享存储空间,否则可能需要多次修改它。

您可能要考虑使用SCRAM而不是PLAIN。 SCRAM将凭证(用户名和密码的哈希值)存储在Zookeeper中,您可以使用一种Kafka实用程序(在Kafka docs中再次查看更多详细信息)进行更改

只需清楚一点,就ACL而言,消费者组与用户组无关。它们用于对使用者进行分组,以在它们之间分配消息负载(通过定义为哪个使用者分配了哪些分区)并存储最后消耗的偏移量。我认为SASL PLAIN机制不支持传统的用户组。我认为在大多数情况下,您实际上并没有创建这些组-它们是在消费者开始使用它们时创建的。

使用者组与ACL相关的唯一方法是允许不同的用户使用使用者组。如果启用SimpleAclAuthorizer,则可以使用kafka-acls.sh实用程序来管理ACL。您可以授予用户的权限之一是使用使用者组使用消息的权限。在Kafka Docs中提供了有关ACL的更多详细信息以及如何使用kafka-acls.sh工具的示例。

答案 1 :(得分:0)

对我有用的纯Java解决方案:

public static void main(String[] args) throws NoSuchAlgorithmException {
    String zookeeperHost = "localhost:2181";
    int sessionTimeoutMs = 300000;
    int connectionTimeoutMs = 15000;
    boolean isSecure = false;
    int maxInFlightRequests = 10;
    Time time = Time.SYSTEM;
    String metricGroup = "myGroup";
    String metricType = "myType";
    String username = "alice";
    String password = "alice-secret";


    KafkaZkClient zkClient = KafkaZkClient.apply(zookeeperHost, isSecure, sessionTimeoutMs, connectionTimeoutMs,
      maxInFlightRequests, time, metricGroup, metricType, null, Option.apply(new ZKClientConfig()));

    AdminZkClient adminZkClient = new AdminZkClient(zkClient);

    HashMap<String, String> userProp = new HashMap<>();
    ScramCredential scramCredential = new ScramFormatter(ScramMechanism.SCRAM_SHA_256).generateCredential(password, 4096);
    userProp.put(userSecureSchema, ScramCredentialUtils.credentialToString(scramCredential));

    Properties configs = adminZkClient.fetchEntityConfig(ConfigType.User(), username);
    configs.putAll(userProp);
    adminZkClient.changeConfigs(ConfigType.User(), username, configs);
}

您需要在kafka上启用SASL_SCRAM。 并且您需要org.apache.kafka:kafka_2.13:2.5.0依赖