在 Docker 中安装 Kafka 并配置 SASL(Simple Authentication and Security Layer) 进行身份验证,能够确保 Kafka 集群的安全性。SASL 是一种常见的认证机制,Kafka 支持多种 SASL 协议,常见的有:
- SASL/PLAIN:使用用户名和密码进行简单认证。
- SASL/SCRAM:比 PLAIN 更安全,使用加密的存储机制。
- SASL/GSSAPI (Kerberos):使用 Kerberos 进行安全认证。
在本示例中,我们将使用 SASL/PLAIN 配置 Kafka,并通过 Docker 运行 Kafka。
步骤 1:准备 Docker 环境
确保你已经安装了 Docker,并且拉取了 Kafka 和 Zookeeper 的镜像。
docker pull wurstmeister/zookeeper
docker pull wurstmeister/kafka
步骤 2:配置 Zookeeper 和 Kafka 使用 Docker-Compose
我们将使用 docker-compose.yml
文件来配置 Kafka 和 Zookeeper。你可以使用如下的 docker-compose.yml
文件。
services:zookeeper:image: wurstmeister/zookeepervolumes:- ./zookeeper/zookeeper_jaas.conf:/opt/zookeeper-3.4.13/zookeeper_jaas.conf- ./zookeeper/zoo.cfg:/opt/zookeeper-3.4.13/conf/zoo.cfgcontainer_name: zookeeperenvironment:ZOOKEEPER_CLIENT_PORT: 2181ZOOKEEPER_TICK_TIME: 2000SERVER_JVMFLAGS: -Djava.security.auth.login.config=/opt/secrets/zookeeper_jaas.confports:- 2181:2181restart: alwayskafka:image: wurstmeister/kafkacontainer_name: kafkadepends_on:- zookeeperports:- 9092:9092volumes:- ./secrets/:/opt/secrets/environment:KAFKA_BROKER_ID: 0KAFKA_ADVERTISED_LISTENERS: SASL_PLAINTEXT://localhost:9092KAFKA_ADVERTISED_PORT: 9092KAFKA_LISTENERS: SASL_PLAINTEXT://0.0.0.0:9092KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_PLAINTEXTKAFKA_PORT: 9092KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAINKAFKA_SASL_ENABLED_MECHANISMS: PLAINKAFKA_AUTHORIZER_CLASS_NAME: kafka.security.auth.SimpleAclAuthorizerKAFKA_SUPER_USERS: User:adminKAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: "true" #设置为true,ACL机制为黑名单机制,只有黑名单中的用户无法访问,默认为false,ACL机制为白名单机制,只有白名单中的用户可以访问KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0KAFKA_HEAP_OPTS: "-Xmx512M -Xms16M"KAFKA_OPTS: -Djava.security.auth.login.config=/opt/secrets/server_jaas.conf
步骤 3:配置 JAAS 文件
Kafka的 JAAS 配置(kafka_server_jaas.conf
)
Kafka 的 SASL 需要通过 Java Authentication and Authorization Service (JAAS) 配置认证机制。你需要创建 kafka_server_jaas.conf
文件,并指定认证的用户名和密码。
touch kafka_server_jaas.conf
在 kafka_server_jaas.conf
中添加以下内容:
KafkaServer {org.apache.kafka.common.security.plain.PlainLoginModule requiredusername="admin"password="123456" user_admin="123456";
};KafkaClient {org.apache.kafka.common.security.plain.PlainLoginModule requiredusername="admin"password="123456";
};
KafkaServer
: 定义了 Kafka 服务器的认证模块。username
和password
: 为 Kafka 自己的身份信息,用于 Broker 之间的认证。user_admin="admin-secret"
和user_user1="user1-secret"
:定义了允许连接 Kafka 的用户及其密码(例如admin
和user1
)。Client
:用于 Kafka 作为 Zookeeper 客户端时的身份验证配置。
Zookeeper 的 JAAS 配置 (zookeeper_jaas.conf
)
Zookeeper 也需要配置 SASL 认证。创建 zookeeper_jaas.conf
文件:
Client {org.apache.zookeeper.server.auth.DigestLoginModule requiredusername="admin"password="123456";
};Server {org.apache.zookeeper.server.auth.DigestLoginModule requiredusername="admin"password="123456"user_admin="123456";
};
步骤 4. 启动 Kafka 和 Zookeeper 服务
使用以下命令启动 Kafka 和 Zookeeper:
docker-compose up -d
此命令将以后台模式启动所有服务。你可以使用 docker ps
命令确认容器是否启动成功。
步骤 5. 测试 Kafka 和 SASL 认证
5.1. 使用 Kafka CLI 工具验证
Kafka 启动后,可以通过 Kafka 自带的命令行工具来测试 SASL 认证是否生效。
首先,创建一个主题:
docker exec -it <kafka-container-id> kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --command-config /opt/secrets/server_jaas.conf
接着,验证生产者和消费者是否正常工作:
生产消息:
docker exec -it <kafka-container-id> kafka-console-producer --broker-list localhost:9093 --topic test-topic --producer.config /etc/kafka/kafka_server_jaas.conf
消费消息:
docker exec -it <kafka-container-id> kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --from-beginning --consumer.config /opt/secrets/server_jaas.conf
通过 --producer.config
和 --consumer.config
参数指定使用 SASL 认证配置。
步骤 6. 验证日志
检查 Kafka 和 Zookeeper 的日志,确认是否有身份认证相关的错误:
docker logs <kafka-container-id> docker logs <zookeeper-container-id>
确保没有身份验证失败的错误信息。
总结
通过上述步骤,你可以使用 Docker 安装 Kafka 和 Zookeeper 并配置 SASL 认证机制。这个配置将确保 Kafka 和 Zookeeper 的通信通过 SASL/PLAIN 认证进行。通过 Docker Compose 可以轻松启动和管理 Kafka 集群,并保证高效的部署。