全部產品
Search
文件中心

E-MapReduce:使用LDAP使用者鑒權

更新時間:Jul 01, 2024

本文為您介紹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使用者鑒權

  1. 建立super users。

    說明

    如果您已經建立好super user,則可以跳過此步驟。

    Kafka super user可以訪問Kafka的所有資源,本文super user使用者用於Broker節點以及組件之間的相互訪問。本文以EMR OpenLDAP服務為例,添加Kafka super user使用者。

    1. 通過SSH方式串連叢集master-1-1節點,詳情請參見登入叢集

    2. 建立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
    3. 執行以下命令,添加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
  2. 進入Kafka服務的配置頁面。

    1. 在頂部功能表列處,根據實際情況選擇地區和資源群組

    2. 單擊目的地組群操作列的叢集服務

    3. 叢集服務頁面,單擊Kafka服務地區的配置

  3. 修改配置項並儲存。

    1. 配置頁面,單擊server.properties頁簽。

    2. 修改配置項kafka.ssl.config.type的值為CUSTOM

    3. 修改配置項authorizer.class.name的值為kafka.security.ldap.authorizer.SimpleLdapAuthorizer

    4. 儲存配置項。

      1. 單擊儲存

      2. 在彈出的對話方塊中,輸入執行原因

  4. 新增自訂配置項並儲存。

    1. server.properties頁簽,單擊新增配置項

    2. 在新增配置項對話方塊中,添加以下配置。

      參數

      參數值

      說明

      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

    3. 修改其他配置項。

      您需要根據業務需求,修改以下配置。

      說明

      需要根據實際情況替換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

      如果該配置已經有參數值,則將新增的內容追加到已有的參數值之後。

  5. 重啟Kafka服務。

    1. 在Kafka服務的配置頁面,選擇更多操作 > 重啟

    2. 在彈出的對話方塊中,輸入執行原因,單擊確定

    3. 確認對話方塊中,單擊確定

使用樣本

本樣本操作適用於開源Kafka 2.4.1,其它版本的Kafka操作請參見Apache Kafka

  1. 建立測試使用者以及使用者組。

    1. 如果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。

      1. 執行命令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
      2. 執行命令vim refint1.ldif,新增設定檔refint1.ldif,檔案內容如下。

        dn: cn=module{0},cn=config
        add: olcmoduleload
        olcmoduleload: refint
      3. 執行命令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
      4. 執行以下命令,載入設定檔。

        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
    2. 建立測試使用者。

      通過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
    3. 建立測試使用者組。

      通過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
    4. 在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。

  2. 建立用戶端設定檔。

    1. 建立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";
    2. 建立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";
    3. 建立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";
  3. 建立名稱為test的測試Topic。

    kafka-topics.sh  --bootstrap-server core-1-1:9092 --command-config  client.properties --create --topic test --replication-factor 3 --partitions 2
  4. 授權操作。

    詳細的授權命令操作,請參見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: *
  5. 許可權驗證。

    • 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
      >d
    • kafka-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
      #正常消費資料