Kafka默认未开启SASL和ACL,若要开启,需要在broker端进行两方面设置,本示例在服务端配置,客户端使用go语言进行测试,使用"github.com/Shopify/sarama"操作kafka。
首先是创建包含所有认证用户信息的JAAS文件,在本例中,使用kafka的1.0.0版本,假设有3个用户admin、reader和writer,其中admin是集群管理员,reader是用户负责读取kafka集群中的topic数据,而writer用户则负责向kafka集群写入消息。
为简单超见,假设这3个用户的用户名与密码相同,因此需要编写JAAS文件:
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin"
user_admin="admin"
user_reader="reader"
user_writer="writer";
};
保存这个文件/opt/kafka/config/jaas.conf,需要把这个文件的完整路径作为一个JVM参数传递给kafka启动脚本,需要修改启动脚本bin/kafka-server-start.sh,具体做法如下:
# 备份启动脚本
cp bin/kafka-server-start.sh bin/acl-kafka-server-start.sh
# 修改启动脚本
vim bin/acl-kafka-server-start.sh
# 把文件中的这一行
exec $base_dir/kafka-run-class.sh $EXTRA_ARGS kafka.Kafka "$@"
# 修改为
exec $base_dir/kafka-run-class.sh $EXTRA_ARGS -Djava.security.auth.login.config=/opt/kafka/config/jaas.conf kafka.Kafka "$@"
做完上面步骤后,修改config/server.properties文件,添加如下参数,保存退出:
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
listeners=SASL_PLAINTEXT://:9092
advertised.listeners=SASL_PLAINTEXT://:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.enabled.mechanisms=PLAIN
sasl.mechanism.inter.broker.protocol=PLAIN
super.users=User:admin
现在启动broker服务器(前提是保证zookeeper已启动成功)
bin/acl-kafka-server-start.sh -daemon config/server.properties
如果一切正常,可以看到成功日志:
[KafkaServer id=191] started (kafka.server.KafkaServer)
这时使用go客户端链接,需要配置SASL:
var addrs = []string{"kafka01:9092"}
func NewClient() sarama.Client {
config := sarama.NewConfig()
config.Version = sarama.DefaultVersion
config.Metadata.Retry.Max = 5
config.Metadata.Retry.Backoff = 10 * time.Second
config.Net.SASL.Enable = true
config.Net.SASL.User = "admin"
config.Net.SASL.Password = "admin"
client, err := sarama.NewClient(addrs, config)
if err != nil {
panic(err)
}
return client
}
func TestTopic(t *testing.T) {
client := NewClient()
topics, err := client.Topics()
fmt.Println(topics, err)
}
下面开始创建topic,供后续使用:
kafka-topics.sh --zookeeper kafka01:2181 --create first --partitions 1 --replication-factor 1 --topic first
topic创建成功,为什么启用acl还是成功了?因为kafka-topic.sh脚本直连zookeeper,绕过了acl审查,故不受acl限制,所以无论是否配置acl,用户总是可以使用kafka-topics来管理topic。