kafka集群安全化之启用kerberos与acl
一、背景
在我們部署完kafka之后,雖然我們已經(jīng)可以“肆意”的用kafka了,但是在一個(gè)大公司的實(shí)際生產(chǎn)環(huán)境中,kafka集群往往十分龐大,每個(gè)使用者都應(yīng)該只關(guān)心自己所負(fù)責(zé)的Topic,并且對其他人所使用的Topic沒有權(quán)限。這樣一來可以將資源隔離開來,二來可以防止誤操作。
在權(quán)限控制之前,我們必須要啟用的就是用戶認(rèn)證,沒有用戶,自然沒有權(quán)限一說了。
二、kafka啟用kerberos認(rèn)證
2.1 在KDC中添加kafka用戶,并生成keytab
| 新建kfaka用戶 | kadmin.local -q 'addprinc -randkey kafka/{hostname}@{REALM}' |
| 生成keytab | kadmin.local -q "ktadd -k /etc/security/keytabs/{keytabname}.keytab kafka/{hostname}@{REALM}" |
?
?
注意:
1、如果之前zookeeper沒有啟用kerberos,這里也要啟用zookeeper的kerberos
2、如果之前在CM中啟用了kerberos,我們可以直接從CM中獲取keytab,但是注意keytab一定要保持最新的,否則認(rèn)證不會(huì)通過,keytab的位置是:
/var/run/cloudera-scm-agent/process/****-kafka-KAFKA_BROKER/kafka.keytab
/var/run/cloudera-scm-agent/process/****-zookeeper-server/zookeeper.keytab
?
2.2 修改server.properties
| //修改這一句 listeners=SASL_PLAINTEXT://host.name:port //新增以下 authorizer.class.name = kafka.security.auth.SimpleAclAuthorizer security.inter.broker.protocol=SASL_PLAINTEXT sasl.mechanism.inter.broker.protocol=GSSAPI sasl.enabled.mechanisms=GSSAPI sasl.kerberos.service.name=kafka super.users=User:kafka |
?
?
2.3 新建kafka_server.jaass
| KafkaServer { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true serviceName="kafka" keyTab="/etc/keytab/kafka_122.keytab" //替換為自己的keytab所在位置 principal="kafka/{hostname}@{REALM}";//替換為自己的keytab所對應(yīng)principle }; ? // Zookeeper client authentication,因?yàn)榭ǚ蚩ㄊ褂眠^程中會(huì)和zookeeper進(jìn)行交互 Client { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true serviceName="zookeeper" keyTab="/etc/keytab/kafka_122.keytab" //替換為自己的keytab所在位置 principal="kafka/{hostname}@{REALM}";//替換為自己的keytab所對應(yīng)principle }; |
?
2.4 修改啟動(dòng)腳本
| export KAFKA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka/config/kafka_server.jaas" //剛才的kafka_server.jaas位置 |
?
2.5重啟broker
| bin/kafka-server-stop.sh bin/kafka-server-start.sh |
?
2.6 客戶端啟用kerberos
在broker啟用kerberos之后,如果我們后續(xù)需要在命令行界面進(jìn)行操作,及consumer與producer操作,我們需要在這些客戶端也配置上kerberos
?
2.6.1新增kafka_client.jaas
| KafkaClient { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true keyTab="/etc/keytab/kafka_122.keytab" serviceName="kafka" principal="kafka/{hostname}@{REALM}"; }; ? // Zookeeper client authentication Client { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true serviceName="zookeeper" keyTab="/etc/keytab/kafka_122.keytab" principal="kafka/{hostname}@{REALM}"; }; ? |
?
2.6.2配置生效
| 當(dāng)前會(huì)話生效: export KAFKA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/opt/kafka/config/kafka_client.jaas" |
| 配置到環(huán)境變量中 vim /etc/profile 增加 export KAFKA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/opt/kafka/config/kafka_client.jaas" |
?
2.6.3若有用到consumer或者producer,在consumer.properties或producer.properties中增加
| security.protocol=SASL_PLAINTEXT sasl.mechanism=GSSAPI sasl.kerberos.service.name=kafka |
?
?
三、kafka啟用acl
Kafka認(rèn)證管理CLI(和其他的CLI腳本)可以在bin目錄中找到。CLI腳本名是kafka-acls.sh。啟用之前,需要在server.properties里添加這句:
?
| allow.everyone.if.no.acl.found=false |
?
?
?
四、MirrorMaker的跨域同步
4.1 修改kerberos配置
| 添加互信principle | kadmin.local下操作 addprinc krbtgt/{REALMA}@{REALMB} addprinc krbtgt/{REALMB}@{REALMA} |
| 修改krb5.conf | [realms]//realms 里配上兩個(gè)域的信息 HADOOP.SPADE.COM = { kdc = hb21-bd-cm-130-61:88 admin_server = hb21-bd-cm-130-61:749 } HADOOP.TEST.COM = { kdc = tk-dba-hadoop-152:88 admin_server = tk-dba-hadoop-152:749 } [domain_realm] //domain_realm 配上域名和主機(jī)名的映射,有多少機(jī)器就要配多少 tk-dba-hadoop-154 = HADOOP.TEST.COM hb21-dba-kfk-130-120 = HADOOP.SPADE.COM ? [capaths] //capaths 配上互信的域的映射 HADOOP.SAPDE.COM ={ HADOOP.TEST.COM = . } HADOOP.TEST.COM={ HADOOP.SPADE.COM = . } ? |
?
4.2 修改broker配置
添加sasl.kerberos.principal.to.local.rules屬性
| sasl.kerberos.principal.to.local.rules=RULE:[1:$1@$0](.*@\HADOOP.TEST.COM$)s/@\HADOOP.TEST.COM$//,RULE:[2:$1@$0](.*@\HADOOP.TEST.COM$)s/@\HADOOP.TEST.COM$//,RULE:[1:$1@$0](.*@\HADOOP.SPADE.COM$)s/@\HADOOP.SPADE.COM$//,RULE:[2:$1@$0](.*@\HADOOP.SPADE.COM$)s/@\HADOOP.SPADE.COM$//,DEFAULT |
?
4.3 驗(yàn)證互信是否成功
從域B中復(fù)制出keytab到域A的機(jī)器中,然后在A中使用該keytab,配置jaas文件,導(dǎo)入環(huán)境變量中。用該keytab操作集群A或者集群B中的topic,能正常寫入數(shù)據(jù)即為成功。
?
?
?
五、啟用kerberos之后的平滑過度期
生產(chǎn)環(huán)境啟用kerberos之后,為了給業(yè)務(wù)向的consumer和producer一個(gè)平滑的接入認(rèn)證系統(tǒng)的緩沖時(shí)間,這段時(shí)間我們可以給kafka啟用兩個(gè)監(jiān)聽端口,一個(gè)是需要kerberos認(rèn)證的端口,一個(gè)不需要認(rèn)證的端口。讓他們共同存在,同時(shí)服務(wù)。
5.1 增加監(jiān)聽端口
| 修改server.properties | listeners=SASL_PLAINTEXT://10.21.130.120:9092,PLAINTEXT://10.21.130.120:9093 allow.everyone.if.no.acl.found=false |
?
?
5.2 添加ANONYMOUS用戶的訪問權(quán)限
| bin/kafka-acls.sh --add --authorizer-properties zookeeper.connect={host:port/childpath} --allow-principal User:ANONYMOUS --allow-host * --operation All --topic {topicname} |
?
5.3 測試不同認(rèn)證方式共存成功與否
| 刪除jaas環(huán)境變量 | unset {變量名} |
| producer測試 | bin/kafka-console-producer.sh --broker-list {host}:9093 --topic{topicname} |
?
六、啟用zookeeper的acl同步
kafka的bin目錄下的zookeeper-security-migration.sh,可以將kafka的權(quán)限,遍歷賦給zookeeper中每個(gè)子節(jié)點(diǎn),然后分別設(shè)置acl,因?yàn)閦ookeeper的acl是僅對當(dāng)前節(jié)點(diǎn)生效,對其下節(jié)點(diǎn)不生效的,單獨(dú)賦權(quán)限很麻煩。zookeeper-security-migration.sh解決了這個(gè)問題。
?
| 修改server.properties,增加 zookeeper.set.acl=true |
| 重啟kafka集群(批量重啟或滾動(dòng)重啟) |
| 啟動(dòng)zookeeper-security-migration.sh腳本,secure設(shè)置同步,unsecure取消同步 bin/zookeeper-security-migration --zookeeper.acl=secure --zookeeper.connect={host}:{port}/{path} |
轉(zhuǎn)載于:https://www.cnblogs.com/felixzh/p/11506020.html
總結(jié)
以上是生活随笔為你收集整理的kafka集群安全化之启用kerberos与acl的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 配置两个不同kerberos认证中心的集
- 下一篇: Kafka跨集群迁移方案MirrorMa