自 0.9.0 (scala 2.0) 版本開始玫霎,Kafka 可以同時集成 SSL 和 Kerberos重归,前者用于傳輸加密至壤,后者用于身份認證鹏控。并且致扯,Kerberos 用戶可以選擇映射到本地 UnixShellUserGroup,該場景下需要 Unix 和 KDC 中都存在用戶信息才可以通過認證当辐。在認證后抖僵,超級用戶可以對 ACL 進行修改,實現(xiàn)對普通用戶的操作授權缘揪∷H海總得來看义桂,是這樣的:
關于協(xié)議的整合分為如下幾種組合:
SSL | Kerberos | |
---|---|---|
PLAINTEXT | No | No |
SSL | Yes | No |
SASL_PLAINTEXT | No | Yes |
SASL_SSL | Yes | Yes |
本文描述的是基于第三種方式——不進行傳輸加密的 Kerberos 認證的 ACL(ZK本身沒有開啟 Kerberos 認證),即如何在 CDH 5.8.2 集群中(Kafka 版本為 2.1.0-1.2.1.0.p0.115):
- 整合 SASL/Kerberos世吨;
- 開啟 ACL澡刹,并進行生產(chǎn)/消費授權測試;
不包括 TLS 傳輸加密的配置實施耘婚,以及 DDL 相關授權測試罢浇。
本文需要您有 Kerberos 相關知識,假設 CDH 本身還沒有集成 Kerberos沐祷,請參看:Step by Step 實現(xiàn)基于 Cloudera 5.8.2 的企業(yè)級安全大數(shù)據(jù)平臺 - Kerberos的整合嚷闭。
環(huán)境簡述
OS: CentOS 7.2
CDH: 5.8.2
Kafka: 2.1.0-1.2.1.0.p0.115(對應社區(qū) 0.10.0.0)
Kerberos: 5
操作用戶: admin
操作路徑(pwd):/home/admin
主機角色分布:
- KDC: 172.16.134.8
- Zookeeper Server / Kafka Broker: 172.16.134.2
- Kafka Client: 172.16.129.161
整合 SASL/Kerberos
在開始本部分之前需要確認 Kerberos 已經(jīng)完成安裝。開啟 Kafka SASL/Kerberos 的方式很簡單赖临,在 CM 管控頁面(通常由7180 https 或者7183 https 端口進入胞锰,比如本文是 https://172.16.134.2:7183 )可以方便完成。
Step1. 進入 Kafka Service 頁面兢榨;
Step2. 選擇 Configuration
選項卡嗅榕,進入配置頁面;
Step3. 按照 Kerberos
關鍵字進行配置項搜索吵聪,對 Enable Kerberos Authentication
和 Authenticate Zookeeper Connection
選項進行勾選凌那;
Step4. 重啟 Kafka;
和社區(qū)版本不同的是吟逝,不需要設置 Inter Broker Protocol = SASL_PLAINTEXT
帽蝶,因為默認就是和外部認證采取一樣的配置。
測試認證
以下操作在 Kafka Client 上操作(172.16.129.161)块攒。
安裝 Kerberos 客戶端:
sudo yum install -y krb5-devel krb5-workstation
修改 /etc/krb5.conf
配置文件励稳,使得可以訪問 KDC:
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = LWSITE.NET
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
[realms]
LWSITE.NET = {
kdc = 172.16.134.8
admin_server = 172.16.134.8
}
[domain_realm]
.lwsite.net = LWSITE.NET
lwsite.net = LWSITE.NET
在 Kerberos 中創(chuàng)建測試用的 principal:
kinit ${krb_admin_principal}
kadmin # 此處鍵入超級管理員密碼
> addprinc test/kafka_krb_user@LWSITE.NET # 新建用戶需要鍵入密碼
> exit
使用 ticket cache 方式進行認證:
kinit test/kafka_krb_user@LWSITE.NET
創(chuàng)建 /home/admin/jass.conf.client.ticket
文件用于認證方式申明,我們在這里使用的是 krb5LoginModule
:
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useTicketCache=true;
};
申明 KAFKA_OPTS
環(huán)境變量囱井,告訴客戶端我們的相關配置:
export KAFKA_OPTS="-Djava.security.auth.login.config=/home/admin/jaas.conf.client.ticket -Djava.security.krb5.conf=/etc/krb5.conf -Dsun.security.krb5.debug=true"
# 開啟debug是為了方便調試
創(chuàng)建測試用 topic:
kafka-topics --create --topic topic-test --replication-factor 1 --partitions 1 --zookeeper 172.16.134.2:2181
申明 /home/admin/client.properties
文件驹尼,用于協(xié)議相關配置,在生產(chǎn)和消費的時候都需要用到:
security.protocol=SASL_PLAINTEXT
sasl.kerberos.service.name=kafka
sasl.mechanism=GSSAPI
生產(chǎn)者測試:
kafka-console-producer --broker-list 172.16.134.2:9092 --topic topic-test --producer.config client.properties
消費者測試:
kafka-console-consumer --new-consumer --topic topic-test --from-beginning --bootstrap-server 172.16.134.2:9092 --consumer.config client.properties
開啟 ACL
在 5.8.2 版本中庞呕,沒有直接的配置可以進行開啟新翎,我們需要對 kafka.properties
文件進行修改,對應社區(qū)版本的 server.properties
文件千扶。
Step1. 進入 Kafka Service 頁面料祠;
Step2. 選擇 Configuration
選項卡骆捧,進入配置頁面澎羞;
Step3. 按照 Kafka Broker Advanced Configuration Snippet (Safety Valve) for kafka.properties
關鍵字進行配置項搜索,添加如下配置:
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
super.users=User:kafka
配置申明了認證實現(xiàn)類和超級用戶敛苇。
Step4. 重啟 Kafka妆绞;
需要表明顺呕,我們不對 Kerberos 進行本地 Unix 用戶映射。并且后續(xù)我們構造 producer/consumer 實例時候使用的用于認證的用戶名等價于 Kerberos principal 中的 primary name括饶,也就是 test/kafka_krb_user@LWSITE.NET
中的 test
株茶。
測試 ACL
生產(chǎn)者測試
以下操作在 Kafka Broker 上操作(172.16.134.2)。
首先我們必須使用之前申明的超級用戶 kafka
來進行 ACL 申明图焰,創(chuàng)建 /home/admin/jass.conf.admin
文件用于認證方式申明启盛,我們在這里使用的是 Krb5LoginModule
,ACL 相關接口必須走 keytab 方式認證技羔,否則會報錯:
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
principal="kafka/kafka_admin@LWSITE.NET"
keyTab="/tmp/kafka_kafka_admin.keytab";
};
Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
principal="kafka/kafka_admin@LWSITE.NET"
keyTab="/tmp/kafka_kafka_admin.keytab";
};
生成對應的 keytab僵闯,并保證運行命令的用戶有讀權限(生產(chǎn)環(huán)境推薦 keytab 文件權限 400) :
kinit ${krb_admin_principal}
kadmin # 此處鍵入超級管理員密碼
> addprinc -randkey kafka/kafka_krb_admin@LWSITE.NET
> ktadd -k /tmp/kafka_kafka_admin.keytab kafka/kafka_krb_admin@LWSITE.NET
> exit
清除上一節(jié)中生成的 ticket cache:
kdestroy
對 test 用戶進行寫賦權:
export KAFKA_OPTS="-Djava.security.auth.login.config=/home/admin/jaas.conf.admin -Djava.security.krb5.conf=/etc/krb5.conf -Dsun.security.krb5.debug=true"
kafka-acls --topic topic-test --add --operation Write --allow-host 172.16.129.161 --allow-principal User:test --authorizer-properties zookeeper.connect=172.16.134.2:2181
以下操作在 Kafka Client 上操作(172.16.129.161)。
創(chuàng)建 /home/admin/jass.conf.client.keytab
文件用于認證方式申明藤滥,我們在這里使用的是 krb5LoginModule
:
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
principal="test/kafka_krb_user@LWSITE.NET"
keyTab="/tmp/test_kafka_krb_user.keytab";
};
生成對應的 keytab鳖粟,并保證運行命令的用戶有讀權限(生產(chǎn)環(huán)境推薦 keytab 文件權限 400) :
kinit ${krb_admin_principal}
kadmin # 此處鍵入超級管理員密碼
> addprinc -randkey test/kafka_krb_user@LWSITE.NET
> ktadd -k /tmp/test_kafka_krb_user.keytab test/kafka_krb_user@LWSITE.NET
> exit
申明 KAFKA_OPTS
環(huán)境變量,告訴客戶端我們的相關配置:
export KAFKA_OPTS="-Djava.security.auth.login.config=/home/admin/jaas.conf.client.keytab -Djava.security.krb5.conf=/etc/krb5.conf -Dsun.security.krb5.debug=true"
# 開啟debug是為了方便調試
復用上一節(jié)中的 client.properties
文件拙绊,使用 test 用戶進行寫測試:
kafka-console-producer --broker-list 172.16.134.2:9092 --topic topic-test --producer.config client.properties
沒有異常則表示寫入成功向图。
消費者測試
以下操作在 Kafka Broker 上操作(172.16.134.2),對 test 用戶進行讀賦權:
export KAFKA_OPTS="-Djava.security.auth.login.config=/home/admin/jaas.conf.admin -Djava.security.krb5.conf=/etc/krb5.conf -Dsun.security.krb5.debug=true"
kafka-acls --consumer --group group-test --topic topic-test --add --allow-host 172.16.129.161 --allow-principal User:test --authorizer-properties zookeeper.connect=172.16.134.2:2181
以下操作在 Kafka Client 上操作(172.16.129.161)标沪。
修改 client.properties
在最后添加一行:
group.id=group-test
測試讀:
kafka-console-consumer --new-consumer --topic topic-test --from-beginning --bootstrap-server 172.16.134.2:9092 --consumer.config client.properties
參考文獻
[1] Configuring Kafka Security https://www.cloudera.com/documentation/kafka/latest/topics/kafka_security.html
[2] Apache Kafka Security 101 https://www.confluent.io/blog/apache-kafka-security-authorization-authentication-encryption/