From 82fbea4e5f6ab79ba4781b069791016f3d90a41c Mon Sep 17 00:00:00 2001 From: ZQKC Date: Sun, 23 Apr 2023 11:35:44 +0800 Subject: [PATCH] =?UTF-8?q?[Doc]=E8=A1=A5=E5=85=85zk=5Fproperties=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E7=9A=84=E4=BD=BF=E7=94=A8=E8=AF=B4=E6=98=8E(#995)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、补充 zk_properties 字段 使用说明; 2、补充 Digest-MD5 认证例子; 3、调整 Kerberos 认证说明; --- ...0\257\201Kafka\351\233\206\347\276\244.md" | 180 ++++++++++++++++++ ...\350\256\244\350\257\201\347\232\204ZK.md" | 69 ------- 2 files changed, 180 insertions(+), 69 deletions(-) create mode 100644 "docs/dev_guide/\346\216\245\345\205\245ZK\345\270\246\350\256\244\350\257\201Kafka\351\233\206\347\276\244.md" delete mode 100644 "docs/dev_guide/\346\224\257\346\214\201Kerberos\350\256\244\350\257\201\347\232\204ZK.md" diff --git "a/docs/dev_guide/\346\216\245\345\205\245ZK\345\270\246\350\256\244\350\257\201Kafka\351\233\206\347\276\244.md" "b/docs/dev_guide/\346\216\245\345\205\245ZK\345\270\246\350\256\244\350\257\201Kafka\351\233\206\347\276\244.md" new file mode 100644 index 00000000..294a4742 --- /dev/null +++ "b/docs/dev_guide/\346\216\245\345\205\245ZK\345\270\246\350\256\244\350\257\201Kafka\351\233\206\347\276\244.md" @@ -0,0 +1,180 @@ + +![Logo](https://user-images.githubusercontent.com/71620349/185368586-aed82d30-1534-453d-86ff-ecfa9d0f35bd.png) + +--- + +# 接入 ZK 带认证的 Kafka 集群 + +- [接入 ZK 带认证的 Kafka 集群](#接入-zk-带认证的-kafka-集群) + - [1、简要说明](#1简要说明) + - [2、支持 Digest-MD5 认证](#2支持-digest-md5-认证) + - [3、支持 Kerberos 认证](#3支持-kerberos-认证) + + + +## 1、简要说明 + +- 1、当前 KnowStreaming 暂无页面可以直接配置 ZK 的认证信息,但是 KnowStreaming 的后端预留了 MySQL 的字段用于存储 ZK 的认证信息,用户可通过将认证信息存储至该字段,从而达到支持接入 ZK 带认证的 Kafka 集群。 +  + +- 2、该字段位于 MySQL 库 ks_km_physical_cluster 表中的 zk_properties 字段,该字段的格式是: +```json +{ + "openSecure": false, # 是否开启认证,开启时配置为true + "sessionTimeoutUnitMs": 15000, # session超时时间 + "requestTimeoutUnitMs": 5000, # request超时时间 + "otherProps": { # 其他配置,认证信息主要配置在该位置 + "zookeeper.sasl.clientconfig": "kafkaClusterZK1" # 例子, + } +} +``` + +- 3、实际生效的代码位置 +```java +// 代码位置:https://github.com/didi/KnowStreaming/blob/master/km-persistence/src/main/java/com/xiaojukeji/know/streaming/km/persistence/kafka/KafkaAdminZKClient.java + +kafkaZkClient = KafkaZkClient.apply( + clusterPhy.getZookeeper(), + zkConfig.getOpenSecure(), // 是否开启认证,开启时配置为true + zkConfig.getSessionTimeoutUnitMs(), // session超时时间 + zkConfig.getRequestTimeoutUnitMs(), // request超时时间 + 5, + Time.SYSTEM, + "KS-ZK-ClusterPhyId-" + clusterPhyId, + "KS-ZK-SessionExpireListener-clusterPhyId-" + clusterPhyId, + Option.apply("KS-ZK-ClusterPhyId-" + clusterPhyId), + Option.apply(this.getZKConfig(clusterPhyId, zkConfig.getOtherProps())) // 其他配置,认证信息主要配置在该位置 +); +``` + +- 4、SQL例子 +```sql +update ks_km_physical_cluster set zk_properties='{ "openSecure": true, "otherProps": { "zookeeper.sasl.clientconfig": "kafkaClusterZK1" } }' where id=集群1的ID; +``` + + +- 5、zk_properties 字段不能覆盖所有的场景,所以实际使用过程中还可能需要在此基础之上,进行其他的调整。比如,`Digest-MD5 认证` 和 `Kerberos 认证` 都还需要修改启动脚本等。后续看能否通过修改 ZK 客户端的源码,使得 ZK 认证的相关配置能和 Kafka 认证的配置一样方便。 + + +--- + + +## 2、支持 Digest-MD5 认证 + +1. 假设你有两个 Kafka 集群, 对应两个 ZK 集群; +2. 两个 ZK 集群的认证信息如下所示 + +```bash +# ZK1集群的认证信息,这里的 kafkaClusterZK1 可以是随意的名称,只需要和后续数据库的配置对应上即可。 +kafkaClusterZK1 { + org.apache.zookeeper.server.auth.DigestLoginModule required + username="zk1" + password="zk1-passwd"; +}; + +# ZK2集群的认证信息,这里的 kafkaClusterZK2 可以是随意的名称,只需要和后续数据库的配置对应上即可。 +kafkaClusterZK2 { + org.apache.zookeeper.server.auth.DigestLoginModule required + username="zk2" + password="zk2-passwd"; +}; +``` + +3. 将这两个ZK集群的认证信息存储到 `/xxx/zk_client_jaas.conf` 文件中,文件中的内容如下所示: + +```bash +kafkaClusterZK1 { + org.apache.zookeeper.server.auth.DigestLoginModule required + username="zk1" + password="zk1-passwd"; +}; + +kafkaClusterZK2 { + org.apache.zookeeper.server.auth.DigestLoginModule required + username="zk2" + password="zk2-passwd"; +}; + +``` + +4. 修改 KnowStreaming 的启动脚本 + +```bash +# `KnowStreaming/bin/startup.sh` 中的 47 行的 JAVA_OPT 中追加如下设置 + +-Djava.security.auth.login.config=/xxx/zk_client_jaas.conf +``` + +5. 修改 KnowStreaming 的表数据 + +```sql +# 这里的 kafkaClusterZK1 要和 /xxx/zk_client_jaas.conf 中的对应上 +update ks_km_physical_cluster set zk_properties='{ "openSecure": true, "otherProps": { "zookeeper.sasl.clientconfig": "kafkaClusterZK1" } }' where id=集群1的ID; + +update ks_km_physical_cluster set zk_properties='{ "openSecure": true, "otherProps": { "zookeeper.sasl.clientconfig": "kafkaClusterZK2" } }' where id=集群2的ID; +``` + +6. 重启 KnowStreaming + + +--- + + +## 3、支持 Kerberos 认证 + +**第一步:查看用户在ZK的ACL** + +假设我们使用的用户是 `kafka` 这个用户。 + +- 1、查看 server.properties 的配置的 zookeeper.connect 的地址; +- 2、使用 `zkCli.sh -serve zookeeper.connect的地址` 登录到ZK页面; +- 3、ZK页面上,执行命令 `getAcl /kafka` 查看 `kafka` 用户的权限; + +此时,我们可以看到如下信息: +![watch_user_acl.png](assets/support_kerberos_zk/watch_user_acl.png) + +`kafka` 用户需要的权限是 `cdrwa`。如果用户没有 `cdrwa` 权限的话,需要创建用户并授权,授权命令为:`setAcl` + + +**第二步:创建Kerberos的keytab并修改 KnowStreaming 主机** + +- 1、在 Kerberos 的域中创建 `kafka/_HOST` 的 `keytab`,并导出。例如:`kafka/dbs-kafka-test-8-53`; +- 2、导出 keytab 后上传到安装 KS 的机器的 `/etc/keytab` 下; +- 3、在 KS 机器上,执行 `kinit -kt zookeepe.keytab kafka/dbs-kafka-test-8-53` 看是否能进行 `Kerberos` 登录; +- 4、可以登录后,配置 `/opt/zookeeper.jaas` 文件,例子如下: +```bash +Client { + com.sun.security.auth.module.Krb5LoginModule required + useKeyTab=true + storeKey=false + serviceName="zookeeper" + keyTab="/etc/keytab/zookeeper.keytab" + principal="kafka/dbs-kafka-test-8-53@XXX.XXX.XXX"; +}; +``` +- 5、需要配置 `KDC-Server` 对 `KnowStreaming` 的机器开通防火墙,并在KS的机器 `/etc/host/` 配置 `kdc-server` 的 `hostname`。并将 `krb5.conf` 导入到 `/etc` 下; + + +**第三步:修改 KnowStreaming 的配置** + +- 1、修改数据库,开启ZK的认证 +```sql +update ks_km_physical_cluster set zk_properties='{ "openSecure": true }' where id=集群1的ID; +``` + +- 2、在 `KnowStreaming/bin/startup.sh` 中的47行的JAVA_OPT中追加如下设置 +```bash +-Dsun.security.krb5.debug=true -Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/opt/zookeeper.jaas +``` + +- 3、重启KS集群后再 start.out 中看到如下信息,则证明Kerberos配置成功; + +![success_1.png](assets/support_kerberos_zk/success_1.png) + +![success_2.png](assets/support_kerberos_zk/success_2.png) + + +**第四步:补充说明** + +- 1、多Kafka集群如果用的是一样的Kerberos域的话,只需在每个`ZK`中给`kafka`用户配置`crdwa`权限即可,这样集群初始化的时候`zkclient`是都可以认证; +- 2、多个Kerberos域暂时未适配; \ No newline at end of file diff --git "a/docs/dev_guide/\346\224\257\346\214\201Kerberos\350\256\244\350\257\201\347\232\204ZK.md" "b/docs/dev_guide/\346\224\257\346\214\201Kerberos\350\256\244\350\257\201\347\232\204ZK.md" deleted file mode 100644 index 116643ba..00000000 --- "a/docs/dev_guide/\346\224\257\346\214\201Kerberos\350\256\244\350\257\201\347\232\204ZK.md" +++ /dev/null @@ -1,69 +0,0 @@ - -## 支持Kerberos认证的ZK - - -### 1、修改 KnowStreaming 代码 - -代码位置:`src/main/java/com/xiaojukeji/know/streaming/km/persistence/kafka/KafkaAdminZKClient.java` - -将 `createZKClient` 的 `135行 的 false 改为 true -![need_modify_code.png](assets/support_kerberos_zk/need_modify_code.png) - - -修改完后重新进行打包编译,打包编译见:[打包编译](https://github.com/didi/KnowStreaming/blob/master/docs/install_guide/%E6%BA%90%E7%A0%81%E7%BC%96%E8%AF%91%E6%89%93%E5%8C%85%E6%89%8B%E5%86%8C.md -) - - - -### 2、查看用户在ZK的ACL - -假设我们使用的用户是 `kafka` 这个用户。 - -- 1、查看 server.properties 的配置的 zookeeper.connect 的地址; -- 2、使用 `zkCli.sh -serve zookeeper.connect的地址` 登录到ZK页面; -- 3、ZK页面上,执行命令 `getAcl /kafka` 查看 `kafka` 用户的权限; - -此时,我们可以看到如下信息: -![watch_user_acl.png](assets/support_kerberos_zk/watch_user_acl.png) - -`kafka` 用户需要的权限是 `cdrwa`。如果用户没有 `cdrwa` 权限的话,需要创建用户并授权,授权命令为:`setAcl` - - -### 3、创建Kerberos的keytab并修改 KnowStreaming 主机 - -- 1、在 Kerberos 的域中创建 `kafka/_HOST` 的 `keytab`,并导出。例如:`kafka/dbs-kafka-test-8-53`; -- 2、导出 keytab 后上传到安装 KS 的机器的 `/etc/keytab` 下; -- 3、在 KS 机器上,执行 `kinit -kt zookeepe.keytab kafka/dbs-kafka-test-8-53` 看是否能进行 `Kerberos` 登录; -- 4、可以登录后,配置 `/opt/zookeeper.jaas` 文件,例子如下: -```sql -Client { - com.sun.security.auth.module.Krb5LoginModule required - useKeyTab=true - storeKey=false - serviceName="zookeeper" - keyTab="/etc/keytab/zookeeper.keytab" - principal="kafka/dbs-kafka-test-8-53@XXX.XXX.XXX"; -}; -``` -- 5、需要配置 `KDC-Server` 对 `KnowStreaming` 的机器开通防火墙,并在KS的机器 `/etc/host/` 配置 `kdc-server` 的 `hostname`。并将 `krb5.conf` 导入到 `/etc` 下; - - -### 4、修改 KnowStreaming 的配置 - -- 1、在 `/usr/local/KnowStreaming/KnowStreaming/bin/startup.sh` 中的47行的JAVA_OPT中追加如下设置 -```bash --Dsun.security.krb5.debug=true -Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/opt/zookeeper.jaas -``` - -- 2、重启KS集群后再 start.out 中看到如下信息,则证明Kerberos配置成功; - -![success_1.png](assets/support_kerberos_zk/success_1.png) - -![success_2.png](assets/support_kerberos_zk/success_2.png) - - -### 5、补充说明 - -- 1、多Kafka集群如果用的是一样的Kerberos域的话,只需在每个`ZK`中给`kafka`用户配置`crdwa`权限即可,这样集群初始化的时候`zkclient`是都可以认证; -- 2、当前需要修改代码重新打包才可以支持,后续考虑通过页面支持Kerberos认证的ZK接入; -- 3、多个Kerberos域暂时未适配; \ No newline at end of file -- GitLab