
सरल सुरक्षित रहस्य रक्षक
keeper Go के लिए एक क्रिप्टोग्राफिक गुप्त भंडार है। यह Argon2id कुंजी व्युत्पत्ति और XChaCha20-Poly1305 (डिफ़ॉल्ट) प्रमाणित एन्क्रिप्शन का उपयोग करके आराम से मनमाने बाइट पेलोड को एन्क्रिप्ट करता है, और उन्हें एक एम्बेडेड bbolt डेटाबेस में संग्रहीत करता है।
यह तीन चीजों के रूप में आता है जिनका आप स्वतंत्र रूप से उपयोग कर सकते हैं:
x/keephandler) — एक कॉल में किसी भी net/http mux पर keeper एंडपॉइंट्स माउंट करें, प्लग करने योग्य हुक, गार्ड, और एक्सेस कंट्रोल और ऑडिट लॉगिंग के लिए रिस्पॉन्स एन्कोडर के साथ।cmd/keeper) — एक निरंतर REPL सत्र, कोई-इको गुप्त प्रविष्टि, और शून्य शेल-इतिहास एक्सपोज़र के साथ एक टर्मिनल इंटरफ़ेस।keeper को Agbero लोड बैलेंसर के लिए मौलिक गुप्त प्रबंधन परत के रूप में डिज़ाइन किया गया था, लेकिन इसका Agbero पर कोई निर्भरता नहीं है और यह किसी भी Go प्रोजेक्ट में काम करता है।
keeper रहस्यों को बकेट में विभाजित करता है। प्रत्येक बकेट में एक अपरिवर्तनीय BucketSecurityPolicy होता है जो यह नियंत्रित करता है कि इसकी डेटा एन्क्रिप्शन कुंजी (DEK) कैसे सुरक्षित है। चार स्तर उपलब्ध हैं।
एक योजना एक URI उपसर्ग है जो संबंधित बकेट को समूहित करता है (vault://, certs://, space://, या कोई भी नाम जो आप पंजीकृत करते हैं)। एक सुरक्षा स्तर निर्माण के समय निर्धारित बकेट नीति की एक संपत्ति है और उसके बाद अपरिवर्तनीय है।
आप एक ही योजना के भीतर स्वतंत्र रूप से सुरक्षा स्तरों को मिश्रित कर सकते हैं। उदाहरण के लिए, vault://system LevelPasswordOnly (स्टार्टअप पर स्वचालित रूप से अनलॉक) हो सकता है, जबकि vault://admin LevelAdminWrapped (स्पष्ट क्रेडेंशियल की आवश्यकता) है।
बकेट DEK मास्टर कुंजी से HKDF-SHA256 का उपयोग करके प्रति बकेट एक डोमेन-पृथक जानकारी स्ट्रिंग (keeper-bucket-dek-v1:scheme:namespace) के साथ व्युत्पन्न होता है। सभी LevelPasswordOnly बकेट स्वचालित रूप से अनलॉक हो जाते हैं जब UnlockDatabase को सही मास्टर पासफ़्रेज़ के साथ कॉल किया जाता है। रनटाइम पर किसी प्रति-बकेट क्रेडेंशियल की आवश्यकता नहीं होती है। यह स्तर उन रहस्यों के लिए उपयुक्त है जिनकी प्रक्रिया को मानवीय हस्तक्षेप के बिना स्टार्टअप पर आवश्यकता होती है।
बकेट में उस बकेट के लिए अद्वितीय एक यादृच्छिक रूप से उत्पन्न 32-बाइट DEK है। DEK कभी भी सादे पाठ में संग्रहीत नहीं होता है। प्रत्येक अधिकृत व्यवस्थापक के लिए एक कुंजी एन्क्रिप्शन कुंजी (KEK) HKDF(masterKey‖adminCred, dekSalt) से व्युत्पन्न होती है और DEK को XChaCha20-Poly1305 के माध्यम से लपेटने के लिए उपयोग की जाती है। बकेट तब तक दुर्गम है जब तक कोई व्यवस्थापक अपने क्रेडेंशियल के साथ UnlockBucket को कॉल नहीं करता। अकेला मास्टर पासफ़्रेज़ बकेट को डिक्रिप्ट नहीं कर सकता। एक व्यवस्थापक को रद्द करने से किसी अन्य व्यवस्थापक की लिपटी प्रतिलिपि प्रभावित नहीं होती है।
बकेट DEK CreateBucket समय पर उत्पन्न होता है और तुरंत कॉलर-आपूर्ति किए गए HSMProvider द्वारा लपेटा जाता है। प्रदाता लपेटने और खोलने के संचालन करता है — keeper प्रदाता को DEK सौंपने के बाद कच्चे DEK को कभी संभाल नहीं करता है। UnlockDatabase स्वचालित रूप से सभी पंजीकृत HSM बकेट के लिए प्रदाता को Envelope को खोलने और बीजने के लिए कॉल करता है। मास्टर कुंजी रोटेशन इन बकेट को पुनः एन्क्रिप्ट नहीं करता है; DEK प्रदाता-नियंत्रित होता है।
एक अंतर्निहित SoftHSM कार्यान्वयन जो मेमगार्ड-संरक्षित रैपिंग कुंजी द्वारा समर्थित है, परीक्षण और CI वातावरण के लिए pkg/hsm में उपलब्ध है। इसे उत्पादन में उपयोग न करें।
कुंजी प्रबंधन व्यवहार में LevelHSM के समान, लेकिन HSMProvider को pkg/remote.Provider द्वारा कार्यान्वित किया गया है — एक कॉन्फ़िगरेबल HTTPS एडाप्टर जो TLS पर किसी भी दूरस्थ KMS सेवा को लपेटने और खोलने का काम सौंपता है। HashiCorp Vault Transit, AWS KMS, और GCP Cloud KMS के लिए पूर्व-निर्मित कॉन्फ़िगरेशन pkg/remote में प्रदान किए गए हैं। उत्पादन उपयोग के लिए, पारस्परिक TLS प्रमाणीकरण सक्षम करने के लिए TLSClientCert और TLSClientKey कॉन्फ़िगर करें।
salt ← random 32 bytes, generated once, stored as a versioned SaltStore (unencrypted) masterKey ← Argon2id(passphrase, salt, t=3, m=64 MiB, p=4) → 32 bytes
पहली व्युत्पत्ति पर एक सत्यापन हैश संग्रहीत किया जाता है:```
verifyHash ← Argon2id(masterKey, "verification", t=1, m=64 MiB, p=4) → 32 bytes
बाद के DeriveMaster कॉल इस हैश को पुनः गणना करते हैं और इसकी तुलना crypto/subtle.ConstantTimeCompare से करते हैं। बेमेल होने पर ErrInvalidPassphrase वापस आता है।
KDF सॉल्ट डिज़ाइन के अनुसार अनएन्क्रिप्टेड रूप से संग्रहीत किया जाता है। मास्टर कुंजी प्राप्त करने के लिए UnlockDatabase से पहले इसे पढ़ने योग्य होना चाहिए — इसे मास्टर से प्राप्त कुंजी के साथ एन्क्रिप्ट करना चक्रीय होगा। KDF सॉल्ट कोई गुप्त जानकारी नहीं है; इसका उद्देश्य विशिष्टता है, गोपनीयता नहीं।
प्रत्येक प्लेनटेक्स्ट मान को बकेट DEK का उपयोग करके XChaCha20-Poly1305 के साथ एन्क्रिप्ट किया जाता है:``` nonce ← random 24 bytes ciphertext ← XChaCha20-Poly1305.Seal(nonce, DEK, plaintext)
संग्रहीत रिकॉर्ड एक msgpack-एन्कोडेड `Secret` संरचना है जिसमें सिफरटेक्स्ट, एन्क्रिप्टेड मेटाडेटा और स्कीमा संस्करण शामिल हैं। प्रमाणीकरण अंतर्निहित है: गलत कुंजी से डिक्रिप्ट किया गया सिफरटेक्स्ट कोई भी प्लेनटेक्स्ट वापस करने से पहले AEAD प्रमाणीकरण विफलता उत्पन्न करता है।
### KEK व्युत्पत्ति — LevelAdminWrapped```
salt ← random 32 bytes, generated at bucket creation, stored in policy
ikm ← masterKey ‖ adminCredential
KEK ← HKDF-SHA256(ikm, salt, info="keeper-kek-v1") → 32 bytes
wrappedDEK ← XChaCha20-Poly1305.Seal(nonce, KEK, DEK)
KEK को HKDF का उपयोग करके प्राप्त किया जाता है, न कि दूसरे Argon2 पास का। मास्टर कुंजी पहले से ही एक उच्च-लागत वाले KDF द्वारा उत्पन्न की गई थी; दूसरे Argon2 आह्वान से प्रत्येक UnlockBucket कॉल में सैकड़ों मिलीसेकंड की विलंबता बढ़ जाएगी, जबकि कोई सुरक्षा लाभ नहीं होगा। HKDF-SHA256 लगभग एक माइक्रोसेकंड में काम करता है।
गहराई में सुरक्षा: एक हमलावर जो केवल डेटाबेस से समझौता करता है, उसे लिपटा हुआ DEK और HKDF नमक मिलता है, लेकिन मास्टर कुंजी के बिना KEK प्राप्त नहीं कर सकता। एक हमलावर जो केवल मास्टर कुंजी से समझौता करता है, वह प्रशासनिक क्रेडेंशियल जाने बिना किसी भी LevelAdminWrapped DEK को अनरैप नहीं कर सकता।
गुप्त मेटाडेटा (निर्माण समय, अद्यतन समय, पहुँच गणना, संस्करण) को सिफरटेक्स्ट से अलग एन्क्रिप्ट किया जाता है:``` metaKey ← HKDF-SHA256(bucketDEK, nil, info="keeper-metadata-v1") → 32 bytes encryptedMeta ← XChaCha20-Poly1305.Seal(nonce, metaKey, msgpack(metadata))
For `LevelAdminWrapped`, `LevelHSM`, और `LevelRemote` बकेट के लिए इसका मतलब है कि मेटाडेटा बकेट क्रेडेंशियल के बिना अप्राप्य है, जिससे डेटाबेस फ़ाइल तक पढ़ने की पहुँच वाला हमलावर एक्सेस पैटर्न या टाइमस्टैम्प नहीं सीख सकता।
**टाइमिंग साइड-चैनल नोट:** XChaCha20-Poly1305 प्रमाणीकरण त्रुटि लौटाने से पहले पूर्ण सिफरटेक्स्ट प्रोसेस करता है। फ़ॉलबैक डिक्रिप्ट पथ (नया व्युत्पन्न DEK → पुराना मास्टर-की-एज़-DEK) कोई फर्क नहीं पड़ता कि कौन सी कुंजी सफल होती है, समान वॉल-क्लॉक समय लेता है। कोई टाइमिंग साइड-चैनल किसी रिकॉर्ड की माइग्रेशन स्थिति को लीक नहीं करता।
### मेटाडेटा एन्क्रिप्शन — पॉलिसीज़, WAL, और ऑडिट