Amazon Managed Streaming for Apache Kafka (Amazon MSK) é um serviço totalmente gerenciado que facilita o desenvolvimento e a execução de aplicativos que processam dados de streaming por meio do Apache Kafka. Operações de plano de controle, incluindo criação, atualização e exclusão de clusters, são oferecidas pelo Amazon MSK. O serviço permite a utilização de operações de plano de dados do Apache Kafka, abrangendo produção e consumo de dados. Ele opera em versões de código aberto do Apache Kafka, garantindo compatibilidade com aplicativos existentes, ferramentas e plugins de parceiros e da comunidade Apache Kafka, eliminando a necessidade de alterações no código do aplicativo.
Em termos de confiabilidade, o Amazon MSK é projetado para detectar e se recuperar automaticamente de cenários comuns de falha de cluster, garantindo que aplicativos produtores e consumidores persistam em suas atividades de escrita e leitura de dados com interrupções mínimas. Além disso, ele visa otimizar os processos de replicação de dados ao tentar reutilizar o armazenamento de corretores substituídos, minimizando assim o volume de dados que precisa ser replicado pelo Apache Kafka.
Tipos
Existem 2 tipos de clusters Kafka que a AWS permite criar: Provisionado e Serverless.
Do ponto de vista de um atacante, é importante saber que:
Serverless não pode ser diretamente público (só pode ser executado em uma VPN sem nenhum IP publicamente exposto). No entanto, Provisionado pode ser configurado para obter um IP público (por padrão não tem) e configurar o grupo de segurança para expor as portas relevantes.
Serverless suporta apenas IAM como método de autenticação. Provisionado suporta autenticação SASL/SCRAM (senha), autenticação IAM, Autenticação do AWS Certificate Manager (ACM) e acesso Não autenticado.
Note que não é possível expor publicamente um Kafka Provisionado se o acesso não autenticado estiver habilitado
Enumeração
#Get clustersawskafkalist-clustersawskafkalist-clusters-v2# Check the supported authenticationawskafkalist-clusters|jq-r".ClusterInfoList[].ClientAuthentication"# Get Zookeeper endpointsaws kafka list-clusters | jq -r ".ClusterInfoList[].ZookeeperConnectString, .ClusterInfoList[].ZookeeperConnectStringTls"
# Get nodes and node enspointsawskafkakafkalist-nodes--cluster-arn<cluster-arn>aws kafka kafka list-nodes --cluster-arn <cluster-arn> | jq -r ".NodeInfoList[].BrokerNodeInfo.Endpoints" # Get endpoints
# Get used kafka configsawskafkalist-configurations#Get Kafka config fileawskafkadescribe-configuration--arn<config-arn># Get version of configawskafkadescribe-configuration-revision--arn<config-arn>--revision<version># Get content of config version# If using SCRAN authentication, get used AWS secret name (not secret value)awskafkalist-scram-secrets--cluster-arn<cluster-arn>
Acesso IAM do Kafka (em serverless)
# Guide from https://docs.aws.amazon.com/msk/latest/developerguide/create-serverless-cluster.html# Download Kafkawgethttps://archive.apache.org/dist/kafka/2.8.1/kafka_2.12-2.8.1.tgztar-xzfkafka_2.12-2.8.1.tgz# In kafka_2.12-2.8.1/libs download the MSK IAM JAR file.cdkafka_2.12-2.8.1/libswgethttps://github.com/aws/aws-msk-iam-auth/releases/download/v1.1.1/aws-msk-iam-auth-1.1.1-all.jar# Create file client.properties in kafka_2.12-2.8.1/binsecurity.protocol=SASL_SSLsasl.mechanism=AWS_MSK_IAMsasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule required;sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler# Export endpoints addressexport BS=boot-ok2ngypz.c2.kafka-serverless.us-east-1.amazonaws.com:9098## Make sure you will be able to access the port 9098 from the EC2 instance (check VPS, subnets and SG)# Create a topic called msk-serverless-tutorialkafka_2.12-2.8.1/bin/kafka-topics.sh --bootstrap-server $BS --command-config client.properties --create --topic msk-serverless-tutorial --partitions 6
# Send message of every new linekafka_2.12-2.8.1/bin/kafka-console-producer.sh --broker-list $BS --producer.config client.properties --topic msk-serverless-tutorial
# Read messageskafka_2.12-2.8.1/bin/kafka-console-consumer.sh --bootstrap-server $BS --consumer.config client.properties --topic msk-serverless-tutorial --from-beginning
Se você tiver acesso ao VPC onde um Kafka Provisionado está, você poderia habilitar acesso não autorizado, se a autenticação SASL/SCRAM, ler a senha do segredo, dar algumas outras permissões IAM controladas (se IAM ou serverless for usado) ou persistir com certificados.