本文為您介紹EMR Kafka如何啟用LDAP使用者進行鑒權,以及詳細使用的樣本。
前提條件
已建立DataFlow叢集,且選擇了Kafka和OpenLDAP服務。建立叢集詳情,請參見建立DataFlow Kafka叢集。
使用限制
適用於EMR-3.44.0之後版本、EMR-5.10.0之後版本的EMR Kafka叢集。
叢集中已有EMR OpenLDAP服務或者外部LDAP服務。
本文以EMR OpenLDAP服務為例。
注意事項
如果需要使用使用者組鑒權,則需要確保LDAP服務啟用memberOf overlay特性,或者LDAP使用者支援memberOf屬性設定。
啟用LDAP使用者鑒權
建立super users。
說明如果您已經建立好super user,則可以跳過此步驟。
Kafka super user可以訪問Kafka的所有資源,本文super user使用者用於Broker節點以及組件之間的相互訪問。本文以EMR OpenLDAP服務為例,添加Kafka super user使用者。
通過SSH方式串連叢集master-1-1節點,詳情請參見登入叢集。
建立kafka.ldif檔案,檔案內容如下。
本文是通過
ldap命令,添加uid為kafka,密碼為kafka-secret的LDAP使用者。dn: uid=kafka,ou=people,o=emr cn: kafka sn: kafka objectClass: inetOrgPerson userPassword: kafka-secret uid: kafka執行以下命令,添加LDAP使用者。
ldapadd -H ldap://master-1-1:10389 -f kafka.ldif -D ${uid} -w ${rootDnPW}說明${uid}:為EMR控制台OpenLDAP服務配置頁面admin_dn的參數值。${rootDnPW}:為EMR控制台OpenLDAP服務配置頁面admin_pwd的參數值。10389:為OpenLDAP服務的監聽連接埠。
添加成功後,您可以執行以下命令,查看該LDAP使用者資訊。
ldapsearch -w ${rootDnPW} -D ${uid} -H ldap://master-1-1:10389 -b uid=kafka,ou=people,o=emr
進入Kafka服務的配置頁面。
在頂部功能表列處,根據實際情況選擇地區和資源群組。
單擊目的地組群操作列的叢集服務。
在叢集服務頁面,單擊Kafka服務地區的配置。
修改配置項並儲存。
在配置頁面,單擊server.properties頁簽。
修改配置項kafka.ssl.config.type的值為CUSTOM。
修改配置項authorizer.class.name的值為kafka.security.ldap.authorizer.SimpleLdapAuthorizer。
儲存配置項。
單擊儲存。
在彈出的對話方塊中,輸入執行原因。
新增自訂配置項並儲存。
在server.properties頁簽,單擊新增配置項。
在新增配置項對話方塊中,添加以下配置。
參數
參數值
說明
super.users
User:kafka
kafka為已建立好的使用者名稱,請根據實際情況替換。建立使用者詳情,請參見步驟1。
listener.name.${listener}.sasl.enabled.mechanisms
PLAIN
${listener}需要替換成具體的listener的名稱,例如sasl_ssl。
listener.name.${listener}.plain.sasl.jaas.config
org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka" password="kafka-secret" emr.kafka.security.ldap.user.name.attribute="uid" emr.kafka.security.ldap.user.base.dn="ou=people,o=emr" emr.kafka.security.ldap.group.name.attribute="cn" emr.kafka.security.ldap.group.base.dn="ou=groups,o=emr" emr.kafka.security.ldap.admin.name.attribute="uid" emr.kafka.security.ldap.admin.base.dn="o=emr" emr.kafka.security.ldap.url="ldaps://master-1-1:10636" emr.kafka.security.ldap.bind.user="admin" emr.kafka.security.ldap.bind.user.password="WMMuhh3P**********" emr.kafka.security.ldap.user.member.of.attribute="memberOf" emr.kafka.security.ldap.group.authorization.support="true" ;${listener}需要替換成具體的listener的名稱,例如sasl_ssl。
參數值也應根據實際情況替換LDAP的相關配置:
username:需要使用super user,Kafka服務使用該使用者進行節點間訪問。mr.kafka.security.ldap.user.name.attribute:LDAP使用者名稱稱屬性,用於擷取使用者名稱。emr.kafka.security.ldap.user.base.dn:LDAP使用者base dn。emr.kafka.security.ldap.group.name.attribute:LDAP使用者組名稱屬性,用於擷取使用者組名稱。
emr.kafka.security.ldap.group.base.dn:LDAP使用者組base dn。emr.kafka.security.ldap.admin.name.attribute:LDAP admin使用者屬性。emr.kafka.security.ldap.admin.base.dn:LDAP admin使用者base dn。emr.kafka.security.ldap.url:LDAP URL。emr.kafka.security.ldap.bind.use:LDAP管理使用者名稱,用於使用者組鑒權使用。emr.kafka.security.ldap.bind.user.password:LDAP管理使用者密碼。emr.kafka.security.ldap.user.member.of.attribute:使用者所屬組的屬性,用於擷取使用者所屬組。emr.kafka.security.ldap.group.authorization.support:是否支援組鑒權。如果支援,則當使用者所屬組有許可權時,該使用者繼承組的許可權。
listener.name.${listener}.plain.sasl.server.callback.handler.class
kafka.security.ldap.authenticator.LdapAuthenticateCallbackHandler
${listener}需要替換成具體的listener的名稱,例如sasl_ssl。
sasl.mechanism.inter.broker.protocol
PLAIN
無
sasl.enabled.mechanisms
PLAIN
無
修改其他配置項。
您需要根據業務需求,修改以下配置。
說明需要根據實際情況替換kafka.client.jaas.content參數值中的使用者名稱和密碼,建議使用super user使用者。
設定檔
參數
參數值
說明
kafka_client_jaas.conf
kafka.client.jaas.content
KafkaClient { org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka" password="kafka-secret"; };末尾需要有英文分號(;)。
schema-registry.properties
schema_registry_opts
-Djava.security.auth.login.config=/etc/taihao-apps/kafka-conf/kafka-conf/kafka_client_jaas.conf如果該配置已經有參數值,則將新增的內容追加到已有的參數值之後。
kafka-rest.properties
kafkarest_opts
-Djava.security.auth.login.config=/etc/taihao-apps/kafka-conf/kafka-conf/kafka_client_jaas.conf如果該配置已經有參數值,則將新增的內容追加到已有的參數值之後。
重啟Kafka服務。
在Kafka服務的配置頁面,選擇。
在彈出的對話方塊中,輸入執行原因,單擊確定。
在確認對話方塊中,單擊確定。
使用樣本
本樣本操作適用於開源Kafka 2.4.1,其它版本的Kafka操作請參見Apache Kafka。
建立測試使用者以及使用者組。
如果OpenLdap沒有開啟memberOf overlay特性,則需要開啟此功能。
說明以下配置方式只作為參考,不同的LDAP服務,開啟memberOf overlay的方式不同。
需要在所有OpenLDAP節點下配置生效。
以下所有設定檔的參數請根據實際情況修改,例如:
olcModulepath:32位OS系統為/usr/lib/openldap。dn: cn=module{0},cn=config:如果/etc/openldap/slapd.d/cn=config目錄下已經存在cn=module{0}.ldif檔案,則需要修改module後面的數字為1;如果存在cn=module{1}.ldif,則需要修改module後面的數字為2,以此類推。dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config:根據/etc/openldap/slapd.d/cn=config目錄olcDatabase的值來配置相應的值。例如,如果存在olcDatabase={2}hdb.ldif,則此處的值應為hdb。
執行命令
vim memberof_config.ldif,新增設定檔memberof_config.ldif,檔案內容如下。dn: cn=module{0},cn=config cn: module{0} objectClass: olcModuleList objectclass: top olcModuleload: memberof.la olcModulePath: /usr/lib64/openldap dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config objectClass: olcConfig objectClass: olcMemberOf objectClass: olcOverlayConfig objectClass: top olcOverlay: memberof olcMemberOfDangling: ignore olcMemberOfRefInt: TRUE olcMemberOfGroupOC: groupOfNames olcMemberOfMemberAD: member olcMemberOfMemberOfAD: memberOf執行命令
vim refint1.ldif,新增設定檔refint1.ldif,檔案內容如下。dn: cn=module{0},cn=config add: olcmoduleload olcmoduleload: refint執行命令
vim refint2.ldif,新增設定檔refint2.ldif,檔案內容如下。dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config objectClass: olcConfig objectClass: olcOverlayConfig objectClass: olcRefintConfig objectClass: top olcOverlay: refint olcRefintAttribute: memberof member manager owner執行以下命令,載入設定檔。
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f memberof_config.ldif ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f refint1.ldif ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint2.ldif
建立測試使用者。
通過ldapadd命令的方式添加測試使用者。ldif檔案命名為kafka-users.ldif,檔案內容如下。
dn: uid=kafka-user1,ou=people,o=emr cn: kafka-user1 sn: kafka-user1 uid: kafka-user1 objectClass: inetOrgPerson userPassword: kafka-secret dn: uid=kafka-user2,ou=people,o=emr cn: kafka-user2 sn: kafka-user2 uid: kafka-user2 objectClass: inetOrgPerson userPassword: kafka-secret建立測試使用者組。
通過ldapadd命令的方式添加測試使用者組。ldif檔案命名為kafka-groups.ldif,檔案內容如下。
dn: cn=kafka-group1,ou=groups,o=emr cn: kafka-group1 objectClass: groupOfNames member: uid=kafka-user1,ou=people,o=emr member: uid=kafka-user2,ou=people,o=emr dn: cn=kafka-group2,ou=groups,o=emr cn: kafka-group2 objectClass: groupOfNames member: uid=kafka-user1,ou=people,o=emr在LDAP所在伺服器執行以下命令,查看測試使用者memberOf屬性。
ldapsearch -Q -Y EXTERNAL -H ldapi:/// -b ou=people,o=emr memberOf根據返回資訊,可以看見kafka-user1的memberOf屬性包含kafka-group1和kafka-group2,kafka-user2的memberOf屬性包含kafka-group2。
建立用戶端設定檔。
建立client.properties用戶端設定檔,內容如下所示。
security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN #根據不同的用戶端身份,替換username以及password。 sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka" password="kafka-secret";建立kafka-user1.properties用戶端設定檔,內容如下所示。
security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN #根據不同的用戶端身份,替換username以及password sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka-user1" password="kafka-secret";建立kafka-user2.properties用戶端設定檔,內容如下所示。
security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN #根據不同的用戶端身份,替換username以及password sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka-user2" password="kafka-secret";
建立名稱為test的測試Topic。
kafka-topics.sh --bootstrap-server core-1-1:9092 --command-config client.properties --create --topic test --replication-factor 3 --partitions 2授權操作。
詳細的授權命令操作,請參見Authorization and ACLs。
#kafka-group2許可權 kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --allow-principal User:kafka-group2 --allow-host "*" --operation All --cluster kafka-cluster kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --allow-principal User:kafka-group2 --allow-host "*" --operation All --topic test #kafka-group1許可權 kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --deny-principal User:kafka-group1 --deny-host "*" --operation All --topic test #kafka-user1許可權 kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --deny-principal User:kafka-user1 --deny-host "*" --operation Read --topic test #kafka-user2許可權 kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --allow-principal User:kafka-user2 --allow-host "*" --operation Read --topic test您可以執行以下命令,查看授權結果。
kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --list --topic test返回資訊如下所示。
Current ACLs for resource `Topic:LITERAL:test`: User:kafka-group2 has Allow permission for operations: All from hosts: * User:kafka-user2 has Allow permission for operations: Read from hosts: * User:kafka-user1 has Deny permission for operations: Read from hosts: * User:kafka-group1 has Deny permission for operations: All from hosts: *許可權驗證。
kafka-user1通過kafka-group2可以寫test。
kafka-console-producer.sh --broker-list core-1-1:9092 --producer.config ./kafka-user1.properties --topic test在提示符後輸入測試訊息,可以訪問test。
#提示符後輸入測試訊息 >a >b >c >dkafka-user1不能讀test。
#授權consumer group kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --allow-principal User:kafka-user1 --allow-host "*" --operation All --group kka-user1-consumer kafka-console-consumer.sh --bootstrap-server core-1-1:9092 --consumer.config ./kafka-user1.properties --topic test --group kafka-user1-consumer輸出結果提示鑒權不通過無法訪問test。
kafka-user2不能寫test。
kafka-console-producer.sh --broker-list core-1-1:9092 --producer.config ./kafka-user2.properties --topic test #提示符後輸入測試訊息 >a #提示鑒權不通過輸出結果提示鑒權不通過。
kafka-user2可以讀test。
#授權consumer group kafka-acls.sh --authorizer-properties zookeeper.connect=$KAFKA_ZOOKEEPER --add --allow-principal User:kafka-user2 --allow-host "*" --operation All --group kafka-user2-consumer kafka-console-consumer.sh --bootstrap-server core-1-1:9092 --consumer.config ./kafka-user2.properties --topic test --group kafka-user2-consumer --from-beginning #正常消費資料