Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
kafka-keycloak-oauth — Apache Kafka 4.1.0 (KRaft) avec authentification Keycloak OAuth2 utilisant Strimzi - contourne la restriction de la liste blanche d'URL CVE-2025-27817 | Kitploit
Outils/GitHubGitHub/oriolrius/kafka-keycloak-oauth
Sécurité de l'Infrastructure CloudAnalyse des VulnérabilitésAudit de ConfigurationDevSecOpsAuthentificationApprentissage et Éducation
GitHuboriolrius/kafka-keycloak-oauth

kafka-keycloak-oauth

Apache Kafka 4.1.0 (KRaft) avec authentification Keycloak OAuth2 utilisant Strimzi - contourne la restriction de la liste blanche d'URL CVE-2025-27817

Voir le dépôt
5323il y a 11 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Apache Kafka 4.1.0 avec authentification OAuth2 Keycloak

Apache Kafka 4.1.0 prêt pour la production (mode KRaft) avec authentification OAuth2/OIDC Keycloak 26.1.1 utilisant l'image Kafka Strimzi.

Pourquoi ce projet vs kafka-oauth-keycloak-tls-demo

Il s'agit d'une évolution du POC précédent avec des améliorations significatives :

  • Strimzi OAuth 0.17.0 (vs 1.0.0) - version de production stable incluse dans l'image Strimzi Kafka 0.48.0
  • Aucune construction Docker personnalisée requise - utilise l'image Strimzi officielle avec OAuth pré-installé, élimine la complexité du Dockerfile
  • Conscience de CVE-2025-27817 - documente la restriction de la liste blanche d'URL et pourquoi Strimzi OAuth la contourne
  • Architecture simplifiée - mode combiné KRaft unique (broker+controller), pas d'architecture divisée
  • Focus client librdkafka - testé avec confluent-kafka-python (fonctionne sans problèmes de liste blanche d'URL), pas les clients Java natifs
  • Documentation technique complète - liste de contrôle de production, dépannage, réglage des performances, détails du mappage principal
  • Gestion des certificats plus propre - certificats d'exemple inclus pour des tests immédiats
  • Configuration Keycloak automatisée - création scriptée du realm/client/mapper avec configuration d'audience
  • Suite de tests Python fonctionnelle - valide la livraison de messages OAuth de bout en bout
  • Gestion explicite de l'URL de l'émetteur - documente la dualité URL interne vs externe pour le point de terminaison du jeton vs la validation de l'émetteur

Architecture

  • Distribution Kafka : Image Strimzi Kafka 0.48.0 (inclut Apache Kafka 4.1.0 + Strimzi OAuth 0.17.0 pré-inclus)
  • Version Kafka : Apache Kafka 4.1.0 (KRaft combiné broker+controller)
  • Bibliothèque OAuth : Strimzi Kafka OAuth 0.17.0 (inclus dans l'image, contourne la restriction de liste blanche d'URL CVE-2025-27817)
  • Fournisseur OAuth : Keycloak 26.1.1
  • Sécurité : SASL_SSL (OAuth) pour les clients externes, PLAINTEXT pour inter-broker, SSL avec CA auto-signé

Contexte CVE-2025-27817

Apache Kafka 4.0.0+ a introduit une liste blanche d'URL (org.apache.kafka.sasl.oauthbearer.allowed.urls) comme propriété système JVM pour corriger la vulnérabilité SSRF/lecture de fichier arbitraire. Cela casse l'utilisation OAuth standard dans les clients Apache Kafka natifs.

Solution : La bibliothèque Strimzi Kafka OAuth n'implémente pas cette restriction, permettant la fonctionnalité OAuth avec Kafka 4.1.0.

Prérequis

  • Docker Compose
  • Python 3.x avec uv (pour les tests)
  • OpenSSL (pour la génération de certificats)

Démarrage rapide

# Générer les certificats SSL
cd kafka-security
./generate-certs.sh
cd ..

# Démarrer les services
docker compose up -d

# Vérifier Keycloak
curl http://localhost:8080/health/ready

# Configurer le realm et les clients Keycloak
./scripts/setup-keycloak.sh

# Tester le producteur OAuth
source ~/.venv/bin/activate
uv pip install confluent-kafka
python tests/quick_test.py

Topologie réseau

keycloak:8080 (HTTP) ←→ kafka-broker:9093 (SASL_SSL/OAuth)
                      ↔ kafka-broker:19092 (PLAINTEXT/inter-broker)
                      ↔ kafka-broker:29093 (PLAINTEXT/contrôleur KRaft)

Configuration SSL

Structure CA

  • CA racine : kafka-security/ca-cert + ca-key
  • Keystore du broker : kafka-security/broker/kafka.server.keystore.jks (contient le certificat serveur + la clé privée)
  • Truststore du broker : kafka-security/broker/kafka.server.truststore.jks (contient le certificat CA)
  • Mot de passe : changeit (tous les keystores/truststores)

Détails du certificat

# Certificat du broker
CN=kafka-broker
SAN=DNS:kafka-broker,DNS:localhost,IP:127.0.0.1

# Validité : 3650 jours
# Algorithme de clé : RSA 2048 bits
# Algorithme de signature : SHA256withRSA

Configuration OAuth Keycloak

Realm : kafka-realm

Clients

kafka-broker (confidentiel)

  • ID client : kafka-broker
  • Secret client : Généré automatiquement par setup-keycloak.sh
  • Objectif : Authentification OAuth inter-broker
  • Mappers :
    • Mapper d'audience : ajoute kafka-broker à la revendication aud du JWT
    • Mapper de nom d'utilisateur : inclut preferred_username dans le jeton

kafka-producer (confidentiel)

  • ID client : kafka-producer
  • Secret client : Généré automatiquement
  • Objectif : Clients producteurs externes
  • Grant : client_credentials
  • Mappers : Identiques à kafka-broker

kafka-consumer (confidentiel)

  • ID client : kafka-consumer
  • Secret client : Généré automatiquement
  • Objectif : Clients consommateurs externes
  • Grant : client_credentials
  • Mappers : Identiques à kafka-broker

Point de terminaison du jeton

POST http://localhost:8080/realms/kafka-realm/protocol/openid-connect/token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials
&client_id=kafka-producer
&client_secret=<secret>
&scope=profile email

Structure du jeton JWT

{
  "aud": ["kafka-broker", "account"],
  "iss": "http://localhost:8080/realms/kafka-realm",
  "azp": "kafka-producer",
  "preferred_username": "service-account-kafka-producer",
  "scope": "profile email"
}

Configuration Kafka

Mode KRaft (kraft-config.properties)

# Identité du nœud
node.id=1
process.roles=broker,controller
controller.quorum.voters=1@kafka-broker:29093

# Écouteurs
listeners=SASL_SSL://0.0.0.0:9093,PLAINTEXT://0.0.0.0:19092,CONTROLLER://0.0.0.0:29093
advertised.listeners=SASL_SSL://localhost:9093,PLAINTEXT://kafka-broker:19092
listener.security.protocol.map=SASL_SSL:SASL_SSL,PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
inter.broker.listener.name=PLAINTEXT
controller.listener.names=CONTROLLER

# Mécanisme SASL
sasl.enabled.mechanisms=OAUTHBEARER

# Gestionnaires Strimzi OAuth (par écouteur pour SASL_SSL)
listener.name.sasl_ssl.oauthbearer.sasl.login.callback.handler.class=io.strimzi.kafka.oauth.client.JaasClientOauthLoginCallbackHandler
listener.name.sasl_ssl.oauthbearer.sasl.server.callback.handler.class=io.strimzi.kafka.oauth.server.JaasServerOauthValidatorCallbackHandler

# Configuration OAuth via JAAS
listener.name.sasl_ssl.oauthbearer.sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required \
  oauth.client.id="kafka-broker" \
  oauth.client.secret="<secret>" \
  oauth.token.endpoint.uri="http://keycloak:8080/realms/kafka-realm/protocol/openid-connect/token" \
  oauth.valid.issuer.uri="http://localhost:8080/realms/kafka-realm" \
  oauth.jwks.endpoint.uri="http://keycloak:8080/realms/kafka-realm/protocol/openid-connect/certs" \
  oauth.username.claim="preferred_username";

Paramètres clés Strimzi OAuth

  • oauth.client.id : Identifiant client pour l'acquisition de jeton
  • oauth.client.secret : Secret client pour l'acquisition de jeton
  • oauth.token.endpoint.uri : Point de terminaison du jeton Keycloak (le broker utilise le nom d'hôte interne keycloak:8080)
  • oauth.valid.issuer.uri : Émetteur JWT attendu (doit correspondre à la revendication iss du jeton, utilise localhost:8080 externe)
  • oauth.jwks.endpoint.uri : Point de terminaison JWKS pour la validation de signature JWT
  • oauth.username.claim : Revendication JWT pour l'extraction du principal

Autorisation

authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer
super.users=User:kafka-broker;User:ANONYMOUS
allow.everyone.if.no.acl.found=true

Remarque : Actuellement permissif pour les tests. La production devrait utiliser des ACL.

Configuration client

Producteur Python (confluent-kafka)

from confluent_kafka import Producer
Télécharger l’outil