साइन इन करें हमेशा मुफ़्त शुरू करें

इंफ्रास्ट्रक्चर

कॉन्फिग में ज़ीरो सीक्रेट।
लॉग में ज़ीरो सीक्रेट।

हर प्लेटफ़ॉर्म, हर ऑर्केस्ट्रेटर, हर CI रनर। प्रॉक्सी किसी भी ऐसी चीज़ के साथ काम करती है जो HTTP कॉल करती है। CLI किसी भी ऐसी चीज़ के साथ काम करता है जो शेल आउट कर सकता है। अगर आपका सिस्टम आपके करियर से भी पुराना है, तब भी यह काम करता है।

प्रॉक्सी ही यूनिवर्सल इंटीग्रेशन है।

अगर आपका वर्कलोड HTTPS कॉल करता है, तो Clavitor प्रॉक्सी नेटवर्क लेयर पर क्रेडेंशियल इंजेक्ट करती है। कोई कोड बदलाव नहीं। कोई SDK नहीं। एनवायरनमेंट वेरिएबल, कॉन्फिग फ़ाइलों या लॉग में कोई सीक्रेट नहीं। HTTPS_PROXY सेट करें और आपका मौजूदा कोड बिना किसी बदलाव के काम करता है — प्रॉक्सी अनुरोध मशीन छोड़ने से पहले रिक्वेस्ट हेडर में clavitor:// रेफरेंस को रिज़ॉल्व कर देती है।

$ export HTTPS_PROXY=http://localhost:1983
$ curl -H "Authorization: Bearer clavitor://Stripe API/key" \
  https://api.stripe.com/v1/charges
# The agent never sees sk_live_... — only clavitor:// appears in logs

कंटेनर

Docker और Kubernetes

Docker Compose

होस्ट पर Clavitor प्रॉक्सी चलाएँ और अपने कंटेनर को उसकी ओर पॉइंट करें। क्रेडेंशियल आउटबाउंड रिक्वेस्ट में पारदर्शी रूप से इंजेक्ट किए जाते हैं — एनवायरनमेंट वेरिएबल में कोई सीक्रेट नहीं, इमेज में कोई सीक्रेट बेक नहीं किया गया।

# On the Docker host
$ clavitor-proxy serve &
# docker-compose.yml — containers route through the host-mode proxy
services:
  app:
    environment:
      - HTTPS_PROXY=http://host.docker.internal:1983
    extra_hosts:
      - "host.docker.internal:host-gateway"

या स्टार्टअप पर कॉन्फिग टेम्पलेट को रिज़ॉल्व करने के लिए render का उपयोग करें:

$ clavitor-cli render app.config.template.yml | docker compose -f - up

Kubernetes

मैनिफेस्ट में वैल्यू को हार्डकोड किए बिना वॉल्ट से सीक्रेट बनाएँ:

$ kubectl create secret generic app-secrets \
  --from-literal=db-pass="$(clavitor-cli get 'Production DB' --field password)" \
  --from-literal=api-key="$(clavitor-cli get 'Stripe API' --field key)"

रनटाइम क्रेडेंशियल इंजेक्शन के लिए, प्रॉक्सी को अपने पॉड में साइडकार कंटेनर के रूप में डिप्लॉय करें। एप्लिकेशन कंटेनर HTTPS_PROXY को साइडकार पर सेट करते हैं। क्रेडेंशियल प्रति-अनुरोध रिज़ॉल्व किए जाते हैं, कभी भी etcd में स्टोर नहीं किए जाते।

IaC

Terraform, Ansible, Pulumi

Terraform

terraform apply से पहले प्रोवाइडर एनवायरनमेंट में क्रेडेंशियल रिज़ॉल्व करें। AWS प्रोवाइडर अपने क्रेडेंशियल स्टैंडर्ड एनवायरनमेंट वेरिएबल से पढ़ता है — Clavitor उन्हें इनलाइन पॉप्युलेट करता है, .tf फ़ाइल में किसी भी सीक्रेट का उल्लेख नहीं होता।

$ export AWS_ACCESS_KEY_ID=$(clavitor-cli get "AWS Root" --field access_key_id)
$ export AWS_SECRET_ACCESS_KEY=$(clavitor-cli get "AWS Root" --field secret_key)
$ terraform apply

आपके कोड में provider "aws" {} ब्लॉक खाली रहता है। यही पैटर्न किसी भी ऐसे Terraform प्रोवाइडर के लिए काम करता है जो env-var क्रेडेंशियल को सपोर्ट करता है (जो कि उनमें से अधिकांश हैं)।

Ansible

- name: Get database password
  command: clavitor-cli get "Production DB" --field password
  register: db_pass
  no_log: true

- name: Configure app
  template:
    src: app.conf.j2
  vars:
    db_password: "{{ db_pass.stdout }}"

Pulumi

import { execSync } from 'child_process';
const dbPass = execSync('clavitor-cli get "Production DB" --field password').toString().trim();
new aws.rds.Instance("db", { masterPassword: new pulumi.secret(dbPass) });

CI/CD

GitHub Actions, GitLab CI, Jenkins

नीचे दिए गए हर उदाहरण में टोकन को stdin पर पाइप किया जाता है — इसे argv से बाहर रखा जाता है ताकि यह /proc/<pid>/cmdline या बिल्ड लॉग में दिखाई न दे।

GitHub Actions

- name: Deploy
  env:
    CLAVITOR_TOKEN: ${{ secrets.CLAVITOR_TOKEN }}
  run: |
    echo "$CLAVITOR_TOKEN" | clavitor-cli init
    kubectl create secret generic app-secrets \
      --from-literal=api-key="$(clavitor-cli get 'Deploy Token' --field key)" \
      --dry-run=client -o yaml | kubectl apply -f -

GitLab CI

deploy:
  script:
    - echo "$CLAVITOR_TOKEN" | clavitor-cli init
    - clavitor-cli get "Deploy Key" --field private_key | ssh-add -
    - ssh deploy@production "systemctl restart app"

Jenkins

pipeline {
  stages {
    stage('Deploy') {
      steps {
        sh 'echo "$CLAVITOR_TOKEN" | clavitor-cli init'
        sh 'clavitor-cli get "Deploy Key" --field private_key | ssh-add -'
        sh 'ssh deploy@production "systemctl restart app"'
      }
    }
  }
}

SSH

वॉल्ट में स्टोर की गई कुंजियाँ

$ clavitor-cli get "Deploy Key" --field private_key | ssh-add -
$ ssh deploy@production

प्राइवेट कुंजी को सीधे ssh-add में पाइप किया जाता है। यह कभी भी डिस्क को टच नहीं करती, शेल हिस्ट्री में कभी दिखाई नहीं देती, और सेशन समाप्त होने पर एजेंट से क्लियर हो जाती है।

लिगेसी सिस्टम

अगर यह HTTP कॉल करता है, तो यह काम करता है।

प्रॉक्सी को इससे कोई फ़र्क नहीं पड़ता कि रिक्वेस्ट किस भाषा में की गई है। COBOL, FORTRAN, Perl, Visual Basic, 30 साल पुराना बैच जॉब — अगर प्रोसेस HTTPS रिक्वेस्ट करता है, तो प्रॉक्सी उसे इंटरसेप्ट करती है, clavitor:// रेफरेंस को रिज़ॉल्व करती है, और असली क्रेडेंशियल इंजेक्ट करती है। कोई कोड बदलाव की आवश्यकता नहीं।

उन सिस्टम के लिए जो HTTP कॉल नहीं कर सकते, प्रोसेस शुरू होने से पहले कॉन्फिग टेम्पलेट को रिज़ॉल्व करने के लिए clavitor-cli render का उपयोग करें। टेम्पलेट को कहीं भी स्टोर करना सुरक्षित है। रिज़ॉल्व किया गया आउटपुट stdin या प्रतिबंधित अनुमतियों वाली अस्थायी फ़ाइल में जाता है।

# Resolve credentials before the batch job starts
$ clavitor-cli render db-connect.template.cfg > /tmp/db-connect.cfg
$ chmod 600 /tmp/db-connect.cfg
$ /opt/legacy/batch-job --config /tmp/db-connect.cfg
$ rm /tmp/db-connect.cfg

पैटर्न हमेशा एक जैसा ही होता है।

स्क्रिप्ट और पाइपलाइन के लिए CLI। HTTP वर्कलोड के लिए प्रॉक्सी। कॉन्फिग फ़ाइलों के लिए Render। हर सीक्रेट रनटाइम पर रिज़ॉल्व होता है, कभी स्टोर नहीं होता।