1. Introdução
Esta página (última versão disponível em https://paulojeronimo.com/kafka-security) oferece um conjunto básico de tutoriais para você que deseja aprender um pouco sobre segurança em Kafka, em Português do Brasil, seguindo um aprendizado prático utilizando um ambiente macOS (ou Linux) utilizando o Docker.
A intenção aqui é apresentar alguns conceitos básicos da Kafka que vão desde sua inicialização com o Docker até a sua configuração e execução de forma segura utilizando, por exemplo, o protocolo Kerberos.
No decorrer desses tutoriais também é desenvolvido um componente (executável numa JVM através de programas criados em qualquer linguagem suportada: Java, Scala, Groovy, Kotlin, etc) que pode ser utilizado para tornar a integração de consumidores ou produtores Kafka segura.
Esta é a sequência dos tutoriais:
-
Consumindo e produzindo registros no Kafka através de uma aplicação escrita em:
-
Consumindo e produzindo de forma segura (com autenticação/autorização) …
-
Desenvolvendo um componente de segurança reutilizável (em Java 8).
-
Suportando o uso do componente nas aplicações escritas anteriormente em:
-
Java.
-
Scala.
-
Kotlin.
-
Em cada um desses tutorias também são apresentadas referências extras que podem ser úteis para uma exploração mais profunda dos tópicos cobertos pelo tutorial.
2. Produzindo e consumindo registros no Kafka via console
2.1. Criando o diretório do exemplo
$ mkdir console-consumer-producer-basic && cd console-consumer-producer-basic
2.2. Configurando o Docker Compose
$ cat > docker-compose.yml <<'EOF' --- version: '2' services: zookeeper: image: confluentinc/cp-zookeeper:6.0.0 hostname: zookeeper container_name: zookeeper ports: - "2181:2181" environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 broker: image: confluentinc/cp-kafka:6.0.0 hostname: broker container_name: broker depends_on: - zookeeper ports: - "29092:29092" environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181' KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:9092,PLAINTEXT_HOST://localhost:29092 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 EOF
2.4. Criando um tópico
$ docker-compose exec broker kafka-topics --create --topic example-topic --bootstrap-server broker:9092 --replication-factor 1 --partitions 1
2.5. Produzindo e consumindo registros
No terminal aberto (terminal 1), execute:
$ docker-compose exec broker bash $ kafka-console-producer --topic example-topic --broker-list broker:9092
Abra um segundo terminal (terminal 2).
Utilizando o Tmux, tecle: Ctrl+b+" |
Execute:
$ docker-compose exec broker bash $ kafka-console-consumer --topic example-topic --bootstrap-server broker:9092
Copie as seguintes linhas para o terminal 1:
the lazy fox jumped over the brown cow
Observe o consumo desses registros no terminal 2.
2.6. Consumindo todos os registros
Encerre o consumidor no terminal 2.
Tecle Ctrl+C. |
No terminal 1, copie e cole as seguintes linhas:
how now brown cow all streams lead to Kafka!
Reinicie o consumidor no terminal 2 adicionando o
argumento --from-beginning
a sua linha de comando:
$ kafka-console-consumer --topic example-topic --bootstrap-server broker:9092 --from-beginning
Observe que todas os registros (desde o primeiro) deverão ser apresentados. Ou seja, a saída deverá ser esta:
the lazy fox jumped over the brown cow how now brown cow all streams lead to Kafka!
7. Configurando o Kafka para o suporte ao Kerberos
7.1. Referências
-
https://www.confluent.io/blog/apache-kafka-security-authorization-authentication-encryption/
-
https://docs.confluent.io/4.0.0/kafka/authentication_sasl_gssapi.html#kafka-sasl-auth-gssapi
-
https://medium.com/@stephane.maarek/introduction-to-apache-kafka-security-c8951d410adf
-
https://www.opencore.com/blog/2018/3/group-based-authorization-in-kafka/#implementation