Golang连接Kerberos认证的Kafka

在使用Golang连接Kerberos认证的Kafka时遇到问题,具体报错是"GSSAPI error: Unspecified GSS failure"。我的配置如下:使用了confluent-kafka-go库,已经正确设置了sasl.kerberos.service.name和sasl.kerberos.keytab等参数。环境是CentOS 7,已经通过kinit成功获取了Kerberos票据。请问可能是什么原因导致认证失败?是否需要额外的配置或检查Kerberos的哪些方面?

2 回复

使用Golang连接Kerberos认证的Kafka,可以通过Sarama库配合GSSAPI认证实现。以下是基本步骤:

  1. 安装依赖

    • 安装Sarama:go get github.com/Shopify/sarama
    • 确保系统已安装Kerberos客户端(如MIT Kerberos)
  2. 配置Kerberos

    • 准备krb5.conf和Keytab文件,或使用用户名/密码认证
  3. 代码示例

    import "github.com/Shopify/sarama"
    
    func main() {
        config := sarama.NewConfig()
        config.Net.SASL.Enable = true
        config.Net.SASL.Mechanism = sarama.SASLTypeGSSAPI
        config.Net.SASL.GSSAPI = sarama.GSSAPIConfig{
            AuthType:           sarama.KRB5_KEYTAB_AUTH, // 或 KRB5_USER_AUTH
            KeyTabPath:         "/path/to/keytab",
            KerberosConfigPath: "/etc/krb5.conf",
            ServiceName:        "kafka",
            Username:           "your-username",
            Realm:              "YOUR-REALM",
        }
    
        producer, err := sarama.NewSyncProducer([]string{"kafka-broker:9092"}, config)
        // 处理错误及后续操作
    }
    
  4. 注意事项

    • 确保Kerberos TGT有效(使用kinit或代码自动刷新)
    • 服务名(ServiceName)需与Kafka配置的sasl.kerberos.service.name一致

此方法适用于企业级安全环境,需提前协调Kerberos管理员获取凭据。

更多关于Golang连接Kerberos认证的Kafka的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中连接使用Kerberos认证的Kafka,可以使用confluent-kafka-go库配合GSSAPI配置。以下是具体步骤和示例代码:

1. 安装依赖

go get -u github.com/confluentinc/confluent-kafka-go/kafka

2. 配置Kerberos

确保系统已配置Kerberos,并获取有效TGT:

kinit -k -t /path/to/keytab principal@REALM

3. 示例代码

package main

import (
	"fmt"
	"log"
	"github.com/confluentinc/confluent-kafka-go/kafka"
)

func main() {
	config := &kafka.ConfigMap{
		"bootstrap.servers": "kafka-broker:9093",
		"security.protocol": "SASL_PLAINTEXT",
		"sasl.kerberos.service.name": "kafka",
		"sasl.kerberos.principal":    "kafka-client@EXAMPLE.COM",
		"sasl.kerberos.keytab":       "/path/to/client.keytab",
		// 或使用以下配置代替keytab(如果使用ccache):
		// "sasl.kerberos.use.ticket.cache": true,
	}

	producer, err := kafka.NewProducer(config)
	if err != nil {
		log.Fatal("Failed to create producer:", err)
	}
	defer producer.Close()

	// 发送消息示例
	topic := "test-topic"
	message := &kafka.Message{
		TopicPartition: kafka.TopicPartition{Topic: &topic, Partition: kafka.PartitionAny},
		Value:          []byte("Hello Kerberos Kafka"),
	}

	err = producer.Produce(message, nil)
	if err != nil {
		log.Fatal("Failed to produce message:", err)
	}

	fmt.Println("Message sent successfully")
}

4. 关键配置说明

  • security.protocol: 使用SASL_PLAINTEXTSASL_SSL
  • sasl.kerberos.service.name: Kafka服务Principal中的服务名(通常为kafka
  • sasl.kerberos.principal: 客户端Principal
  • sasl.kerberos.keytab: Keytab文件路径(推荐)
  • sasl.kerberos.use.ticket.cache: 使用票据缓存(如已kinit)

5. 注意事项

  • 确保Kerberos配置正确(/etc/krb5.conf
  • 网络需能访问KDC和Kafka Broker
  • 生产环境建议使用SSL加密(SASL_SSL

此配置适用于使用Kerberos认证的Kafka集群,可根据实际环境调整Principal和服务器地址。

回到顶部