الاتصال بكافكا باستخدام SASL/SSL
يسرد هذا الدليل عدة طرق لتوصيل ميلفوس بكافكا، من أبسط الطرق بدون SASL/SSL إلى الطريقة المؤمنة بالكامل باستخدام SASL/SSL.
وصل ميلفوس بكافكا بدون SASL/SSL
لبدء تشغيل ميلفوس وكافكا بدون SASL/SSL، يمكنك تعطيل المصادقة والتشفير لكل من كافكا وميلفوس. استخدمها فقط في بيئة موثوقة.
1. ابدأ خدمة كافكا بدون SASL/SSL
يمكنك استخدام ملف docker-compose.yaml
التالي لبدء خدمة كافكا بدون SASL/SSL:
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper:latest
container_name: zookeeper
ports:
- 2181:2181
restart: always
kafka:
image: wurstmeister/kafka:latest
container_name: kafka
ports:
- 9092:9092
environment:
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
- KAFKA_LISTENERS=PLAINTEXT://:9092
volumes:
- /var/run/docker.sock:/var/run/docker.sock
restart: always
ثم يمكنك بدء خدمة كافكا باستخدام الأمر التالي:
$ docker compose up -d
2. بدء تشغيل ميلفوس والاتصال بكافكا
بمجرد بدء تشغيل خدمة كافكا، يمكنك بدء تشغيل ميلفوس والاتصال بها. استخدم الملف التالي docker-compose.yaml
لبدء تشغيل ميلفوس والاتصال بكافكا بدون SASL/SSL:
version: '3.5'
services:
etcd:
......
minio:
......
standalone:
container_name: milvus-standalone
......
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
- ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
استخدم الأمر التالي لتنزيل قالب ملف تهيئة ميلفوس:
$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
وقم بتعيين المعلمات التالية:
mq:
type: kafka
kafka:
brokerList: "127.0.0.1:9092"
saslUsername:
saslPassword:
saslMechanisms:
securityProtocol:
readTimeout: 10 # read message timeout in seconds
ssl:
enabled: false # Whether to support kafka secure connection mode
tlsCert:
tlsKey:
tlsCACert:
tlsKeyPassword:
ثم يمكنك بدء تشغيل ميلفوس باستخدام الأمر التالي:
$ docker compose up -d
قم بتوصيل ميلفوس بكافكا باستخدام SASL/PLAIN وحده
لبدء تشغيل كافكا بمصادقة SASL/PLAIN، تحتاج إلى إضافة ملف kafka_server_jass.conf
بالإعدادات المناسبة.
1. ابدأ خدمة كافكا باستخدام SASL/PLAIN
ضع الملف التالي docker-compose.yaml
والملف kafka_server_jaas.conf
في نفس الدليل.
version: '3'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
container_name: zookeeper
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 2181:2181
kafka:
image: confluentinc/cp-kafka:latest
container_name: kafka
depends_on:
- zookeeper
ports:
- 9092:9092
- 9093:9093
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
ZOOKEEPER_SASL_ENABLED: "false"
KAFKA_ADVERTISED_LISTENERS: SASL_PLAINTEXT://localhost:9093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_PLAINTEXT:SASL_PLAINTEXT
KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_PLAINTEXT
KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN
KAFKA_SASL_ENABLED_MECHANISMS: PLAIN
KAFKA_CONFLUENT_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_DEFAULT_REPLICATION_FACTOR: 1
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/configs/kafka_server_jass.conf"
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/kafka_server_jass.conf:/etc/kafka/configs/kafka_server_jass.conf
في الملف kafka_server_jass.conf
، قم بتعيين المعلمات التالية:
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="kafka"
password="pass123"
user_kafka="pass123";
};
ثم يمكنك بدء تشغيل خدمة كافكا باستخدام الأمر التالي:
$ docker compose up -d
2. بدء تشغيل ميلفوس والاتصال بكافكا
بمجرد بدء تشغيل خدمة كافكا، يمكنك بدء تشغيل ميلفوس والاتصال بها. استخدم الملف التالي docker-compose.yaml
لبدء تشغيل ميلفوس والاتصال بكافكا باستخدام SASL/PLAIN:
version: '3.5'
services:
etcd:
......
minio:
......
standalone:
container_name: milvus-standalone
......
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
- ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
استخدم الأمر التالي لتنزيل قالب ملف تهيئة ميلفوس:
$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
وقم بتعيين المعلمات التالية:
mq:
type: kafka
kafka:
brokerList: "127.0.0.1:9093"
saslUsername: kafka
saslPassword: pass123
saslMechanisms: PLAIN
securityProtocol: SASL_PLAINTEXT
readTimeout: 10 # read message timeout in seconds
ssl:
enabled: false # Whether to support kafka secure connection mode
tlsCert: # path to client's public key
tlsKey: # path to client's private key
tlsCACert: # file or directory path to CA certificate
tlsKeyPassword: # private key passphrase for use with private key, if any
ثم يمكنك بدء تشغيل ميلفوس باستخدام الأمر التالي:
$ docker compose up -d
ربط ميلفوس بكافكا باستخدام SSL وحده
لبدء تشغيل كافكا بمصادقة SSL، تحتاج إلى الحصول على بعض ملفات الشهادات أو إنشاء شهادات موقعة ذاتيًا. في هذا المثال، نستخدم الشهادات الموقعة ذاتيًا.
1. إنشاء شهادات موقعة ذاتيًا
أنشئ مجلدًا باسم my_secrets
، وأضف برنامج نصي باش باسم gen-ssl-certs.sh
فيه، والصق المحتوى التالي فيه:
#!/bin/bash
#
#
# This scripts generates:
# - root CA certificate
# - server certificate and keystore
# - client keys
#
# https://cwiki.apache.org/confluence/display/KAFKA/Deploying+SSL+for+Kafka
#
if [[ "$1" == "-k" ]]; then
USE_KEYTOOL=1
shift
else
USE_KEYTOOL=0
fi
OP="$1"
CA_CERT="$2"
PFX="$3"
HOST="$4"
C=NN
ST=NN
L=NN
O=NN
OU=NN
CN="kafka-ssl"
# Password
PASS="abcdefgh"
# Cert validity, in days
VALIDITY=365
set -e
export LC_ALL=C
if [[ $OP == "ca" && ! -z "$CA_CERT" && ! -z "$3" ]]; then
CN="$3"
openssl req -new -x509 -keyout ${CA_CERT}.key -out $CA_CERT -days $VALIDITY -passin "pass:$PASS" -passout "pass:$PASS" <<EOF
${C}
${ST}
${L}
${O}
${OU}
${CN}
$USER@${CN}
.
.
EOF
elif [[ $OP == "server" && ! -z "$CA_CERT" && ! -z "$PFX" && ! -z "$CN" ]]; then
#Step 1
echo "############ Generating key"
keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias localhost -validity $VALIDITY -genkey -keyalg RSA <<EOF
$CN
$OU
$O
$L
$ST
$C
yes
yes
EOF
#Step 2
echo "############ Adding CA"
keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.truststore.jks -alias CARoot -import -file $CA_CERT <<EOF
yes
EOF
#Step 3
echo "############ Export certificate"
keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias localhost -certreq -file ${PFX}cert-file
echo "############ Sign certificate"
openssl x509 -req -CA $CA_CERT -CAkey ${CA_CERT}.key -in ${PFX}cert-file -out ${PFX}cert-signed -days $VALIDITY -CAcreateserial -passin "pass:$PASS"
echo "############ Import CA"
keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias CARoot -import -file $CA_CERT <<EOF
yes
EOF
echo "############ Import signed CA"
keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias localhost -import -file ${PFX}cert-signed
elif [[ $OP == "client" && ! -z "$CA_CERT" && ! -z "$PFX" && ! -z "$CN" ]]; then
if [[ $USE_KEYTOOL == 1 ]]; then
echo "############ Creating client truststore"
[[ -f ${PFX}client.truststore.jks ]] || keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.truststore.jks -alias CARoot -import -file $CA_CERT <<EOF
yes
EOF
echo "############ Generating key"
keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.keystore.jks -alias localhost -validity $VALIDITY -genkey -keyalg RSA <<EOF
$CN
$OU
$O
$L
$ST
$C
yes
yes
EOF
echo "########### Export certificate"
keytool -storepass "$PASS" -keystore ${PFX}client.keystore.jks -alias localhost -certreq -file ${PFX}cert-file
echo "########### Sign certificate"
openssl x509 -req -CA ${CA_CERT} -CAkey ${CA_CERT}.key -in ${PFX}cert-file -out ${PFX}cert-signed -days $VALIDITY -CAcreateserial -passin pass:$PASS
echo "########### Import CA"
keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.keystore.jks -alias CARoot -import -file ${CA_CERT} <<EOF
yes
EOF
echo "########### Import signed CA"
keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.keystore.jks -alias localhost -import -file ${PFX}cert-signed
else
# Standard OpenSSL keys
echo "############ Generating key"
openssl genrsa -des3 -passout "pass:$PASS" -out ${PFX}client.key 2048
echo "############ Generating request"
openssl req -passin "pass:$PASS" -passout "pass:$PASS" -key ${PFX}client.key -new -out ${PFX}client.req \
<<EOF
$C
$ST
$L
$O
$OU
$CN
.
$PASS
.
EOF
echo "########### Signing key"
openssl x509 -req -passin "pass:$PASS" -in ${PFX}client.req -CA $CA_CERT -CAkey ${CA_CERT}.key -CAcreateserial -out ${PFX}client.pem -days $VALIDITY
fi
else
echo "Usage: $0 ca <ca-cert-file> <CN>"
echo " $0 [-k] server|client <ca-cert-file> <file_prefix> <hostname>"
echo ""
echo " -k = Use keytool/Java Keystore, else standard SSL keys"
exit 1
fi
في البرنامج النصي أعلاه، يتم تطبيق كلمة المرور الافتراضية abcdefgh
. لتغيير كلمة المرور، قم بإنشاء ملف نصي باسم cert_creds
وأدخل كلمة المرور في السطر الأول.
ثم قم بتشغيل الأمر التالي لإنشاء الشهادات:
إنشاء شهادة CA:
يفترض ما يلي أن ملف شهادة المرجع المصدق (CA) يحمل الاسم
ca-cert
واسم المضيف للوسيط هوkafka-ssl
:$ ./gen-ssl-certs.sh ca ca-cert kafka-ssl
إنشاء شهادة الخادم ومخزن المفاتيح:
يفترض ما يلي أن ملف شهادة CA هو المسمى
ca-cert
، وأن البادئة لجميع ملفات الإخراج هيkafka_
، وأن اسم المضيف للوسيط هوkafka-ssl
:$ ./gen-ssl-certs.sh -k server ca-cert kafka_ kafka-ssl
إنشاء مفاتيح العميل:
يفترض ما يلي أن ملف شهادة CA هو المسمى
ca-cert
، والبادئة لجميع ملفات الإخراج هيkafka_
، واسم العميل هوkafka-client
:$ ./gen-ssl-certs.sh client ca-cert kafka_ kafka-client
بمجرد إنشاء جميع الشهادات اللازمة، يمكنك رؤية الملفات التالية في المجلد my_secrets
:
$ ls -l my_secrets
total 12
-rw-rw-r-- 1 1.4K Feb 26 11:53 ca-cert
-rw------- 1 1.9K Feb 26 11:53 ca-cert.key
-rw-rw-r-- 1 41 Feb 26 11:54 ca-cert.srl
-rw-rw-r-- 1 9 Feb 26 12:08 cert_creds
-rwxrwxr-x 1 3.9K Feb 26 17:26 gen-ssl-certs.sh
-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_cert-file
-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_cert-signed
-rw------- 1 1.8K Feb 26 11:54 kafka_client.key
-rw-rw-r-- 1 1.2K Feb 26 11:54 kafka_client.pem
-rw-rw-r-- 1 1013 Feb 26 11:54 kafka_client.req
-rw-rw-r-- 1 5.6K Feb 26 11:54 kafka_server.keystore.jks
-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_server.truststore.jks
2. بدء خدمة كافكا مع SSL
استخدم الملف التالي docker-compose.yaml
لبدء خدمة كافكا باستخدام SSL:
version: '3'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
container_name: zookeeper
hostname: zookeeper
ports:
- 2181:2181
environment:
ZOOKEEPER_SERVER_ID: 1
ZOOKEEPER_CLIENT_PORT: 2181
kafka-ssl:
image: confluentinc/cp-kafka:latest
container_name: kafka-ssl
hostname: kafka-ssl
ports:
- 9093:9093
depends_on:
- zookeeper
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
ZOOKEEPER_SASL_ENABLED: "false"
KAFKA_ADVERTISED_LISTENERS: SSL://kafka-ssl:9093
KAFKA_SSL_KEYSTORE_FILENAME: kafka_server.keystore.jks
KAFKA_SSL_KEYSTORE_CREDENTIALS: cert_creds
KAFKA_SSL_KEY_CREDENTIALS: cert_creds
KAFKA_SSL_TRUSTSTORE_FILENAME: kafka_server.truststore.jks
KAFKA_SSL_TRUSTSTORE_CREDENTIALS: cert_creds
KAFKA_SSL_CLIENT_AUTH: 'required'
KAFKA_SECURITY_PROTOCOL: SSL
KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SSL
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/etc/kafka/secrets
ثم ابدأ تشغيل خدمة كافكا باستخدام الأمر التالي:
$ docker compose up -d
3. بدء تشغيل ميلفوس والاتصال بكافكا باستخدام SSL
بمجرد بدء تشغيل خدمة كافكا، يمكنك بدء تشغيل ميلفوس والاتصال بها. استخدم الملف التالي docker-compose.yaml
لبدء تشغيل ميلفوس والاتصال بكافكا باستخدام SSL:
version: '3.5'
services:
etcd:
......
minio:
......
standalone:
container_name: milvus-standalone
......
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
- ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
- ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/milvus/secrets
استخدم الأمر التالي لتنزيل قالب ملف تكوين ملف Milvus:
$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
وقم بتعيين المعلمات التالية:
mq:
type: kafka
kafka:
brokerList: "127.0.0.1:9093"
saslUsername:
saslPassword:
saslMechanisms:
securityProtocol: SSL
readTimeout: 10 # read message timeout in seconds
ssl:
enabled: true # Whether to support kafka secure connection mode
tlsCert: /milvus/secrets/kafka_client.pem # path to client's public key
tlsKey: /milvus/secrets/kafka_client.key # path to client's private key
tlsCACert: /milvus/secrets/ca-cert # file or directory path to CA certificate
tlsKeyPassword: abcdefgh # private key passphrase for use with private key, if any
ثم ابدأ تشغيل ميلفوس باستخدام الأمر التالي:
$ docker compose up -d
ربط ميلفوس بكافكا باستخدام SASL/PLAIN و SSL
لتوصيل ميلفوس بكافكا باستخدام SASL/PLAIN و SSL، تحتاج إلى تكرار الخطوات في توصيل ميلفوس بكافكا باستخدام SASL/PLAIN وحده وتوصيل ميلفوس بكافكا باستخدام SSL وحده.
1. ابدأ خدمة كافكا باستخدام SASL/PLAIN و SSL
استخدم الملف kafka_server_jass.conf
المذكور في Connect Milus إلى كافكا مع SASL/PLAIN Alone والمجلد my_secrets
الذي تم إنشاؤه في Connect Milus إلى كافكا مع SSL Alone لبدء خدمة كافكا مع SASL/PLAIN و SSL.
يمكن استخدام الملف التالي docker-compose.yaml
لبدء خدمة كافكا مع SASL/PLAIN و SSL:
version: '3'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
container_name: zookeeper
hostname: zookeeper
ports:
- 2181:2181
environment:
ZOOKEEPER_SERVER_ID: 1
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka-ssl:
image: confluentinc/cp-kafka:latest
container_name: kafka-ssl
hostname: kafka-ssl
ports:
- 9093:9093
depends_on:
- zookeeper
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
ZOOKEEPER_SASL_ENABLED: "false"
KAFKA_ADVERTISED_LISTENERS: SASL_SSL://kafka-ssl:9093
KAFKA_SSL_KEYSTORE_FILENAME: kafka_server.keystore.jks
KAFKA_SSL_KEYSTORE_CREDENTIALS: cert_creds
KAFKA_SSL_KEY_CREDENTIALS: cert_creds
KAFKA_SSL_TRUSTSTORE_FILENAME: kafka_server.truststore.jks
KAFKA_SSL_TRUSTSTORE_CREDENTIALS: cert_creds
KAFKA_SSL_CLIENT_AUTH: 'required'
KAFKA_SECURITY_PROTOCOL: SASL_SSL
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_SSL:SASL_SSL
KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_SSL
KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN
KAFKA_SASL_ENABLED_MECHANISMS: PLAIN
KAFKA_CONFLUENT_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_DEFAULT_REPLICATION_FACTOR: 1
KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/configs/kafka_server_jass.conf"
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/etc/kafka/secrets
- ${DOCKER_VOLUME_DIRECTORY:-.}/kafka_server_jass.conf:/etc/kafka/configs/kafka_server_jass.conf
ثم ابدأ تشغيل خدمة كافكا باستخدام الأمر التالي:
$ docker compose up -d
2. بدء تشغيل ميلفوس والاتصال بخدمة كافكا باستخدام SASL/PLAIN و SSL
بمجرد بدء تشغيل خدمة كافكا، يمكنك بدء تشغيل ميلفوس والاتصال بها. استخدم الملف التالي docker-compose.yaml
لبدء تشغيل Milvus والاتصال بكافكا باستخدام SASL/PLAIN و SSL:
version: '3.5'
services:
etcd:
......
minio:
......
standalone:
container_name: milvus-standalone
......
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
- ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
- ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/milvus/secrets
استخدم الأمر التالي لتنزيل قالب ملف تكوين ملف Milvus:
$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
وقم بتعيين المعلمات التالية:
mq:
type: kafka
kafka:
brokerList: "127.0.0.1:9093"
saslUsername: kafka
saslPassword: pass123
saslMechanisms: PLAIN
securityProtocol: SASL_SSL
readTimeout: 10 # read message timeout in seconds
ssl:
enabled: true # Whether to support kafka secure connection mode
tlsCert: /milvus/secrets/kafka_client.pem # path to client's public key
tlsKey: /milvus/secrets/kafka_client.key # path to client's private key
tlsCACert: /milvus/secrets/ca-cert # file or directory path to CA certificate
tlsKeyPassword: abcdefgh # private key passphrase for use with private key, if any