
एक कमांड-लाइन टूल जो age एन्क्रिप्शन और coreutils जैसे अंतर-संचालनीय मानकों का उपयोग करके सीक्रेट्स का सुरक्षित बैकअप, पुनर्स्थापना और सत्यापन करता है, ताकि वेंडर लॉक-इन के बिना दीर्घकालिक पहुंच सुनिश्चित हो सके।
secs-man एक उपकरण है जो टूल-स्वतंत्रता को ध्यान में रखते हुए गोपनीय जानकारी (secrets) के बैकअप प्रबंधित करने के लिए बनाया गया है: यदि आप अपनी गोपनीय जानकारी को इस सॉफ़्टवेयर से एन्क्रिप्ट करते हैं, तो आपको बिना इस सॉफ़्टवेयर के उन्हें डिक्रिप्ट और पुनर्स्थापित करने में सक्षम होना चाहिए। यहाँ तक कि अगर secs-man पृथ्वी के चेहरे से गायब हो जाए, तब भी आपका डेटा सुलभ रहेगा।
secs-man का उपयोग स्थानीय और दूरस्थ मशीनों की गोपनीय जानकारी प्रबंधित करने के लिए किया जा सकता है, और यह उस डेटा के लिए केवल-स्थानीय बैकअप बनाने हेतु आदर्श है जो क्लाउड में कहीं बैकअप करने के लिए बहुत संवेदनशील है।
आपको अपने अत्यंत महत्वपूर्ण डेटा का बैकअप लेने के लिए किसी विशिष्ट सॉफ़्टवेयर पर निर्भर नहीं रहना चाहिए।
कोई भी सॉफ़्टवेयर जो उपयोग के बाद आपको उसके इकोसिस्टम में बने रहने के लिए बाध्य करता है (जैसे: "यदि आप इसे इस सॉफ़्टवेयर से एन्क्रिप्ट करते हैं, तो आप इसे केवल इसी सॉफ़्टवेयर से डिक्रिप्ट कर सकते हैं"), आपको उस पर निर्भर बना देता है।
इसलिए, आपके महत्वपूर्ण डेटा का एन्क्रिप्शन, डिक्रिप्शन और पुनर्स्थापना वियुग्मित (decoupled) होनी चाहिए, अर्थात यदि आपने इसे सॉफ़्टवेयर X से एन्क्रिप्ट किया है, तो आपको बिना सॉफ़्टवेयर X के भी इसे डिक्रिप्ट करने में सक्षम होना चाहिए।
व्यवहार में, आप ऐसी व्यवस्था नहीं बना सकते जहाँ आपकी गोपनीय जानकारी डेटा हानि से 100% सुरक्षित हो। भले ही आपका सॉफ़्टवेयर X, Y, Z और W के साथ संगत हो, फिर भी यदि X, Y, Z और W सभी एक ही समय में काम करना बंद कर दें, तो आप अपने डेटा तक पहुँच खो देंगे।
व्यवहार में आप यह सुनिश्चित करते हैं कि आप केवल उन तकनीकों पर निर्भर रहें जो "मानक" हैं या उनके करीब हैं। मैं bash इंटरप्रेटर, USB पोर्ट और Linux मशीनों के अस्तित्व पर निर्भर रहने में सहज हूँ।
secs-man का वास्तविक लक्ष्य तब केवल निम्नलिखित के साथ पूर्णतः प्रतिलिपि-योग्य (reproducible) हो जाता है:
cp, mv और sha256sum
ageपर निर्भरता सबसे नाजुक है, लेकिन किसी क्रिप्टोग्राफ़िकल लाइब्रेरी पर निर्भरता अपरिहार्य है, औरageको महान लोकप्रियता और Rust में अच्छे बाइंडिंग दोनों प्राप्त हैं।
यह सुनिश्चित करता है कि भले ही इस सॉफ़्टवेयर के साथ कुछ भी ऐसा हो जाए जो आपको इसे दोबारा उपयोग करने से रोके, यह मानते हुए कि age अभी भी मौजूद है और आप अपने जीवन के 30 मिनट खर्च करने को तैयार हैं, आप अभी भी अपनी सभी गोपनीय जानकारी पुनर्प्राप्त कर सकते हैं।
अनुभाग मैन्युअल पुनर्प्राप्ति बताता है कि इस सॉफ़्टवेयर के बिना, केवल coreutils, age और एक टर्मिनल के साथ, इस सॉफ़्टवेयर द्वारा निर्यात की गई गोपनीय जानकारी को कैसे आयात किया जाए।
secs-man कहीं भी प्रकाशित नहीं है (यह एक प्रकाशित crate नहीं है, न ही यह nixpkgs, AUR या इसी तरह के स्थानों पर है)। इसे केवल इस रिपॉज़िटरी से सीधे, निम्नलिखित तरीकों में से एक द्वारा स्थापित किया जा सकता है।
nix run के साथयदि आपको केवल कभी-कभार secs-man चलाने की आवश्यकता है, तो आप इसे स्थापित किए बिना सीधे चला सकते हैं (इसके लिए flakes सक्षम होना आवश्यक है)
nix run github:Fran314/secrets-manager-rs -- export /path/to/secrets /path/to/export/endpoint
secs-man को सिस्टम-व्यापी रूप से उपलब्ध कराने के लिए, आप इस रिपॉज़िटरी को fetchGit के साथ अपने Nix कॉन्फ़िगरेशन में आयात कर सकते हैं और परिणामी पैकेज को environment.systemPackages (या home-manager के साथ home.packages) में जोड़ सकते हैं
let
secs-man = pkgs.callPackage "${builtins.fetchGit {
url = "https://github.com/Fran314/secrets-manager-rs.git";
ref = "main";
# rev = "<commit>"; # pin a specific commit for reproducibility
}}/default.nix" { };
in
# add `secs-man` to environment.systemPackages or home.packages
cargo के साथयदि आप NixOS पर नहीं हैं, तो आप cargo को इस रिपॉज़िटरी की ओर इंगित करके secs-man बाइनरी स्थापित कर सकते हैं।
cargo install --git https://github.com/Fran314/secrets-manager-rs
ध्यान दें कि इनमें से कोई भी विधि दूरस्थ मशीनों के लिए आवश्यक secs-man-ssh स्क्रिप्ट स्थापित नहीं करती: यह एक स्वतंत्र स्क्रिप्ट है जिसे इस रिपॉज़िटरी से अलग से कॉपी करना होता है।
यह उपकरण किसी दिए गए स्रोत निर्देशिका से फ़ाइलों को निर्यात और एन्क्रिप्ट करने की अनुमति देता है, और उसी निर्देशिका में आयात करके उन्हें पुनर्प्राप्त करने की अनुमति देता है। इस उपकरण का उपयोग करने का अनुशंसित तरीका यह है कि आपकी सभी "गोपनीय जानकारी" (कुंजियाँ, फ़ाइलें, ...) एक केंद्रीकृत निर्देशिका में हों।
गोपनीय जानकारी निर्देशिका के मूल (root) में एक .secrets-manifest प्लेनटेक्स्ट फ़ाइल होनी चाहिए जिसमें प्रबंधित की जाने वाली गोपनीय जानकारी की सूची हो, जो गोपनीय जानकारी निर्देशिका के सापेक्ष पथों के रूप में हो। फ़ाइलपथ में व्हाइटस्पेस नहीं हो सकते। प्रत्येक प्रविष्टि एक owner और एक mode भी निर्दिष्ट कर सकती है, जिनका उपयोग आयात के दौरान सही अनुमतियाँ सेट करने के लिए किया जाएगा। सिंटैक्स के लिए .secrets-manifest.example देखें।
निर्यात के दौरान, मैनिफ़ेस्ट में सूचीबद्ध फ़ाइलों को एक इंटरैक्टिव प्रॉम्प्ट के माध्यम से मांगे गए पासफ़्रेज़ के साथ age के माध्यम से एन्क्रिप्ट किया जाता है (secs-man इसे कभी भी किसी फ़ाइल, तर्क या पर्यावरण चर से नहीं पढ़ता)। फ़ाइलों को डिक्रिप्ट करने के लिए आयात पर वही पासफ़्रेज़ फिर से मांगा जाता है। फ़ाइलों की अखंडता एक साथी *.sha256 फ़ाइल द्वारा सुनिश्चित की जाती है, जो अनुपलब्ध होने पर स्वचालित रूप से उत्पन्न हो जाती है। एन्क्रिप्ट की गई फ़ाइलें निर्यात लक्ष्य निर्देशिका के अंदर एक टाइमस्टैम्प्ड स्नैपशॉट में निर्यात की जाती हैं।
फ़ाइलों को तब डिक्रिप्ट और आयात किया जा सकता है, या तो निर्यात लक्ष्य निर्देशिका की ओर इंगित करके (नवीनतम स्नैपशॉट आयात करने के लिए) या इस निर्देशिका के अंदर किसी विशिष्ट स्नैपशॉट की ओर इंगित करके।
निम्नलिखित कमांड sudo के बिना चलाए जा सकते हैं, हालाँकि यदि मैनिफ़ेस्ट कमांड निष्पादित करने वाले उपयोगकर्ता से भिन्न कोई owner निर्दिष्ट करता है तो वे विफल हो जाएँगे (क्योंकि आंतरिक chown कॉल विफल हो जाएगी)।
अपनी गोपनीय जानकारी निर्यात करने के लिए, चलाएँ
sudo secs-man export /path/to/secrets /path/to/export/endpoint
किसी मौजूदा निर्यात की अखंडता सत्यापित करने के लिए (नीचे दिया गया नोट देखें), चलाएँ
# to verify the integrity of all the exported snapshots
sudo secs-man verify-export /path/to/export/endpoint
# to verify the integrity of a specific snapshot
sudo secs-man verify-export /path/to/export/endpoint/export-YYYY-MM-DD_HH-MM-SSZ
ध्यान दें कि प्रत्येक निर्यात पर स्वचालित रूप से अखंडता जाँच की जाती है। यह केवल तभी आवश्यक है जब आप किसी पुराने निर्यात की अखंडता की जाँच करना चाहते हैं जो संभवतः क्षयित और दूषित हो गया हो।
अपनी गोपनीय जानकारी आयात करने के लिए, चलाएँ
# to import the latest snapshot
sudo secs-man import /path/to/export/endpoint /path/to/secrets
# to import a specific snapshot
sudo secs-man import /path/to/export/endpoint/export-YYYY-MM-DD_HH-MM-SSZ /path/to/secrets
# to import only specific secrets
sudo secs-man import /path/to/export/endpoint /path/to/secrets --pick ssh/id_ed25519 wg/wg0.key
इस उपकरण का उपयोग दूरस्थ मशीनों पर गोपनीय जानकारी तैनात और बैकअप करने के लिए भी किया जा सकता है।
दूरस्थ गोपनीय जानकारी निर्यात करने का सबसे आसान तरीका उन्हें दूरस्थ होस्ट पर एक अस्थायी निर्देशिका में निर्यात करना है, और फिर निर्यात किए गए स्नैपशॉट को एक स्थानीय बैकअप पर कॉपी करना है। इसी तरह, स्थानीय बैकअप आयात करने का सबसे आसान तरीका स्थानीय स्नैपशॉट को दूरस्थ होस्ट पर एक अस्थायी निर्देशिका में कॉपी करना है, और फिर वहाँ से उन्हें आयात करना है। हालाँकि, इसमें यह समस्या है कि एन्क्रिप्शन/डिक्रिप्शन पासफ़्रेज़ को दूरस्थ होस्ट से होकर गुजरना पड़ता है, जिसे अविश्वसनीय माना जा सकता है।
अविश्वसनीय दूरस्थ होस्टों पर तैनात करने / से बैकअप लेने के लिए, बिना पासफ़्रेज़ को दूरस्थ मशीन से गुजारे, आप secs-man-ssh स्क्रिप्ट का उपयोग कर सकते हैं। यह स्क्रिप्ट SSH पर रूट-लॉगिन नहीं मानती (क्योंकि यह सुरक्षा कारणों से अक्षम हो सकता है), लेकिन यह मानती है कि दूरस्थ उपयोगकर्ता के पास sudo विशेषाधिकार हैं (ताकि secs-man को chown और chmod चलाने दिया जा सके)।
किसी दूरस्थ होस्ट से निर्यात करने के लिए, चलाएँ:
secs-man-ssh export <user@host> <remote-secrets-dir> <local-backup>
# The flow is the following:
# 1. the script copies the remote secrets to a temporary directory on the remote host
# 2. the temporary directory gets chowned to the remote normal user, so that it can be sudo-less read and copied locally
# 3. the temporary directory is copied on the local host and deleted from the remote host
# 4. the local directory gets exported to the local backup, then deleted
किसी दूरस्थ होस्ट पर आयात करने के लिए, चलाएँ:
# secs-man has to be installed on the remote for the script import to work
secs-man-ssh import <user@host> <local-container> <remote-secrets-dir>
# The flow is the following:
# 1. the latest snapshot gets imported to a temporary local directory with the `--skip-chown-chmod` flag, so that it can be sudo-less read and copied to the remote host
# 2. the local directory gets copied to the remote host in a temporary directory, and deleted from the local host
# 3. the remote temporary directory gets imported to the remote secrets directory with `--from-plaintext`, as the files have already been decrypted
# 4. the remote temporary directory is deleted
निर्यात की गई फ़ाइलों को एक पासफ़्रेज़ के साथ age का उपयोग करके एन्क्रिप्ट किया जाता है। निर्यात की गई फ़ाइल का नाम अतिरिक्त एक्सटेंशन .age के साथ मूल नाम होता है।
समान व्यवहार प्राप्त करने के लिए, आप निम्नलिखित का उपयोग कर सकते हैं:
age --passphrase --output filename.txt.age --encrypt filename.txt
ध्यान दें कि:
किसी निर्यात की अखंडता सत्यापित करने में यह जाँचना शामिल है कि हर चेकसम मेल खाता है। ऐसा करने के लिए, कोई व्यक्ति आसानी से चला सकता है
find . -name "sha256sums.txt" -execdir sha256sum -c sha256sums.txt \;
निर्यात किए गए स्नैपशॉट निर्देशिका में
आयात की गई फ़ाइलों को एक पासफ़्रेज़ के साथ age का उपयोग करके डिक्रिप्ट किया जाता है। आयात की गई फ़ाइल का नाम बिना .age एक्सटेंशन के निर्यात किया गया नाम होता है। यदि किसी दिए गए प्रविष्टि के लिए मैनिफ़ेस्ट में owner और/या mode निर्दिष्ट हैं, तो आयात की गई फ़ाइल निर्दिष्ट owner और mode पर सेट की जाती है। यदि कोई mode निर्दिष्ट नहीं है, तो यह डिफ़ॉल्ट रूप से 600 होता है।
समान व्यवहार प्राप्त करने के लिए, आप निम्नलिखित का उपयोग कर सकते हैं:
age --output filename.txt --decrypt filename.txt.age
# if no mode is specified, it defaults to 600
chmod <mode> filename.txt
# if no owner is specified, skip this step
chown <owner> filename.txt
ध्यान दें कि:
यह उपकरण निर्यात के दौरान स्वचालित रूप से स्नैपशॉट बनाता है जिन्हें उपकरण स्वयं साफ़ नहीं करता। इसका मतलब है कि इस उपकरण के साथ गोपनीय जानकारी निर्यात करते समय कुछ सावधानी बरती जानी चाहिए।
जब "प्रमाणीकरण" वाली गोपनीय जानकारी (SSH/WireGuard कुंजियाँ, टोकन) निर्यात की जाती है, जिन्हें आसानी से बदला जा सकता है, तो स्नैपशॉट का अस्तित्व कोई अतिरिक्त जोखिम पैदा नहीं करता।
जब "डिक्रिप्शन" वाली गोपनीय जानकारी (डिस्क कुंजियाँ, age/PGP पहचान, पासवर्ड-मैनेजर मास्टर कुंजी) निर्यात की जाती है, तो स्नैपशॉट के अस्तित्व का मतलब है कि, यदि निर्यात के अंदर की गोपनीय जानकारी लीक हो जाए और किसी तरह डिक्रिप्ट हो जाए, तो एक हमलावर वर्तमान और पिछली डिक्रिप्शन कुंजियों तक पहुँच प्राप्त कर सकता है। इस कारण से, "डिक्रिप्शन" वाली गोपनीय जानकारी बदलते समय, पुराने निर्यात किए गए स्नैपशॉट को भी हटा देना सुरक्षित होगा (जो rm -r /path/to/export/endpoint/export-YYYY-MM-DD_HH-MM-SSZ के साथ आसानी से किया जा सकता है)। ध्यान दें कि पुरानी डिक्रिप्शन कुंजियों को उजागर करने वाला महत्वपूर्ण मार्ग वर्तमान गोपनीय जानकारी के ज्ञान का भी संकेत देता है, जो संभवतः एक बड़ी चिंता है।