
एक Kroxylicious फ़िल्टर प्लगइन जो Apache Kafka के लिए पारदर्शी पोस्ट-क्वांटम (ML-KEM + AES-256-GCM) रिकॉर्ड-स्तरीय एन्क्रिप्शन प्रदान करता है, जिसके लिए क्लाइंट कोड में कोई बदलाव आवश्यक नहीं है।
एक Kroxylicious फ़िल्टर प्लगइन जो Apache Kafka के लिए पारदर्शी Post-Quantum Cryptography (PQC) रिकॉर्ड-स्तरीय एन्क्रिप्शन प्रदान करता है, जो ML-KEM (FIPS 203) key encapsulation के साथ AES-256-GCM सममित एन्क्रिप्शन का उपयोग करता है।
Kafka प्रोड्यूसर और कंज़्यूमर को शून्य कोड परिवर्तन की आवश्यकता होती है। Kroxylicious प्रॉक्सी ट्रैफ़िक को इंटरसेप्ट करता है और Produce पर एन्क्रिप्ट / Fetch पर डिक्रिप्ट स्वचालित रूप से करता है।``` Producer ──plaintext──> Kroxylicious ──encrypted──> Kafka Broker Consumer <──plaintext── Kroxylicious <──encrypted── Kafka Broker
## Kafka के लिए PQC क्यों?
शास्त्रीय कुंजी स्थापना एल्गोरिदम (RSA, ECDH) भविष्य के क्वांटम कंप्यूटरों के प्रति संवेदनशील हैं। यदि प्रति-रिकॉर्ड एन्क्रिप्शन कुंजियाँ किसी शास्त्रीय KEM का उपयोग करके स्थापित की जाती हैं, तो एक क्वांटम प्रतिद्वंद्वी उन कुंजियों को ब्रोकर पर सिफरटेक्स्ट के साथ संग्रहीत एनकैप्सुलेशन से पुनर्प्राप्त कर सकता है।
यह प्लगइन क्वांटम-प्रतिरोधी कुंजी एनकैप्सुलेशन के लिए ML-KEM (FIPS 203) का उपयोग करता है, जिससे यह सुनिश्चित होता है कि Kafka ब्रोकर पर विश्राम अवस्था (data at rest) में मौजूद डेटा को क्रिप्टोग्राफिक रूप से प्रासंगिक क्वांटम कंप्यूटर वाले प्रतिद्वंद्वी द्वारा भी डिक्रिप्ट नहीं किया जा सकता।
**नोट:** यह फ़िल्टर **ब्रोकर पर विश्राम अवस्था में डेटा (data at rest)** की सुरक्षा करता है, न कि ट्रांज़िट में TLS चैनल की। पूर्ण विश्लेषण के लिए देखें [THREAT_MODEL.md](https://github.com/oscerd/kroxylicious-pqc-filter/blob/main/THREAT_MODEL.md) कि किस चीज़ से बचाव होता है और किससे नहीं।
| Standard | Algorithm | इस प्लगइन में उद्देश्य |
|----------|-----------|------------------------|
| FIPS 203 | ML-KEM (Kyber) | कुंजी एनकैप्सुलेशन - प्रति-संदेश AES कुंजी सुरक्षित रूप से स्थापित करता है |
| N/A | AES-256-GCM | रिकॉर्ड पेलोड की सममित प्रमाणित एन्क्रिप्शन |
| N/A | X25519 ECDH | हाइब्रिड मोड रक्षा-गहराई के लिए शास्त्रीय कुंजी समझौता |
## विशेषताएँ
- **पारदर्शी एन्क्रिप्शन/डिक्रिप्शन** - क्लाइंट-साइड में कोई बदलाव आवश्यक नहीं
- **ML-KEM-512, ML-KEM-768 (डिफ़ॉल्ट), ML-KEM-1024** पैरामीटर सेट
- **हाइब्रिड मोड** (डिफ़ॉल्ट) - ML-KEM + X25519 ECDH को जोड़ता है ताकि दोनों को तोड़ना आवश्यक हो
- **प्रति-रिकॉर्ड एन्क्रिप्शन** - प्रत्येक रिकॉर्ड को एक नया KEM एनकैप्सुलेशन + यादृच्छिक IV मिलता है
- **टॉपिक फ़िल्टरिंग** - रेगेक्स पैटर्न चुनते हैं कि कौन से टॉपिक एन्क्रिप्ट करने हैं
- **छेड़छाड़ का पता लगाना** - AES-GCM प्रमाणित एन्क्रिप्शन संशोधित सिफरटेक्स्ट को अस्वीकार करता है
- **सिमेंटिक सुरक्षा** - समान प्लेनटेक्स्ट अलग-अलग सिफरटेक्स्ट उत्पन्न करते हैं (IND-CCA2)
- **कुंजी स्वतः-जनरेशन** - अनुपलब्ध होने पर पहले स्टार्टअप पर ML-KEM कुंजियाँ जनरेट और सेव करता है
- **`x-pqc-encrypted` हेडर** - डाउनस्ट्रीम जागरूकता के लिए एन्क्रिप्टेड रिकॉर्ड को चिह्नित करता है
- **प्लग करने योग्य कुंजी प्रदाता** - `KeyProvider` SPI फ़ाइलसिस्टम (डिफ़ॉल्ट) और HashiCorp Vault बैकएंड का समर्थन करता है
## आवश्यक शर्तें
| आवश्यकता | संस्करण |
|-------------|---------|
| JDK | 17+ (21+ अनुशंसित) |
| Maven | 3.8+ |
| Kroxylicious | 0.19.0 |
| Apache Kafka | 3.9.x |
## त्वरित आरंभ
### 1. प्लगइन बनाएं```bash
git clone <this-repo>
cd kroxylicious-pqc-filter
mvn clean package -DskipTests
target/kroxylicious-pqc-filter-1.0.0-SNAPSHOT.jar पर स्थित shaded JAR, Bouncy Castle को बंडल करता है
ताकि इसे बिना किसी अतिरिक्त निर्भरता के Kroxylicious में डाला जा सके।
HashiCorp Vault key provider समर्थन शामिल करने के लिए, vault प्रोफ़ाइल के साथ बिल्ड करें:```bash
mvn clean package -Pvault -DskipTests
यह `spring-vault-core` और `VaultKeyProvider` को JAR में बंडल करता है।
### 2. ML-KEM कुंजियाँ जनरेट करें```bash
java -cp target/kroxylicious-pqc-filter-1.0.0-SNAPSHOT.jar \
io.kroxylicious.filter.pqc.PqcKeyGeneratorCli \
ML_KEM_768 \
/etc/kroxylicious/pqc/
The input for chunk 9 is empty — no content was provided to translate.``` Generating ML-KEM-768 key pair... Public key: /etc/kroxylicious/pqc/pqc-public.der Size: 1206 bytes Format: X.509 Private key: /etc/kroxylicious/pqc/pqc-private.der Size: 2498 bytes Format: PKCS#8
वैकल्पिक रूप से, कॉन्फ़िगरेशन में कुंजी पथों को छोड़ दें और फ़िल्टर
पहली बार प्रारंभ होने पर कुंजियाँ स्वचालित रूप से उत्पन्न करेगा।
### 3. Kroxylicious को कॉन्फ़िगर करें
अपने Kroxylicious प्रॉक्सी YAML कॉन्फ़िगरेशन में फ़िल्टर जोड़ें:```yaml
filterDefinitions:
- name: pqc-encryption
type: PqcRecordEncryptionFilterFactory
config:
kemAlgorithm: ML_KEM_768
hybridMode: true
publicKeyPath: /etc/kroxylicious/pqc/pqc-public.der
privateKeyPath: /etc/kroxylicious/pqc/pqc-private.der
topicPatterns:
- "sensitive-.*"
- "pii-.*"
defaultFilters:
- pqc-encryption
JAR को Kroxylicious के लिए सुलभ निर्देशिका में रखें और इसे
KROXYLICIOUS_CLASSPATH पर्यावरण चर के माध्यम से क्लासपाथ में जोड़ें:```bash
export KROXYLICIOUS_CLASSPATH="/opt/kroxylicious/plugins/*"
Docker का उपयोग करते समय, इसे अपने कंटेनर वातावरण में सेट करें:```yaml
environment:
KROXYLICIOUS_CLASSPATH: /opt/kroxylicious/plugins/*
फिर प्रॉक्सी शुरू करें। प्रोड्यूसर और कंज़्यूमर ब्रोकर से सीधे जुड़ने के बजाय प्रॉक्सी पोर्ट से जुड़ते हैं।
| Property | Type | Required | Default | Description |
|---|---|---|---|---|
kemAlgorithm | enum | No | ML_KEM_768 | ML-KEM पैरामीटर सेट। इनमें से एक: ML_KEM_512, ML_KEM_768, ML_KEM_1024। |
hybridMode | boolean | No | true | गहन सुरक्षा (defense-in-depth) के लिए ML-KEM को X25519 ECDH के साथ संयोजित करें। |
publicKeyPath | string | Filesystem only | - | ML-KEM सार्वजनिक कुंजी (X.509 DER एन्कोडेड) के लिए फ़ाइल सिस्टम पथ। |
privateKeyPath | string | Filesystem only | - | ML-KEM निजी कुंजी (PKCS#8 DER एन्कोडेड) के लिए फ़ाइल सिस्टम पथ। |
topicPatterns | list<string> | No | [".*"] | Java regex पैटर्न। मेल खाने वाले टॉपिक्स में केवल रिकॉर्ड ही एन्क्रिप्ट/डिक्रिप्ट होते हैं। |
keyProviderType | string | No | filesystem | कुंजी भंडारण बैकएंड। इनमें से एक: filesystem, vault। |
keyProviderConfig | map<string, string> | Vault only | {} | बैकएंड-विशिष्ट कॉन्फ़िगरेशन (नीचे Vault अनुभाग देखें)। |
Filesystem (keyProviderType: filesystem, डिफ़ॉल्ट):
डिस्क पर DER फ़ाइलों से ML-KEM कुंजियाँ लोड करता है। यदि फ़ाइलें मौजूद नहीं हैं, तो एक नई कुंजी जोड़ी उत्पन्न करके उन्हें सहेजता है। इसके लिए publicKeyPath और privateKeyPath आवश्यक हैं।
HashiCorp Vault (keyProviderType: vault, -Pvault बिल्ड की आवश्यकता है):
Vault KV v2 secrets engine से ML-KEM कुंजियाँ प्राप्त करता है। कुंजियाँ publicKey और privateKey फ़ील्ड्स में base64-एन्कोडेड DER के रूप में संग्रहीत होती हैं। कुंजी रोटेशन समर्थन के लिए Vault secret संस्करण, कुंजी IDs में मैप होते हैं।
Vault keyProviderConfig गुण:
| Property | Required | Default | Description |
|---|---|---|---|
vaultAddress | हाँ | VAULT_ADDR पर्यावरण चर | Vault सर्वर URL (उदाहरण: http://vault:8200) |
vaultToken | token प्रमाणीकरण के लिए | VAULT_TOKEN पर्यावरण चर | Vault प्रमाणीकरण टोकन |
secretPath | हाँ | -- | secrets engine के भीतर पथ (उदाहरण: kroxylicious/pqc) |
secretEngine | नहीं | secret | KV v2 secrets engine माउंट नाम |
authMethod | नहीं | token | प्रमाणीकरण विधि: token, approle, या kubernetes |
roleId | approle के लिए | -- | AppRole भूमिका ID |
secretId | approle के लिए | -- | AppRole गुप्त ID |
kubeRole | kubernetes के लिए | -- | Kubernetes प्रमाणीकरण भूमिका नाम |
kubeTokenPath | नहीं | /var/run/secrets/.../token | सर्विस अकाउंट टोकन फ़ाइल पथ |