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:

  1. Produzindo e consumindo registros no Kafka via console.

  2. Consumindo e produzindo registros no Kafka através de uma aplicação escrita em:

  3. Consumindo e produzindo de forma segura (com autenticação/autorização) …​

    1. O básico sobre o Kerberos.

    2. Configurando o Kafka para o suporte ao Kerberos.

    3. Desenvolvendo um componente de segurança reutilizável (em Java 8).

    4. Suportando o uso do componente nas aplicações escritas anteriormente em:

      1. Java.

      2. Scala.

      3. 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.3. Iniciando os contêineres

$ docker-compose up -d
$ docker ps -a

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!

2.7. Encerrando

$ docker-compose down

3. Consumindo e produzindo registros no Kafka através de uma aplicação escrita em Java

4. Consumindo e produzindo registros no Kafka através de uma aplicação escrita em Scala

5. Consumindo e produzindo registros no Kafka através de uma aplicação escrita em Kotlin

6. O básico sobre o Kerberos

7. Configurando o Kafka para o suporte ao Kerberos