
Bastillion v5.2.0
Bastillion आपको आपके सभी सिस्टमों में SSH पहुँच प्रबंधित करने का एक साफ, ब्राउज़र-आधारित तरीका प्रदान करता है—जैसे एक अनुकूल डैशबोर्ड वाला बैस्टियन होस्ट।
Bastillion
SSH कंसोल और SSH कुंजी प्रबंधन के लिए एक आधुनिक, वेब-आधारित टूल।
Bastillion आपको अपने सभी सिस्टमों में SSH एक्सेस प्रबंधित करने का एक साफ, ब्राउज़र-आधारित तरीका देता है — जैसे एक बैस्टियन होस्ट जिसमें एक अनुकूल डैशबोर्ड हो। यह दो काम करता है:
-
वेब-आधारित SSH टर्मिनल — एक बार होस्ट पंजीकृत हो जाने पर, अधिकृत उपयोगकर्ता सीधे ब्राउज़र से उस पर एक या अधिक लाइव टर्मिनल सत्र खोल सकते हैं, जिसमें कमांड वैकल्पिक रूप से हर खुले सत्र में एक साथ प्रसारित होते हैं (tmux के सिंक्रनाइज़ पैन के बारे में सोचें, लेकिन स्थानीय पैन के बजाय रिमोट होस्ट के समूह के लिए)।
-
SSH कुंजी प्रबंधन — Bastillion अपनी स्वयं की SSH कुंजी जोड़ी रखता है और आपके द्वारा पंजीकृत होस्टों पर सार्वजनिक कुंजियों को पुश/रोटेट करता है, ताकि व्यक्तिगत उपयोगकर्ताओं को उन सिस्टमों के लिए दीर्घकालिक कुंजियाँ रखने या प्रबंधित करने की आवश्यकता न हो।
- 2-कारक प्रमाणीकरण (Authy या Google Authenticator) के साथ लॉगिन करें
- SSH सार्वजनिक कुंजियों को प्रबंधित और वितरित करें, और उन्हें केंद्रीय रूप से अक्षम/रोटेट करें
- सुरक्षित मल्टी-सेशन वेब शेल लॉन्च करें और सत्रों में कमांड साझा करें
- हर सत्र रिकॉर्ड करें और मांग पर उसे रीप्ले करें — किसी भी अनुपालन ढांचे के लिए ऑडिट-तैयार साक्ष्य
- सिस्टमों को प्रोफाइल में समूहित करें और नियंत्रित करें कि कौन किस तक पहुँच सकता है
- पूरे समूह में एक साथ कम्पोजिट स्क्रिप्ट सहेजें और फिर से चलाएँ
- अतिरिक्त सुरक्षा के लिए SSH पर TLS/SSL स्टैक करें

तीन वास्तविक, स्वतंत्र SSH सत्र — एक कमांड, एक बार टाइप की गई, हर जगह चलती है।
सामग्री
- यह कैसे काम करता है
- नया क्या है
- लाइसेंसिंग
- स्थापना विकल्प
- पूर्वापेक्षाएँ
- डाउनलोड और चलाएँ
- स्रोत से निर्माण
- TLS / HTTPS
- कॉन्फ़िगरेशन
- अधिक स्क्रीनशॉट
- लाइसेंस
यह कैसे काम करता है
Bastillion आपके उपयोगकर्ताओं और उन सिस्टमों के बीच बैठता है जिन तक उन्हें पहुँचने की आवश्यकता है, एक सरल पासवर्ड वॉल्ट के बजाय एक विश्वसनीय तृतीय पक्ष के रूप में कार्य करता है। यहाँ पूरा जीवनचक्र है, शुरू से अंत तक।
1. Bastillion अपनी स्वयं की SSH कुंजी जोड़ी उत्पन्न करता है
पहले स्टार्टअप पर, किसी और चीज़ से पहले, Bastillion अपने लिए एक Ed25519 कुंजी जोड़ी उत्पन्न करता है — यह एकमात्र कुंजी है जो कभी आपके होस्टों पर पुश की जाती है। यह कंसोल आउटपुट में दिखाई देती है और हमेशा सेटिंग्स के अंतर्गत दिखाई देती है।
2. एक सिस्टम पंजीकृत करें
एक व्यवस्थापक प्रबंधित करें → सिस्टम के अंतर्गत एक होस्ट जोड़ता है (उपयोगकर्ता, होस्ट, पोर्ट, और उस
होस्ट की authorized_keys फ़ाइल का पथ)। Bastillion आपके द्वारा प्रदान किए गए पासवर्ड या पासफ़्रेज़ के साथ एक बार
प्रमाणित करता है, फिर अपनी स्वयं की सार्वजनिक कुंजी को उस होस्ट की authorized_keys में पुश करता है।
उसके बाद यह उस कुंजी का उपयोग करके कनेक्ट होता है — कोई संग्रहीत पासवर्ड नहीं, कभी नहीं। कुंजी के स्थान पर होते ही
स्थिति सफल में बदल जाती है।

3. सिस्टमों को प्रोफाइल में समूहित करें, उपयोगकर्ताओं को असाइन करें
सिस्टमों को नामित प्रोफाइल में समूहित किया जाता है — "प्रोडक्शन," "स्टेजिंग," "डेटाबेस टियर" के बारे में सोचें। फिर उपयोगकर्ताओं को प्रबंधित करें → उपयोगकर्ता के अंतर्गत प्रोफाइल से जोड़ा जाता है, जो केवल यह नियंत्रित करता है कि कौन किस तक पहुँच सकता है। एक प्रोफाइल असाइनमेंट रद्द करें और वह पहुँच तुरंत समाप्त हो जाती है, किसी कुंजी रोटेशन की आवश्यकता नहीं।

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

5. कुंजियों को केंद्रीय रूप से रोटेट या रद्द करें
क्योंकि हर होस्ट समान एप्लिकेशन कुंजी पर भरोसा करता है (प्रति उपयोगकर्ता एक कुंजी नहीं), इसे SSH कुंजियाँ प्रबंधित करें के अंतर्गत एक बार अक्षम करने से हर जगह तुरंत एक्सेस रद्द हो जाता है — लक्ष्य सिस्टमों को हाथ से छूने की आवश्यकता नहीं, यह खोजने की आवश्यकता नहीं कि किस सर्वर पर कौन सी पुरानी कुंजी है।

6. हर सत्र रिकॉर्ड किया जाता है — ऑडिट और रीप्ले
उन टर्मिनलों में टाइप की गई हर चीज़ और लौटाया गया हर बाइट स्वचालित रूप से रिकॉर्ड किया जाता है। प्रबंधक ऑडिट सत्र खोलते हैं, उपयोगकर्ता या सिस्टम द्वारा फ़िल्टर करते हैं, और किसी भी सत्र को रीप्ले करते हैं — कई होस्टों में फैले सत्रों के लिए साथ-साथ, महत्वपूर्ण पंक्तियों तक सीधे कूदने के लिए टेक्स्ट फ़िल्टर के साथ। आउटपुट लोड होते ही पृष्ठ में स्ट्रीम होता है, इसलिए सैकड़ों मेगाबाइट लॉग डंप करने वाला सत्र भी बिना किसी परेशानी के रीप्ले होता है।
यदि आपको एक ऑडिटर को दिखाने की आवश्यकता है कि किसने क्या, कहाँ और कब चलाया — यह वह साक्ष्य है,
बॉक्स से बाहर कैप्चर किया गया। व्यावहारिक रूप से हर अनुपालन ढांचे में कहीं न कहीं विशेषाधिकार-प्राप्त एक्सेस
ऑडिट-ट्रेल आवश्यकता होती है (PCI DSS, HIPAA, SOC 2, ISO 27001 — अपना चुनें), और
यह एक वाणिज्यिक PAM उत्पाद के बिना उस बॉक्स को चेक करता है। सत्र डिफ़ॉल्ट रूप से 90 दिनों के लिए रखे जाते हैं
(deleteAuditLogAfter), और रिकॉर्डिंग को ENABLE_INTERNAL_AUDIT=false के साथ बंद किया जा सकता है —
ऑडिटिंग देखें।

🚀 नया क्या है
- SAML 2.0 SSO — एक एंटरप्राइज़ IdP (Entra ID, Okta, ADFS, और अन्य) के माध्यम से साइन इन करें — कॉन्फ़िगरेशन देखें
- लाइसेंसिंग — 8 सिस्टमों तक मुफ्त, भुगतान टियर loophole.company/pricing.html पर उपलब्ध (नीचे लाइसेंसिंग देखें)
- सत्र ऑडिट और रीप्ले, डिफ़ॉल्ट रूप से चालू — हर टर्मिनल सत्र रिकॉर्ड किया जाता है और ऑडिट सत्र के अंतर्गत रीप्ले किया जा सकता है, ब्राउज़र में स्ट्रीम किया जाता है ताकि विशाल सत्र भी तुरंत लोड हों
- बॉक्स से बाहर HTTPS के साथ एक स्व-निहित jar (
java -jar) के रूप में चलता है — डाउनलोड और चलाएँ देखें - Java 21, Jetty 12, और Jakarta EE 10 में अपग्रेड किया गया
- Ed25519 (डिफ़ॉल्ट) और Ed448 SSH कुंजियों के लिए पूर्ण समर्थन
- मौजूदा इंस्टेंस से उपयोगकर्ताओं, सिस्टमों, कुंजियों और ऑडिट लॉग को लाने के लिए v4 → v5 माइग्रेशन टूल —
tools/migrateदेखें - CSRF फ़िल्टर और ऐप-व्यापी सुरक्षा हेडर के साथ सख्त किया गया
लाइसेंसिंग
Bastillion बिना लाइसेंस के 8 पंजीकृत सिस्टमों तक चलता है — खरीदने से पहले इसे वास्तव में आज़माने के लिए पर्याप्त। एक लाइसेंस उस सीमा को बढ़ाता है।
- loophole.company/pricing.html पर एक लाइसेंस खरीदें
(स्टार्टर/टीम/बिज़नेस — सिस्टम संख्या द्वारा मूल्य निर्धारित)। भुगतान वापस रीडायरेक्ट करता है और स्वचालित रूप से एक
.licफ़ाइल डाउनलोड करता है। .licफ़ाइल खोलें और उसकी सामग्री कॉपी करें (एक पंक्ति)।- इसे
LICENSE_KEYपर्यावरण चर के माध्यम से सेट करें: ```bash export LICENSE_KEY=
या इसे BastillionConfig.properties में licenseKey में पेस्ट करें — यदि दोनों सेट हैं तो
पर्यावरण चर को प्राथमिकता दी जाती है।
4. Bastillion को पुनः आरंभ करें। Settings लाइसेंसधारक, सिस्टम क्षमता और समाप्ति दिखाता है, जिसमें
समाप्ति से 90 दिन पहले एक चेतावनी शुरू होती है।
लाइसेंस वार्षिक होते हैं और स्वतः नवीनीकृत नहीं होते — कोई कार्ड फ़ाइल पर नहीं रखा जाता। जब आपको समाप्ति चेतावनी मिले तो उसी मूल्य निर्धारण पृष्ठ से पुनः खरीदें।
इंस्टॉलेशन विकल्प
निःशुल्क: https://github.com/bastillion-io/Bastillion/releases
पूर्वापेक्षाएँ
Java 21 (OpenJDK)```bash
apt-get install openjdk-21-jdk
### प्रमाणक (2FA के लिए)
| एप्लिकेशन | Android | iOS |
|--------------|----------|-----|
| **Authy** | [Google Play](https://play.google.com/store/apps/details?id=com.authy.authy) | [iTunes](https://itunes.apple.com/us/app/authy/id494168017) |
| **Google Authenticator** | [Google Play](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2) | [iTunes](https://itunes.apple.com/us/app/google-authenticator/id388497605) |
---
## डाउनलोड और चलाएं
नवीनतम jar फ़ाइल [Releases](https://github.com/bastillion-io/Bastillion/releases) से डाउनलोड करें:```bash
java -jar bastillion-<version>.jar
ब्राउज़र में एक्सेस करें: https://<server-ip>:8443 — नीचे TLS / HTTPS देखें, जो
पहली बार चलाने पर Bastillion द्वारा उत्पन्न self-signed प्रमाणपत्र के लिए है।
डिफ़ॉल्ट क्रेडेंशियल:``` username: admin password: changeme
फोरग्राउंड में चलता है; Ctrl+C से रोकें। बैकग्राउंड/डेमॉन संचालन के लिए वही उपयोग करें जो आपका
प्लेटफ़ॉर्म सामान्यतः लंबे समय तक चलने वाली Java प्रक्रिया के लिए उपयोग करता है — `nohup java -jar ... &`, एक systemd
यूनिट, एक कंटेनर, आदि।
---
## स्रोत से निर्माण करें
Maven 3+ स्थापित करें:```bash
apt-get install maven
Build and run (एक self-contained jar को embedded Jetty server के साथ पैकेज करता है — देखें
io.bastillion.Main — और इसे चलाता है):```bash
mvn package
java -jar target/bastillion-5.0.0-SNAPSHOT.jar
या स्थानीय डेवलपमेंट के लिए, हर बदलाव पर रीपैकेजिंग के बिना:```bash
mvn compile exec:java
https://localhost:8443 पर डिफ़ॉल्ट रूप से सुनता है, ठीक वैसे ही जैसे ऊपर डाउनलोड किया गया रिलीज़ — देखें
TLS / HTTPS नीचे कि वह प्रमाणपत्र कैसे सेट होता है और अपना खुद का कैसे उपयोग करें।
TLS / HTTPS
Bastillion पहली बार शुरू होने पर अपना खुद का self-signed प्रमाणपत्र उत्पन्न करता है और HTTPS पर सेवा देता है —
कॉन्फ़िगर करने के लिए कुछ भी नहीं। ब्राउज़र एक बार चेतावनी दिखाएंगे (यह self-signed है, किसी CA द्वारा जारी नहीं किया गया);
उसे क्लिक करके पार करें, ठीक वैसे ही जैसे आप किसी अन्य self-hosted उपकरण के लिए करते हैं। प्रमाणपत्र और उसका पासवर्ड
रीस्टार्ट के बीच बने रहते हैं (keystore/bastillion.p12 CONFIG_DIR के अंतर्गत, पासवर्ड उसी
एन्क्रिप्टेड तरीके से संग्रहीत होता है जैसे डेटाबेस पासवर्ड)।
अपना खुद का CA-हस्ताक्षरित प्रमाणपत्र उपयोग करें, self-signed डिफ़ॉल्ट के बजाय — उदाहरण के लिए Let's Encrypt से एक मुफ्त:
- certbot के साथ प्रमाणपत्र जारी करें (इसके लिए इस होस्ट की ओर इशारा करता एक वास्तविक DNS नाम
चाहिए, और HTTP-01 चुनौती के लिए पोर्ट 80 तक पहुंच होनी चाहिए): ```bash
sudo certbot certonly --standalone -d bastillion.example.com
यह fullchain.pem और privkey.pem को
/etc/letsencrypt/live/bastillion.example.com/ में लिखता है।
- सर्ट/की जोड़ी को PKCS12 में बदलें, जो कि कीस्टोर फॉर्मेट है जिसकी Bastillion अपेक्षा करता है: ```bash
openssl pkcs12 -export
-in /etc/letsencrypt/live/bastillion.example.com/fullchain.pem
-inkey /etc/letsencrypt/live/bastillion.example.com/privkey.pem
-out bastillion.p12 -name bastillion -passout pass:changeit - Bastillion को इसकी ओर इंगित करें और पुनः आरंभ करें: ```bash
export KEYSTORE_PATH=/path/to/bastillion.p12
export KEYSTORE_PASSWORD=changeit
ब्राउज़र अब बिना किसी चेतावनी के कनेक्शन पर भरोसा करेंगे। Let's Encrypt प्रमाणपत्र हर 90 दिनों में समाप्त हो जाते हैं — certbot renew के बाद चरण 2–3 को फिर से चलाना (और एक रीस्टार्ट) इसे अद्यतित रखता है; certbot renew --deploy-hook इसे स्वचालित कर सकता है।
किसी रिवर्स प्रॉक्सी या लोड बैलेंसर के पीछे जो पहले से ही TLS समाप्त करता है (nginx, Cloud Run, आदि) — Bastillion की अपनी HTTPS अक्षम करें और इसे इसके बजाय सादा HTTP परोसने दें:```bash export TLS_ENABLED=false
डिफ़ॉल्ट रूप से इस मोड में पोर्ट 8080 उपयोग होता है; इसे बदलने के लिए `PORT` सेट करें।
---
## कॉन्फ़िगरेशन
नीचे दी गई हर सेटिंग को **पर्यावरण चर** के रूप में सेट किया जा सकता है — प्रॉपर्टी का नाम लें और
प्रत्येक बड़े अक्षर से पहले एक अंडरस्कोर डालें, फिर उसे बड़े अक्षरों में बदलें: `licenseKey` →
`LICENSE_KEY`, `dbUser` → `DB_USER`, `sshKeyType` → `SSH_KEY_TYPE`. यह Bastillion को कॉन्फ़िगर करने का
अनुशंसित तरीका है, विशेष रूप से कंटेनरों में — माउंट करने या बेक करने के लिए कोई फ़ाइल नहीं।
`BastillionConfig.properties` अभी भी फ़ॉलबैक के रूप में काम करता है (यदि दोनों सेट हैं तो पर्यावरण चर हमेशा जीतते हैं),
और यहीं पर Bastillion पहली बार स्टार्टअप पर आपके लिए उत्पन्न करने वाला कोई भी मान — जैसे कि एक यादृच्छिक
DB पासवर्ड — संग्रहीत होता है। सेटिंग्स और उनके डिफ़ॉल्ट की पूरी सूची के लिए `src/main/resources/BastillionConfig.properties` देखें।
**सब कुछ एक निर्देशिका के अंतर्गत समेकित करना** (जैसे एक एकल Docker वॉल्यूम माउंट):
`CONFIG_DIR` वह एक सेटिंग है जिसे आपको उपयोग करना चाहिए। Bastillion जो कुछ भी संग्रहीत करता है —
`BastillionConfig.properties`, सेल्फ-साइन्ड TLS कीस्टोर (`keystore/bastillion.p12`),
H2 डेटाबेस और SSH होस्ट कुंजी जोड़ी (दोनों `keydb/` के अंतर्गत), और `bastillion.jceks` —
डिफ़ॉल्ट रूप से इसके अंतर्गत रहता है, इसलिए `CONFIG_DIR` को एक स्थान पर इंगित करने से यह सब स्थानांतरित हो जाता है:```bash
export CONFIG_DIR=/data/bastillion/
KEYSTORE_PATH और DB_CONNECTION_URL अभी भी मौजूद हैं ताकि उनमें से केवल एक को किसी अलग स्थान पर इंगित किया जा सके (एक वास्तविक प्रमाणपत्र, एक दूरस्थ DB) — TLS / HTTPS और नीचे "Database Settings" अनुभाग देखें — लेकिन सब कुछ CONFIG_DIR में समेकित करने के लिए इनमें से किसी की भी आवश्यकता नहीं है।
CONFIG_DIR स्वयं कार्यशील निर्देशिका के सापेक्ष ./config पर डिफ़ॉल्ट होता है। किसी मौजूदा इंस्टेंस को अपग्रेड कर रहे हैं जिसने इसे कभी सेट नहीं किया? पुराने रिलीज़ ने स्थिति को सीधे कार्यशील निर्देशिका में संग्रहीत किया था, न कि ./config में — Bastillion इस संस्करण के साथ पहले स्टार्टअप पर इसका पता लगाता है और इसे स्वचालित रूप से ./config (या CONFIG_DIR में, यदि आपने अब इसे सेट किया है) में स्थानांतरित कर देता है।
SSH Key Management
```bash # Disable key management (append instead of overwrite) export KEY_MANAGEMENT_ENABLED=falseauthorized_keys refresh interval in minutes (no refresh for <=0)
export AUTH_KEYS_REFRESH_INTERVAL=120
Force user key generation and strong passphrases
export FORCE_USER_KEY_GENERATION=false
</details>
<details>
<summary><strong>कस्टम SSH कुंजी जोड़ी</strong></summary>
डिफ़ॉल्ट रूप से Bastillion पहली बार शुरू होने पर अपनी खुद की Ed25519 कुंजी जोड़ी उत्पन्न करता है। अपनी खुद की कुंजी उपयोग करने के लिए,
सबसे आसान तरीका UI के माध्यम से है: **Settings → Replace Application SSH Key**
(केवल प्रबंधक खाते) — एक निजी कुंजी, सार्वजनिक कुंजी, और पासफ़्रेज़ (यदि है) पेस्ट करें,
और यह तुरंत प्रभावी हो जाता है, किसी पुनःआरंभ की आवश्यकता नहीं है।
⚠️ यह उस *एक* कुंजी को बदलता है जिस पर हर पंजीकृत सिस्टम भरोसा करता है। यह एक बार का कदम है
जब पहली बार Bastillion सेट कर रहे हों, **इससे पहले** कि आपने कोई सिस्टम पंजीकृत किया हो — यदि आपके पास
पहले से सिस्टम पंजीकृत हैं, तो कुंजी बदलते ही Bastillion उन सभी तक SSH पहुंच खो देता है,
जब तक कि यह सटीक कुंजी पहले से ही उन सभी के `authorized_keys` में मौजूद न हो।
एक बार सिस्टम पंजीकृत होने के बाद Settings पृष्ठ पर एक अतिरिक्त पुष्टिकरण चेकबॉक्स की आवश्यकता होती है,
ठीक इसी कारण से।
**क्या आपके पास पहले से सिस्टम पंजीकृत हैं और फिर भी कुंजी घुमाने की आवश्यकता है?** नई कुंजी को
हर जगह `authorized_keys` को हाथ से संपादित करने के बजाय Bastillion के माध्यम से ही पहले से तैयार करें:
1. `FORCE_USER_KEY_GENERATION=false` सेट करें ताकि **Manage SSH Keys → Add SSH Key** आपको
केवल नई कुंजी उत्पन्न करने के बजाय मौजूदा सार्वजनिक कुंजी पेस्ट करने दे।
2. वहां आपके सभी सिस्टम को कवर करने वाले प्रोफ़ाइल के विरुद्ध नई कुंजी जोड़ें, और पुष्टि करें (Manage SSH Keys के अंतर्गत,
या प्रत्येक सिस्टम की स्थिति में) कि यह वास्तव में हर जगह पहुंच गई है — `AUTH_KEYS_REFRESH_INTERVAL` को ध्यान में रखें,
क्योंकि यही इसे बाहर भेजता है।
3. केवल जब आप सुनिश्चित हों कि यह हर सिस्टम पर है, तब Settings में एप्लिकेशन कुंजी बदलें।
4. `FORCE_USER_KEY_GENERATION` को उसके पिछले मान पर वापस सेट करें, फिर एक बार आपने पुष्टि कर ली
कि नई एप्लिकेशन कुंजी हर सिस्टम पर प्रसारित हो गई है (फिर से, `AUTH_KEYS_REFRESH_INTERVAL` का ध्यान रखें),
तो चरण 2 में जोड़ी गई कुंजी को Manage SSH Keys से हटा दें — यह केवल `authorized_keys` को पहले से भरने के लिए
वहां रखी गई थी और आगे के लिए आवश्यक नहीं है।
स्क्रिप्टेड/हेडलेस सेटअप के लिए, वही काम पर्यावरण चर और एक पुनःआरंभ के माध्यम से किया जा सकता है:```bash
# Regenerate and import SSH keys
export RESET_APPLICATION_SSH_KEY=true
# Private key
export PRIVATE_KEY=/Users/you/.ssh/id_rsa
# Public key
export PUBLIC_KEY=/Users/you/.ssh/id_rsa.pub
# Passphrase (leave blank if none)
export DEFAULT_SSH_PASSPHRASE=myPa$$w0rd
एक बार पंजीकृत हो जाने पर, आप इन्हें हटा सकते हैं — कुंजी जोड़ी पहले से ही डेटाबेस में संग्रहीत है।
SSH_KEY_TYPE (rsa, ecdsa, ed25519, या ed448) केवल तब मायने रखता है जब Bastillion एक नई कुंजी उत्पन्न कर रहा हो, न कि किसी को आयात करते समय — आयातित कुंजी का प्रकार कुंजी से ही पढ़ा जाता है:```bash
SSH key type ('rsa', 'ecdsa', 'ed25519', or 'ed448')
Supported options:
rsa - Classic, widely compatible (configurable length, default 4096)
ecdsa - Faster, smaller keys (P-256/384/521 curves)
ed25519 - Default and recommended (≈ RSA-4096, secure and fast)
ed448 - Extra-strong (≈ RSA-8192, slower and less supported)
export SSH_KEY_TYPE=ed25519
</details>
<details>
<summary><strong>डेटाबेस सेटिंग्स</strong></summary>
एम्बेडेड H2 उदाहरण:```bash
export DB_USER=bastillion
export DB_PASSWORD=p@$$w0rd!!
export DB_DRIVER=org.h2.Driver
export DB_CONNECTION_URL=jdbc:h2:file:keydb/bastillion;CIPHER=AES;
दूरस्थ H2 उदाहरण:```bash export DB_CONNECTION_URL=jdbc:h2:tcp://:/~/bastillion;CIPHER=AES;
</details>
<details>
<summary><strong>बाह्य प्रमाणीकरण (LDAP / JAAS)</strong></summary>
स्थानीय पासवर्ड के बजाय (या उनके साथ) किसी मौजूदा LDAP/Active Directory सर्वर के विरुद्ध प्रमाणीकरण करें। इसे सक्षम करें:```bash
export JAAS_MODULE=ldap-ol
jaas.conf कॉन्फ़िगर करें:```
ldap-ol {
com.sun.security.auth.module.LdapLoginModule SUFFICIENT
userProvider="ldap://hostname:389/ou=example,dc=bastillion,dc=com"
userFilter="(&(uid={USERNAME})(objectClass=inetOrgPerson))"
authzIdentity="{cn}"
useSSL=false
debug=false;
};
LDAP भूमिकाओं को Bastillion प्रोफाइल से मैप करने के लिए:```
ldap-ol-with-roles {
org.eclipse.jetty.security.jaas.spi.LdapLoginModule required
debug="false"
useLdaps="false"
contextFactory="com.sun.jndi.ldap.LdapCtxFactory"
hostname="<SERVER>"
port="389"
bindDn="<BIND-DN>"
bindPassword="<BIND-DN PASSWORD>"
authenticationMethod="simple"
forceBindingLogin="true"
userBaseDn="ou=users,dc=bastillion,dc=com"
userRdnAttribute="uid"
userIdAttribute="uid"
userPasswordAttribute="userPassword"
userObjectClass="inetOrgPerson"
roleBaseDn="ou=groups,dc=bastillion,dc=com"
roleNameAttribute="cn"
roleMemberAttribute="member"
roleObjectClass="groupOfNames";
};
प्रशासक पहले लॉगिन पर जोड़े जाते हैं और उन्हें सिस्टम प्रोफाइल सौंपी जा सकती हैं।
भूमिका मैपिंग वास्तव में कैसे काम करती है: एक उपयोगकर्ता जिस भी LDAP समूह से संबंधित होता है (ऊपर roleBaseDn/
roleMemberAttribute के अनुसार), वह एक "भूमिका नाम" बन जाता है - उस समूह के
roleNameAttribute (cn ऊपर के उदाहरण में) का मान। हर लॉगिन पर, Bastillion उन
भूमिका नामों में से प्रत्येक की तुलना, सटीक टेक्स्ट मिलान द्वारा, उन प्रोफाइलों के नामों से करता है जिन्हें आपने
Manage → Profiles के अंतर्गत बनाया है। एक मिलान उपयोगकर्ता को उस प्रोफाइल को सौंप देता है; कोई मिलान नहीं, उस
प्रोफाइल तक कोई पहुंच नहीं। इसलिए यदि कोई उपयोगकर्ता LDAP समूह cn=admins,ou=groups,... का सदस्य है, तो आपको
Bastillion में सचमुच admins नाम की एक प्रोफाइल चाहिए (पूंजीकरण को छोड़कर - तुलना
केस-असंवेदनशील है, वर्तनी नहीं है) ताकि उस सदस्यता का Bastillion में कोई अर्थ हो। इसके लिए
कोई अलग मैपिंग चरण या UI नहीं है - नामों का बस मेल खाना आवश्यक है।
एक उपयोगकर्ता जिसकी भूमिकाएं किसी Bastillion प्रोफाइल से मेल नहीं खातीं, उसे लॉगिन पर अस्वीकार कर दिया जाता है (Manager खाते
एकमात्र अपवाद हैं; वे प्रोफाइल-स्कोप वाले नहीं हैं)। defaultProfileForLdap को एक प्रोफाइल नाम पर सेट करें
ताकि हर LDAP उपयोगकर्ता को स्वचालित रूप से उसे सौंपा जा सके, जिससे यह सुनिश्चित हो कि भूमिका मिलान की परवाह किए बिना हर कोई लॉगिन कर सके - यह एक सुरक्षा जाल के रूप में उपयोगी है जबकि आप अभी भी अपनी निर्देशिका के समूह नामों के साथ प्रोफाइल नामों को संरेखित कर रहे हैं:```bash
export DEFAULT_PROFILE_FOR_LDAP=everyone
</details>
<details>
<summary><strong>सिंगल साइन-ऑन (SAML 2.0)</strong></summary>
किसी एंटरप्राइज़ आइडेंटिटी प्रोवाइडर - Microsoft Entra ID, Okta, ADFS, या किसी भी
SAML 2.0 IdP - के विरुद्ध प्रमाणीकरण करें, स्थानीय पासवर्ड या LDAP के बजाय (या उनके साथ)। कॉन्फ़िगर होने के बाद लॉगिन पेज पर एक **Sign in with SSO**
बटन दिखाई देता है। इसे सक्षम करें:```bash
export SAML_BASE_URL=https://bastillion.example.com
export SAML_IDP_METADATA_URL=https://login.microsoftonline.com/<tenant-id>/federationmetadata/2007-06/federationmetadata.xml?appid=<app-id>
In Entra ID (या आपके पसंदीदा IdP) में, Bastillion को एक Enterprise Application / Service Provider के रूप में पंजीकृत करें, जिसमें:
- Identifier (Entity ID):
https://bastillion.example.com(याSAML_SP_ENTITY_IDयदि सेट हो - नीचे देखें) - Reply URL (Assertion Consumer Service URL):
https://bastillion.example.com/saml/acs
कोई IdP metadata URL हाथ में नहीं है? इसके बजाय IdP को मैन्युअल रूप से कॉन्फ़िगर करें - उस स्थिति में तीनों की एक साथ आवश्यकता होती है:```bash export SAML_IDP_ENTITY_ID=https://sts.windows.net// export SAML_IDP_SSO_URL=https://login.microsoftonline.com//saml2 export SAML_IDP_CERT=
केवल तभी आवश्यक है जब IdP पक्ष पर पंजीकृत Entity ID `SAML_BASE_URL` से बिल्कुल मेल नहीं खा सकती:```bash
export SAML_SP_ENTITY_ID=https://bastillion.example.com
Entra समूह/भूमिका दावों को Bastillion प्रोफाइल में मैप करने के लिए (नीचे "भूमिका मैपिंग वास्तव में कैसे काम करती है" देखें, इससे पहले कि आप SAML_ROLE_ATTRIBUTE को इसके डिफ़ॉल्ट से बदलें):```bash
export SAML_ROLE_ATTRIBUTE=http://schemas.microsoft.com/ws/2008/06/identity/claims/groups
export DEFAULT_PROFILE_FOR_SAML=everyone
पहले SSO लॉगिन पर एडमिन जोड़े जाते हैं और उन्हें सिस्टम प्रोफाइल असाइन की जा सकती हैं।
**Bastillion में दिखाया गया उपयोगकर्ता नाम:** SAML NameID उपयोगकर्ता नाम बन जाता है। Entra डिफ़ॉल्ट रूप से
`user.userprincipalname` भेजता है, जो नियमित टेनेंट सदस्यों के लिए ठीक है, लेकिन B2B मेहमानों (वे सभी जो
व्यक्तिगत या बाहरी ईमेल से साइन इन करते हैं और मेहमान के रूप में जोड़े गए हैं) के लिए एक बदसूरत
गेस्ट UPN उत्पन्न करता है जैसे `alice_gmail.com#EXT#@yourtenant.onmicrosoft.com`। एक साफ-सुथरे उपयोगकर्ता नाम के लिए,
Enterprise Application के *Single sign-on* → SAML → *Attributes & Claims* पर जाएं, **Unique
User Identifier (Name ID)** को संपादित करें, और इसका *Source attribute* `user.userprincipalname`
से बदलकर `user.mail` कर दें।
**भूमिका मैपिंग वास्तव में कैसे काम करती है - ऊपर LDAP के समान तंत्र:** `SAML_ROLE_ATTRIBUTE`
यह निर्दिष्ट करता है कि *कौन सा* assertion विशेषता उपयोगकर्ता के समूहों/भूमिकाओं को ले जाती है; किसी दिए गए लॉगिन पर
उस विशेषता में जो भी *मान* होते हैं, उनकी तुलना **सटीक टेक्स्ट मिलान द्वारा**, आपके द्वारा **Manage → Profiles** के तहत
बनाई गई Profiles के नामों से की जाती है। एक मान जो किसी प्रोफाइल नाम से मेल खाता है, उपयोगकर्ता को उसे
असाइन कर देता है; दावे के बारे में और कुछ भी मायने नहीं रखता। इसलिए एक Bastillion प्रोफाइल का नाम
बिल्कुल उसी स्ट्रिंग के समान होना चाहिए जो assertion भेजता है - कोई अलग मैपिंग चरण
या UI नहीं है, नामों को बस एक-दूसरे से मेल खाना होता है।
यह वह हिस्सा है जो विशेष रूप से Entra ID के साथ लोगों को सबसे अधिक परेशान करता है: डिफ़ॉल्ट रूप से,
Entra का समूह दावा प्रत्येक समूह को उसके **Object ID** (एक GUID) के रूप में उत्सर्जित कर सकता है, न कि उसके प्रदर्शन
नाम के रूप में, जब तक कि Enterprise Application का टोकन कॉन्फ़िगरेशन स्पष्ट रूप से समूह **नाम** उत्सर्जित करने के लिए सेट न हो।
यदि आपकी Bastillion प्रोफाइल के नाम `admins`/`everyone` जैसे हैं, लेकिन Entra
GUID भेज रहा है, तो कभी कुछ मेल नहीं खाएगा। यह मानने से पहले कि मैपिंग टूटी हुई है, वास्तविक assertion (या
ऐप के लिए Entra का टोकन कॉन्फ़िगरेशन) में वास्तविक दावा मान जांचें - यह आमतौर पर
यही होता है, Bastillion-पक्ष की समस्या नहीं। इसे ठीक करने के तीन तरीके, हमारी अनुशंसा के क्रम में:
1. **समूह दावों के बजाय Entra App Roles का उपयोग करें (सबसे साफ)।** ऐप के पंजीकरण →
App roles के तहत, बिल्कुल उन मानों के साथ भूमिकाएँ परिभाषित करें जो आप चाहते हैं (`admins`, `everyone`, ...), फिर
Enterprise Application के *Users and groups* के तहत उन भूमिकाओं को उपयोगकर्ताओं/समूहों को असाइन करें।
SAML टोकन को `roles` दावा उत्सर्जित करने के लिए कॉन्फ़िगर करें, और `SAML_ROLE_ATTRIBUTE` को उस
दावे के URI पर इंगित करें, न कि समूह दावे पर। आप वह सटीक स्ट्रिंग चुनते हैं जो Entra भेजता है - कोई GUID
समस्या नहीं, और यह वैसे भी AD समूहों को पुनः उपयोग करने की तुलना में एक साफ अधिकृतकरण मॉडल है।
2. **समूह दावे की स्रोत विशेषता बदलें।** Enterprise Application → Single sign-on →
SAML → *Attributes & Claims* → Groups दावे को संपादित करें → एक *Source attribute*
ड्रॉपडाउन है, जो सामान्यतः Group ID पर डिफ़ॉल्ट होता है। आपके टेनेंट और समूह क्लाउड-केवल हैं या
ऑन-प्रिम AD से सिंक किए गए हैं, इस पर निर्भर करते हुए, आप इसे `sAMAccountName`
या एक प्रदर्शन-नाम विकल्प पर स्विच करने में सक्षम हो सकते हैं - सटीक विकल्प टेनेंट और Entra पोर्टल संस्करण के अनुसार भिन्न होते हैं, इसलिए
एक विशिष्ट लेबल मानने के बजाय जांचें कि वास्तव में क्या पेश किया गया है।
3. **या इससे न लड़ें - Bastillion प्रोफाइल का नाम उसी के अनुसार रखें जो Entra वास्तव में भेजता है।** यदि
Entra GUID भेजने पर जोर देता है, तो एक Bastillion प्रोफाइल बनाएं जिसका नाम सचमुच वह GUID हो।
बदसूरत, लेकिन Entra-पक्ष के पुनर्संरचना की शून्य आवश्यकता।
जिस उपयोगकर्ता के दावे किसी Bastillion प्रोफाइल से मेल नहीं खाते, उसे लॉगिन पर अस्वीकार कर दिया जाता है (**Manager** खाते
एकमात्र अपवाद हैं; वे प्रोफाइल-स्कोप्ड नहीं हैं) - बिल्कुल LDAP की तरह, इसलिए
ऊपर `DEFAULT_PROFILE_FOR_SAML` सेट करना उसी कारण से उचित है जिस कारण
`DEFAULT_PROFILE_FOR_LDAP` है: एक सुरक्षा जाल जबकि आप अभी भी प्रोफाइल नामों को
अपने IdP के दावा मानों के साथ संरेखित कर रहे हैं।
Bastillion की अपनी एक-बार-पासकोड जांच SSO लॉगिन के लिए छोड़ दी जाती है - IdP से अपेक्षा की जाती है कि
वह अपनी स्वयं की MFA/Conditional Access नीति लागू करे। पहली बार OTP नामांकन अभी भी
पेश किया जाता है ताकि SAML उपयोगकर्ताओं के पास एक स्थानीय फ़ॉलबैक क्रेडेंशियल उपलब्ध हो यदि SSO कभी अक्षम हो।
**हस्ताक्षरित अनुरोध और एन्क्रिप्टेड assertions:** Bastillion अपना स्वयं का SAML हस्ताक्षर
प्रमाणपत्र स्वचालित रूप से उत्पन्न करता है (स्व-हस्ताक्षरित, उसी तरह जैसे यह अपना TLS प्रमाणपत्र उत्पन्न करता है)
पहली बार जब इसकी आवश्यकता होती है, और उसके बाद हर बाहरी AuthnRequest पर इसके साथ हस्ताक्षर करता है - कोई
सेटअप आवश्यक नहीं है, और हानिरहित भी है भले ही आपका IdP इसे जांचे नहीं। उस प्रमाणपत्र को मानक SP
मेटाडेटा रूप में प्राप्त करने के लिए `https://bastillion.example.com/saml/metadata` लाएं
और इसे अपने IdP एडमिन को सौंप दें यदि उन्हें Bastillion के हस्ताक्षरित
अनुरोधों को सत्यापित करना चाहिए, या Bastillion के लिए assertions एन्क्रिप्ट करनी चाहिए - अधिकांश IdP एक SP मेटाडेटा
URL को सीधे आयात कर सकते हैं, बजाय एक कच्चे प्रमाणपत्र को चिपकाने के। यदि आप स्वचालित रूप से उत्पन्न एक के बजाय एक वास्तविक (जैसे
CA-जारी) कुंजी जोड़ी का उपयोग करना पसंद करते हैं, तो `SAML_SP_KEYSTORE_PATH`/
`SAML_SP_KEYSTORE_PASSWORD` को उस युक्त PKCS12 कीस्टोर पर इंगित करें। एन्क्रिप्टेड assertions की *आवश्यकता* के लिए
(डिफ़ॉल्ट रूप से बंद - इसे केवल तभी चालू करें जब आपका IdP वास्तव में Bastillion के प्रमाणपत्र के लिए
एन्क्रिप्ट करने के लिए कॉन्फ़िगर किया गया हो, अन्यथा हर लॉगिन विफल होना शुरू हो जाएगा):```bash
export SAML_WANT_ENCRYPTED_ASSERTIONS=true
वर्तमान में समर्थित नहीं: सिंगल लॉगआउट (SLO) - लॉगआउट केवल स्थानीय रहता है, और यह IdP या किसी अन्य एप्लिकेशन को नहीं बताता जिसमें आप उसी SSO सत्र के माध्यम से साइन इन थे। SAML SSO को LDAP के साथ सक्षम किया जा सकता है; दोनों का स्वतंत्र रूप से मूल्यांकन किया जाता है और पहले लॉगिन पर कोई भी नए उपयोगकर्ता प्रावधानित कर सकता है।
ऑडिटिंग
सत्र ऑडिटिंग डिफ़ॉल्ट रूप से सक्षम है: टर्मिनल आउटपुट Bastillion के डेटाबेस में संग्रहीत किया जाता है और इसे ऑडिट सत्र के अंतर्गत समीक्षा की जा सकती है (केवल प्रबंधक खाते)। आउटपुट ब्राउज़र पर स्ट्रीम किया जाता है, इसलिए बहुत बड़ी मात्रा में टर्मिनल आउटपुट वाले सत्रों को भी दोबारा चलाया जा सकता है। ऑडिट इतिहास deleteAuditLogAfter दिनों (डिफ़ॉल्ट रूप से 90) के लिए रखा जाता है। इसे इसके साथ अक्षम करें:```bash
export ENABLE_INTERNAL_AUDIT=false
यहाँ एक फ़ाइल-आधारित ऑडिट लॉग भी है, जो डिफ़ॉल्ट रूप से अक्षम है। इसे **log4j2.xml** में निम्न को अनकमेंट करके सक्षम करें:
- `io.bastillion.manage.util.SystemAudit`
- `audit-appender`
> https://github.com/bastillion-io/Bastillion/blob/main/src/main/resources/log4j2.xml#L19-L22
</details>
<details>
<summary><strong>v4 से माइग्रेट करना</strong></summary>
पुराने Bastillion v4 इंस्टॉलेशन से अपग्रेड कर रहे हैं और अपने उपयोगकर्ताओं, सिस्टम, प्रोफाइल,
स्क्रिप्ट्स, और (सबसे महत्वपूर्ण) एप्लिकेशन की मौजूदा SSH कीपेयर को शुरू से शुरू करने के बजाय
बनाए रखना चाहते हैं? `tools/migrate/` में इसके लिए एक स्टैंडअलोन माइग्रेशन टूल है — यह पुराने
H2 डेटाबेस से हर टेबल को निर्यात करता है (पुराने इंस्टॉलेशन के कीस्टोर के साथ ऐप-स्तरीय
एन्क्रिप्टेड कॉलम को डिक्रिप्ट करके) एक JSON फ़ाइल में, फिर इसे एक नए v5 इंस्टॉलेशन में आयात
करता है (नए इंस्टॉलेशन के कीस्टोर के साथ पुनः-एन्क्रिप्ट करके)। मौजूदा उपयोगकर्ता तुरंत बाद
अपने वर्तमान पासवर्ड से लॉग इन कर सकते हैं — कोई जबरन रीसेट नहीं।```bash
cd tools/migrate
# 1. Export the old database
./migrate.sh export /opt/Bastillion-jetty/jetty/bastillion/WEB-INF/classes/ ~/bastillion-export.json
# 2. Start the new v5 instance once against the config dir you're migrating into, then
# stop it (Ctrl+C) once it's finished booting - this creates the schema, jceks, and
# default admin user.
cd ../..
java -DCONFIG_DIR=/data/bastillion/ -jar target/bastillion-5.0.0-SNAPSHOT.jar
# 3. Import into the new database (full replace of all 12 tables)
cd tools/migrate
./migrate.sh import /data/bastillion/ ~/bastillion-export.json --yes-replace-all-data
# 4. Delete the export file - it contains decrypted secrets
rm ~/bastillion-export.json
देखें tools/migrate/README.md पूरे विवरण के लिए — अपने पुराने इंस्टॉल का कॉन्फ़िग निर्देशिका ढूँढना, वास्तव में क्या माइग्रेट होता है, और प्लेनटेक्स्ट एक्सपोर्ट फ़ाइल पर सुरक्षा नोट्स।
अधिक स्क्रीनशॉट
मुख्य वर्कफ़्लो यह कैसे काम करता है में दिखाया गया है। इंटरफ़ेस के बाकी हिस्से को देखने के लिए नीचे किसी समूह को विस्तृत करें।
प्रमाणीकरण — लॉगिन और टू-फ़ैक्टर एनरोलमेंट
लॉगिन
उपयोगकर्ता नाम और पासवर्ड के साथ साइन इन करें, साथ ही एक वैकल्पिक OTP एक्सेस कोड।

टू-फ़ैक्टर सेटअप
Authy, Google Authenticator, या किसी अन्य संगत ऐप के साथ QR कोड स्कैन करें।

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

प्रोफ़ाइल प्रबंधित करें
सिस्टम को नामित प्रोफ़ाइल में समूहित करें जो एक्सेस को नियंत्रित करती हैं।

उपयोगकर्ता प्रबंधित करें
खाते बनाएँ, उपयोगकर्ता भूमिकाएँ चुनें, और प्रोफ़ाइल के माध्यम से सिस्टम एक्सेस प्रदान करें।

टर्मिनल और स्वचालन — सत्र लॉन्च करें और सहेजी गई स्क्रिप्ट चलाएँ
टर्मिनल
एक या अधिक सिस्टम चुनें, वैकल्पिक रूप से प्रोफ़ाइल द्वारा फ़िल्टर किए गए, और उन्हें एक साथ खोलें।

कम्पोज़िट स्क्रिप्ट
एक स्क्रिप्ट को एक बार सहेजें और इसे हर चयनित टर्मिनल पर निष्पादित करें।

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

लाइसेंस
Bastillion Prosperity Public License के अंतर्गत उपलब्ध है।
तीसरे पक्ष की निर्भरताओं और उनके लाइसेंसों की पूरी सूची 3rdPartyLicenses.md में।
Loophole, LLC — Sean Kavanagh