1

我們剛剛從CDH 5.3.6升級到5.10.0,並在嘗試寫入Kafka主題時開始出現錯誤。我們有一切默認設置,沒有啓用SSL或Kerberos身份驗證。當使用控制檯生產者寫我的話題之一,我得到這個錯誤:Cloudera上的Kafka - test = TOPIC_AUTHORIZATION_FAILED

/usr/bin/kafka-console-producer --broker-list = myhost1.dev.com:9092,myhost2.dev。 COM:9092 --topic測試

17/03/06 21:00:57 INFO utils.AppInfoParser: Kafka version : 0.10.0-kafka-2.1.0 
17/03/06 21:00:57 INFO utils.AppInfoParser: Kafka commitId : unknown 
x 
17/03/06 21:00:59 WARN clients.NetworkClient: Error while fetching metadata with correlation id 0 : {test=TOPIC_AUTHORIZATION_FAILED} 

尋找位於/ var /日誌/卡夫卡/,我看到一堆這些異常:

2017-03-06 21:00:26,964 WARN org.apache.sentry.provider.common.HadoopGroupMappingService: Unable to obtain groups for ANONYMOUS 
java.io.IOException: No groups found for user ANONYMOUS 
    at org.apache.hadoop.security.Groups.noGroupsForUser(Groups.java:190) 
    at org.apache.hadoop.security.Groups.getGroups(Groups.java:210) 
    at org.apache.sentry.provider.common.HadoopGroupMappingService.getGroups(HadoopGroupMappingService.java:60) 
    at org.apache.sentry.provider.common.ResourceAuthorizationProvider.getGroups(ResourceAuthorizationProvider.java:167) 
    at org.apache.sentry.provider.common.ResourceAuthorizationProvider.doHasAccess(ResourceAuthorizationProvider.java:97) 
    at org.apache.sentry.provider.common.ResourceAuthorizationProvider.hasAccess(ResourceAuthorizationProvider.java:91) 
    at org.apache.sentry.kafka.binding.KafkaAuthBinding.authorize(KafkaAuthBinding.java:212) 
    at org.apache.sentry.kafka.authorizer.SentryKafkaAuthorizer.authorize(SentryKafkaAuthorizer.java:63) 
    at kafka.server.KafkaApis$$anonfun$kafka$server$KafkaApis$$authorize$2.apply(KafkaApis.scala:321) 
    at kafka.server.KafkaApis$$anonfun$kafka$server$KafkaApis$$authorize$2.apply(KafkaApis.scala:321) 
    at scala.Option.map(Option.scala:146) 
    at kafka.server.KafkaApis.kafka$server$KafkaApis$$authorize(KafkaApis.scala:321) 
    at kafka.server.KafkaApis$$anonfun$30.apply(KafkaApis.scala:702) 
    at kafka.server.KafkaApis$$anonfun$30.apply(KafkaApis.scala:702) 
    at scala.collection.TraversableLike$$anonfun$partition$1.apply(TraversableLike.scala:314) 
    at scala.collection.TraversableLike$$anonfun$partition$1.apply(TraversableLike.scala:314) 
    at scala.collection.immutable.Set$Set1.foreach(Set.scala:94) 
    at scala.collection.TraversableLike$class.partition(TraversableLike.scala:314) 
    at scala.collection.AbstractTraversable.partition(Traversable.scala:104) 
    at kafka.server.KafkaApis.handleTopicMetadataRequest(KafkaApis.scala:702) 
    at kafka.server.KafkaApis.handle(KafkaApis.scala:79) 
    at kafka.server.KafkaRequestHandler.run(KafkaRequestHandler.scala:60) 
    at java.lang.Thread.run(Thread.java:745) 

我一直在尋找一個解決的辦法,但到目前爲止已空無一人。我是否需要將ANONYMOUS用戶分配給某個組?我能夠在CDH 5.3.6中將消息寫入我的主題,但升級時出現問題。

試圖讓helloWorld/Quickstart例子在升級到CDH 5.10.0後再次在我們的DEV Kafka上工作。

-----------------臨時解決方法解決方案---

在Cloudera的經理5.10沒有在卡夫卡配置的super.users屬性。將匿名添加到該列表中,允許我從我的主題中製作和使用。

我已經嘗試在/opt/cloudera/parcels/KAFKA-2.1.0-1.2.1.0.p0.115/etc/kafka/conf.dist/server.properties中執行此操作,該操作無效。所以Cloudera必須在其他地方管理這些價值。

+0

您可以檢查您爲_authorizer.class.name_設置的值嗎?如果沒有配置Kerberos或SSL,如果在此處設置了某些內容,仍可以強制執行A​​CL,但是每個連接的用戶都將被認證爲「匿名」,這是您在日誌中可以看到的內容。 –

+0

我修改了/opt/cloudera/parcels/KAFKA-2.1.0-1.2.1.0.p0.115/etc/kafka/conf.dist/server.properties以擁有此行:authorizer.class.name = kafka.security。 auth.SimpleAclAuthorizer但它似乎並不重要,我甚至不確定這是否是正確的文件,或者如何驗證更改是否生效。 – medloh

+0

是的,那裏拉是什麼造成這個(不知道該文件,但似乎適合)。通過該行,您可以告訴Kafka將ACL應用於所有連接嘗試 - 所有這些都將與「ANONYMOUS」無關。我建議刪除該行,一切都應該工作。或者,你可以在配置中將ANONYMOUS設置爲超級用戶,它應該具有相同的效果,但不提供任何額外的安全性,所以不是非常有用的imo。 –

回答

1

卡夫卡嚴格區分認證和授權之間 - 即使你通過路邊有認證或SSL開啓的,仍然可以通過以下參數打開授權於:

authorizer.class.name=kafka.security.auth.SimpleAclAuthorize‌​r 

這將使卡夫卡檢查的ACL爲每次訪問 - 因爲在您的情況下身份驗證已轉爲開啓,但每個用戶都將被評估爲ANONYMOUS並被拒絕(如果沒有爲此用戶設置ACL)。

您可以從您的配置中刪除該設置,這會使卡夫卡返回到舊的,信任的自我。我不確定你會在Cloudera Manager中做到這一點,所以另一種方法是將ANONYMOUS添加到CM中可用的超級用戶列表中。或者當然只是定義一個ACL以允許訪問ANONYMOUS

對於稍後的生產用途,您應該設置SSL或Kerberos,並且如果有任何機會從外部訪問羣集,請定義適當的ACL。