विश्राम पर एक उच्च-विशेषाधिकार API कुंजी को एन्क्रिप्ट करें: एक GPG वॉल्ट जो AI ट्रांसक्रिप्ट से रहस्यों को बाहर रखता है

विश्राम पर एक उच्च-विशेषाधिकार API कुंजी को एन्क्रिप्ट करें: एक GPG वॉल्ट जो AI ट्रांसक्रिप्ट से रहस्यों को बाहर रखता है

Cloudflare Global API Key — या किसी भी खाता-व्यापी क्रेडेंशियल — को GPG, एक डिक्रिप्ट-एंड-एग्जीक्यूट रैपर, और आकस्मिक लीक के खिलाफ एक हार्नेस-स्तरीय गार्ड के साथ लॉक करने के लिए एक पोर्टेबल, निर्भरता-मुक्त रनबुक।

अधिकांश क्रेडेंशियल लीक नाटकीय नहीं होते हैं। कोई हैकर नहीं है, कोई उल्लंघन रिपोर्ट नहीं है। कोई व्यक्ति बस अपने होम निर्देशिका में एक प्लेनटेक्स्ट फ़ाइल में एक खाता-व्यापी API कुंजी रखता है, और एक दिन एक बैकअप, एक स्क्रीन-शेयर, एक पेस्ट किया गया कमांड, या एक AI कोडिंग सत्र चुपचाप इसे कहीं ले जाता है जहाँ इसे कभी नहीं जाना चाहिए था।

अगस्त 2026 तक, वह अंतिम वेक्टर वह है जिसने गणित को बदल दिया है। लगभग हर डेवलपर अब एक AI कोडिंग सहायक चलाता है जो उनकी ओर से फ़ाइलें पढ़ता है और कमांड चलाता है। ऐसी कोई भी चीज़ जो ऐसा टूल पढ़ता है, और जो कुछ भी कमांड प्रिंट करता है, एक सत्र ट्रांसक्रिप्ट का हिस्सा बन जाता है जो हर मोड़ पर मॉडल प्रदाता को प्रेषित किया जाता है। यदि कोई प्लेनटेक्स्ट कुंजी कभी प्रदर्शित होती है, स्क्रीन पर डिक्रिप्ट होती है, या किसी सत्र के दौरान गूंजती है, तो यह अब उस ट्रांसक्रिप्ट में बैठी है, आपके नियंत्रण के बाहर। यह काल्पनिक नहीं है: यह बिल्कुल वैसा ही है कि एक पूरी तरह से सावधान इंजीनियर स्पष्ट रूप से कुछ भी गलत किए बिना एक कुंजी को कैसे लीक कर सकता है।

यह पोस्ट इसे ठीक करने के लिए एक संपूर्ण, सामान्य रनबुक है। काम किया गया उदाहरण एक Cloudflare Global API Key है, लेकिन यह तकनीक किसी भी उच्च-विशेषाधिकार क्रेडेंशियल पर लागू होती है। भाग एक इसके अलावा और कुछ नहीं उपयोग करता है gpg और bash और किसी भी Linux या macOS मशीन पर काम करता है। भाग दो केवल उन लोगों के लिए है जो एक AI कोडिंग सहायक का उपयोग करते हैं और शीर्ष पर एक सख्त, लागू गार्ड चाहते हैं।

क्यों एक खाता-व्यापी कुंजी विशेष उपचार की हकदार है

एक Cloudflare Global API Key खाता-व्यापी और अनस्कोप है। यह उस ईमेल से बंधे हर खाते पर हर ज़ोन, वर्कर और DNS रिकॉर्ड को छू सकता है। यह दो अलग-अलग जोखिम पैदा करता है:

  • विश्राम पर। होम-डायरेक्टरी फ़ाइल में एक प्लेनटेक्स्ट कुंजी किसी भी प्रक्रिया, स्क्रिप्ट या बैकअप द्वारा पढ़ी जा सकती है जो आपके फ़ाइल सिस्टम को छूती है। यह जोखिम से दूर एक लापरवाह chmod, एक अति-व्यापक बैकअप कार्य, एक उधार लिया गया लैपटॉप है।
  • एक AI सत्र में। कुछ भी जो एक कोडिंग सहायक पढ़ता है, या कोई भी कमांड जो कुंजी प्रिंट करता है, प्रदाता को भेजे गए ट्रांसक्रिप्ट में आ जाता है। cat ~/.cf, echo $CLOUDFLARE_API_KEY, या एक gpg --decrypt जो स्क्रीन पर डंप करता है वे सभी इसे तुरंत लीक करते हैं।

सुधार के तीन भाग हैं: कुंजी को रखें विश्राम पर एन्क्रिप्टेड, इसे डिक्रिप्ट करें केवल एक अल्पकालिक उपप्रक्रिया के अंदर जो इसे कभी प्रिंट नहीं करती है, और — यदि एक AI सहायक लूप में है — तो एक जोड़ें हार्ड ब्लॉक जिसे कोड द्वारा लागू किया गया है, सावधान रहना याद रखकर नहीं।

शुरू करने से पहले एक नोट: यदि आप जिस टूल का उपयोग कर रहे हैं वह Global API Key के बजाय स्कोप्ड API टोकन का समर्थन करता है, तो टोकन का उपयोग करें। एक टोकन को व्यक्तिगत रूप से रद्द किया जा सकता है और यह अपने असाइन किए गए दायरे से बाहर किसी भी चीज़ तक नहीं पहुँच सकता है, इसलिए एक लीक का विस्फोट दायरा ग्लोबल की के एक अंश का है। नीचे दिए गए चरण समान रूप से एक टोकन पर लागू होते हैं; आप बस एक ईमेल प्लस कुंजी जोड़े के बजाय एकल टोकन मान को संग्रहीत करते हैं।

चरण 1: क्रेडेंशियल पुनर्प्राप्त करें और इसे कड़े अनुमतियों के साथ स्टेज करें

अपने प्रदाता के डैशबोर्ड से कुंजी प्राप्त करें। Cloudflare के लिए, वह My Profile है, फिर API Tokens टैब, फिर Global API Key के बगल में View।

इसे प्रोजेक्ट डायरेक्टरी में स्टेजिंग फ़ाइल में लिखें, इसे पहले बाइट से लॉक-डाउन करके बनाएँ:

mkdir -p ~/vault
umask 077                 # new files are created 600, never world-readable
printf '%s\n' "[email protected] REPLACE_WITH_GLOBAL_API_KEY main-account" > ~/vault/.cf
chmod 600 ~/vault/.cf

यह umask 077 मायने रखता है: यह गारंटी देता है कि प्लेनटेक्स्ट निर्माण के दौरान अन्य उपयोगकर्ताओं द्वारा संक्षेप में कभी भी पढ़ने योग्य नहीं है, जिसे बाद में एक chmod पूर्ववत नहीं कर सकता।

चरण 2: इसे GPG सिमेट्रिक AES-256 के साथ एन्क्रिप्ट करें

सिमेट्रिक, पासफ़्रेज़-आधारित एन्क्रिप्शन यहाँ सही विकल्प है। केवल एक व्यक्ति को इस फ़ाइल को डिक्रिप्ट करने की आवश्यकता होती है, इसलिए सार्वजनिक/निजी कीपेयर बिना किसी लाभ के जटिलता जोड़ देगा।

gpg --symmetric --cipher-algo AES256 -o ~/vault/.cf.gpg ~/vault/.cf

GPG आपको एक पासफ़्रेज़ दर्ज करने और पुष्टि करने के लिए प्रेरित करता है। कुछ मजबूत और अद्वितीय चुनें और इसे एक पासवर्ड मैनेजर में रिकॉर्ड करें, क्योंकि अगर आप इसे भूल जाते हैं तो कोई पुनर्प्राप्ति नहीं है। इस बिंदु से, वह पासफ़्रेज़ ही एकमात्र चीज़ है जो फ़ाइल सिस्टम एक्सेस और कुंजी के बीच खड़ी है।

चरण 3: कुछ भी हटाने से पहले एन्क्रिप्टेड कॉपी को सत्यापित करें

प्लेनटेक्स्ट को कभी भी तब तक न हटाएँ जब तक आप यह साबित न कर दें कि सिफरटेक्स्ट बाइट-फॉर-बाइट वापस डिक्रिप्ट हो जाता है:

diff <(gpg --quiet --batch --decrypt ~/vault/.cf.gpg) ~/vault/.cf

कोई आउटपुट न होने का मतलब है कि दोनों समान हैं और आप आगे बढ़ने के लिए सुरक्षित हैं। किसी भी आउटपुट का अर्थ है कि कुछ गलत है — गलत पासफ़्रेज़, गलत सिफर, दूषित फ़ाइल — और आपको अभी प्लेनटेक्स्ट को नहीं हटाना चाहिए।

चरण 4: सुरक्षित रूप से प्लेनटेक्स्ट को हटा दें

shred -u ~/vault/.cf
chmod 600 ~/vault/.cf.gpg
ls -la ~/vault/.cf*        # only .cf.gpg should remain

shred अनलिंक करने से पहले बाइट्स को अधिलेखित करता है, जो इससे अधिक मजबूत है rm। इसकी सीमाओं के बारे में ईमानदार रहें: SSDs, कॉपी-ऑन-राइट फ़ाइलसिस्टम, या किसी भी फ़ाइल पर जिसे कभी स्नैपशॉट या बैकअप लिया गया था, अधिलेखित गारंटी कमजोर हो जाती है। वास्तव में समझौता किए गए क्रेडेंशियल के खिलाफ एकमात्र वास्तविक गारंटी एक कॉपी को हटाना नहीं, बल्कि रोटेशन है।

डिफ़ॉल्ट रूप से gpg-agent आपके टाइप करने के दस मिनट या उससे अधिक समय बाद आपके पासफ़्रेज़ को कैश करता है। उस विंडो को कम करने के लिए:

mkdir -p ~/.gnupg && chmod 700 ~/.gnupg
cat >> ~/.gnupg/gpg-agent.conf <<'EOF'
default-cache-ttl 60
max-cache-ttl 120
EOF
chmod 600 ~/.gnupg/gpg-agent.conf
gpg-connect-agent reloadagent /bye

यह कैशिंग को 60 से 120 सेकंड पर सीमित करता है — आपके डिक्रिप्ट करने के ठीक बाद स्क्रिप्ट चलने के लिए पर्याप्त लंबा, इतना छोटा कि दूर जाना वॉल्ट को प्रभावी रूप से अनलॉक नहीं छोड़ता है।

चरण 6: एक डिक्रिप्ट-एंड-एग्जीक्यूट रैपर बनाएँ जो कभी भी रहस्य को प्रिंट नहीं करता है

यह वह कदम है जो वॉल्ट को कुंजी को उजागर किए बिना दिन-प्रतिदिन प्रयोग करने योग्य बनाता है। इसे इस रूप में सहेजें ~/vault/cf-run.sh:

#!/usr/bin/env bash
# cf-run.sh — decrypt .cf.gpg and exec a command with CLOUDFLARE_EMAIL /
# CLOUDFLARE_API_KEY set for that one child process only. The decrypted value
# is never printed, written to disk, or returned as this script's output.
#   Usage: ./cf-run.sh npx wrangler deploy
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CREDS_FILE="$SCRIPT_DIR/.cf.gpg"

[ -f "$CREDS_FILE" ] || { echo "cf-run.sh: $CREDS_FILE not found" >&2; exit 1; }
[ "$#" -gt 0 ]       || { echo "usage: cf-run.sh <command> [args...]" >&2; exit 1; }

CREDS="$(gpg --quiet --batch --decrypt "$CREDS_FILE")" || { echo "cf-run.sh: decryption failed" >&2; exit 1; }
CF_EMAIL="$(awk '{print $1}' <<<"$CREDS")"
CF_KEY="$(awk '{print $2}' <<<"$CREDS")"
unset CREDS

exec env CLOUDFLARE_EMAIL="$CF_EMAIL" CLOUDFLARE_API_KEY="$CF_KEY" "$@"
chmod +x ~/vault/cf-run.sh

यह लाइन दर लाइन सुरक्षित क्यों रहता है:

  • डिक्रिप्टेड टेक्स्ट कमांड प्रतिस्थापन के माध्यम से सीधे शेल चर में चला जाता है — कभी भी टर्मिनल या स्टडआउट पर नहीं।
  • awk उस चर से दो फ़ील्ड निकालता है; अभी भी कुछ भी मुद्रित नहीं किया गया है।
  • unset CREDS जैसे ही टुकड़े निकाले जाते हैं, संयुक्त रेखा को स्मृति से हटा देता है।
  • exec env VAR=... "$@" रैपर की प्रक्रिया को आपके लक्ष्य कमांड से बदल देता है, इसे केवल अपने स्वयं के वातावरण में मान सौंपता है। किसी भी बिंदु पर डिस्क में कुछ भी नहीं लिखा जाता है, लॉग किया जाता है, या प्रतिध्वनित नहीं होता है।

चरण 7: हर चीज़ के लिए रैपर का उपयोग करें

कभी न करें CLOUDFLARE_API_KEY=$(cat ...) wrangler deploy फिर से। हर कमांड को रैपर के माध्यम से रूट करें, और लक्ष्य टूल को अपने स्वयं के वातावरण से चर पढ़ने दें:

~/vault/cf-run.sh npx wrangler deploy
~/vault/cf-run.sh curl -s "https://api.cloudflare.com/client/v4/user" \
  -H "X-Auth-Email: $CLOUDFLARE_EMAIL" -H "X-Auth-Key: $CLOUDFLARE_API_KEY"

चरण 8 (केवल AI-सहायक उपयोगकर्ता): एक हार्ड गार्ड हुक जोड़ें

यदि कोई कोडिंग सहायक आपकी मशीन पर कमांड चलाता है, तो "कुंजी को प्रिंट न करना याद रखना" कोई नियंत्रण नहीं है। कई सहायक एक हुक सिस्टम को उजागर करते हैं जो किसी कमांड के चलने से पहले उसका निरीक्षण कर सकता है और उसे अस्वीकार कर सकता है। विचार एक पूर्व-निष्पादन गार्ड है जो दो चीजों को रोकता है: एक वॉल्ट के प्लेनटेक्स्ट रूप को सीधे पढ़ना, और कैप्चर किए गए चर के बजाय वॉल्ट को स्टडआउट या पाइप में डिक्रिप्ट करना।

गार्ड, स्पष्ट शब्दों में, लंबित शेल कमांड का निरीक्षण करता है और:

  • रोकता है एक रीड कमांड (cat, less, head, strings, और इसी तरह) वॉल्ट के प्लेनटेक्स्ट फ़ाइलनाम की ओर इशारा करता है।
  • रोकता है एक gpg --decrypt वॉल्ट का जब तक कि इसका आउटपुट कमांड प्रतिस्थापन में कैप्चर न किया जाए जैसे कि X="$(gpg -d ... )".
  • अनुमति देता है बाकी सब कुछ, जिसमें वैध cf-run.sh आवाहन शामिल है।

एक न्यूनतम Python गार्ड अनुमति देने के लिए निकास कोड 0 और ब्लॉक करने के लिए निकास कोड 2 देता है, कारण को मानक त्रुटि पर प्रिंट करता है ताकि सहायक देखे कि क्यों:

#!/usr/bin/env python3
import json, re, sys

VAULT_HINTS = ("vault/.cf",)                 # add every vault path you protect
READ_CMDS   = r"(cat|less|more|head|tail|strings|xxd|od)"

def main() -> int:
    try:
        cmd = (json.load(sys.stdin).get("tool_input") or {}).get("command", "") or ""
    except Exception:
        return 0                             # never break tooling on a parse error
    # Block reading the plaintext vault directly (matches .cf but not .cf.gpg)
    if re.search(rf"(^|[;&|]\s*){READ_CMDS}\s+[^\n]*vault/\.cf(\s|$)", cmd):
        sys.stderr.write("BLOCKED: reading the plaintext vault would leak it. Use cf-run.sh.\n")
        return 2
    # Only care about decrypting a protected vault
    if re.search(r"gpg\b.{0,60}?(-d\b|--decrypt\b)", cmd) and any(h in cmd for h in VAULT_HINTS):
        if re.search(r"\$\(\s*gpg\b", cmd) or re.search(r"`\s*gpg\b", cmd):
            return 0                         # captured into a variable — safe
        sys.stderr.write("BLOCKED: decrypting to stdout leaks secrets. Capture into a variable.\n")
        return 2
    return 0

if __name__ == "__main__":
    sys.exit(main())

इसे अपने सहायक के प्री-टूल हुक कॉन्फ़िगरेशन में वायर करें, फिर इसे एक डिकॉय फ़ाइल के विरुद्ध परखें — कभी भी असली वॉल्ट नहीं, क्योंकि परीक्षण के दौरान नियम में एक बग वास्तविक रहस्य को प्रिंट कर सकता है। एक हानिरहित बनाएँ vault/.cf थ्रोअवे डायरेक्टरी के तहत, पुष्टि करें कि सहायक इसे पढ़ने से इनकार करता है, और अलग से पुष्टि करें कि वैध cf-run.sh कमांड अभी भी पास होता है।

निष्कर्ष

विश्राम पर क्रेडेंशियल को एन्क्रिप्ट करना अपने आप में पर्याप्त नहीं है। मान केवल तभी सुरक्षित रहता है जब इसे इस तरह से डिक्रिप्ट किया जाता है जो इसे कभी सतह पर नहीं लाता है, और — जहाँ एक AI सहायक शामिल है — यदि असुरक्षित पहुँच अनुशासन के बजाय कोड द्वारा अवरुद्ध की जाती है। GPG सिमेट्रिक एन्क्रिप्शन, एक डिक्रिप्ट-एंड-एग्जीक्यूट रैपर, और एक प्री-एक्ज़ीक्यूशन गार्ड हुक एक साथ आपको एक वॉल्ट देते हैं जो वास्तव में उपयोगी और लीक होने के लिए वास्तव में कठिन है। इसे स्थापित करने में पंद्रह मिनट लगते हैं और यह शांत, शर्मनाक जोखिमों के पूरे वर्ग को हटा देता है।

गुण

  • पोर्टेबल और निर्भरता-मुक्त: कोर सेटअप को केवल gpg और bashकी आवश्यकता होती है, जो लगभग हर Unix मशीन पर मौजूद होते हैं।
  • सामान्य उपयोग के दौरान रहस्य कभी भी मुद्रित, डिस्क पर नहीं लिखा जाता, या लॉग नहीं किया जाता है।
  • सिमेट्रिक एन्क्रिप्शन एकल ऑपरेटर के लिए मॉडल को सरल रखता है।
  • वैकल्पिक गार्ड हुक "सावधान रहें" को एक लागू, कोड-स्तरीय नियंत्रण में बदल देता है।
  • वही पैटर्न किसी भी उच्च-विशेषाधिकार क्रेडेंशियल के लिए काम करता है, केवल Cloudflare के लिए नहीं।

दोष

  • भूले हुए पासफ़्रेज़ का मतलब स्थायी नुकसान है; कोई पुनर्प्राप्ति पथ नहीं है।
  • shred SSDs, कॉपी-ऑन-राइट फ़ाइल सिस्टम, या पहले बैकअप ली गई फ़ाइलों पर विलोपन की पूरी तरह से गारंटी नहीं दे सकता।
  • एन्क्रिप्शन आगे चलकर कुंजी की सुरक्षा करता है लेकिन पिछले जोखिम को पूर्ववत करने के लिए कुछ नहीं करता है।
  • गार्ड हुक सहायक-विशिष्ट है और इसे आपके वास्तविक वॉल्ट पथों के साथ समन्वयित रखा जाना चाहिए।

सावधानी

इस लेख में हर मान — [email protected], REPLACE_WITH_GLOBAL_API_KEY, main-account, और ~/vault पथ — एक प्लेसहोल्डर है। अपना स्वयं का विकल्प रखें और कभी भी संस्करण नियंत्रण में प्लेनटेक्स्ट क्रेडेंशियल को कमिट न करें। असली कुंजी के साथ उन पर भरोसा करने से पहले डिकॉय फ़ाइलों के खिलाफ रैपर और गार्ड का परीक्षण करें, और किसी भी क्रेडेंशियल को घुमाएं जिस क्षण आपको संदेह हो कि यह उजागर हो गया था। अपने जोखिम पर आगे बढ़ें; आप अपने स्वयं के क्रेडेंशियल और बुनियादी ढांचे के लिए जिम्मेदार हैं।

अक्सर पूछे जाने वाले प्रश्न

सार्वजनिक/निजी कीपेयर के बजाय GPG सिमेट्रिक एन्क्रिप्शन का उपयोग क्यों करें? एक एकल ऑपरेटर के लिए जो एन्क्रिप्टर और एकमात्र डिक्रिप्टर दोनों है, पासफ़्रेज़-आधारित सिमेट्रिक सिफर सरल है और उतना ही मजबूत है। एक कीपेयर इस मामले में बिना किसी सुरक्षा लाभ के कुंजी-प्रबंधन ओवरहेड जोड़ता है।

क्या git में एन्क्रिप्टेड .cf.gpg फ़ाइल को स्टोर करना सुरक्षित है? सिफरटेक्स्ट तकनीकी रूप से कमिट करने के लिए सुरक्षित है, लेकिन इसके आपकी मशीन को छोड़ने का कोई फायदा नहीं है। इसे स्थानीय रखें, और कभी भी, प्लेनटेक्स्ट को कमिट न करें।

क्या मुझे Global API Key के बजाय Cloudflare API Token का उपयोग करना चाहिए? हाँ, जब भी टूल इसका समर्थन करता है। एक स्कोप्ड टोकन को व्यक्तिगत रूप से रद्द किया जा सकता है और यह अपने दायरे से बाहर के संसाधनों तक नहीं पहुँच सकता है, इसलिए एक लीक लीक हुई Global API Key की तुलना में बहुत कम नुकसानदायक है।

डिक्रिप्ट-एंड-एग्जीक्यूट रैपर वास्तव में किस चीज़ से बचाता है? यह सुनिश्चित करता है कि डिक्रिप्टेड रहस्य केवल एक चाइल्ड प्रोसेस के पर्यावरण में ही रहता है। यह कभी भी टर्मिनल पर मुद्रित नहीं होता है, शेल इतिहास में कैप्चर नहीं होता है, या डिस्क पर नहीं लिखा जाता है, जो सामान्य आकस्मिक-लीक पथ हैं।

कोई रहस्य AI कोडिंग सहायक में कैसे लीक होता है? सहायक जो कुछ भी पढ़ता है या कोई कमांड प्रिंट करता है, वह मॉडल प्रदाता को भेजे गए सत्र ट्रांसक्रिप्ट में जोड़ दिया जाता है। एक प्लेनटेक्स्ट कुंजी का एकल cat , या स्टडआउट के लिए एक डिक्रिप्ट, उस ट्रांसक्रिप्ट में कुंजी को स्थायी रूप से रखता है।

क्या कुंजी को एन्क्रिप्ट करने से मदद मिलती है यदि वह पहले ही एक बार लीक हो चुकी हो? नहीं। एन्क्रिप्शन केवल कुंजी को भविष्य के जोखिम से बचाता है। यदि कोई कुंजी कभी छपी, चिपकाई गई, या ट्रांसक्रिप्ट में देखी गई, तो आपको उसे घुमाना चाहिए; पुराने मान को एन्क्रिप्ट करना उजागर किए गए मान के बारे में कुछ नहीं बदलता है।

मुझे कितनी बार उच्च-विशेषाधिकार कुंजी को घुमाना चाहिए? ऐसे शेड्यूल पर घुमाएँ जो आपकी जोखिम सहनशीलता से मेल खाता हो, और किसी भी संदिग्ध जोखिम पर तुरंत। खाता-व्यापी कुंजी के लिए, अधिक बार घुमाने के पक्ष में गलती करें, क्योंकि इसका विस्फोट दायरा पूरा खाता है।

क्या मैं इसे AWS, डेटाबेस, या अन्य क्रेडेंशियल के अनुकूल बना सकता हूँ? हाँ। वही तीन विचार — विश्राम पर एन्क्रिप्ट करें, केवल एक थ्रोअवे सबप्रोसेस में डिक्रिप्ट करें, और असुरक्षित रीड्स को ब्लॉक करें — किसी भी रहस्य पर लागू होते हैं। मिलान करने के लिए रैपर में फ़ील्ड पार्सिंग और पर्यावरण चर नामों को समायोजित करें।

टैग

#Security #GPG #Encryption #SecretsManagement #Cloudflare #APIKeys #DevOps #DevSecOps #AICoding #Linux

Free field guide

Kubernetes Security Checklist

Harden cluster access, workload identity, pod security, network boundaries, software supply chain, secrets, and operational monitoring.