विषय पर बढ़ें

प्लगइन सैंडबॉक्स सेटअप

आपके सर्वर के लिए कौन सा सैंडबॉक्स सेटअप ठीक है, आसान शब्दों में। लगभग सभी के लिए जवाब है: डिफ़ॉल्ट रहने दें। सर्वर मशीन को पहचानता है और जितना मज़बूत हो सके उतना अलगाव चुनता है। आगे सिर्फ़ तब पढ़ें जब आप कोई पुराना NAS चलाते हों, Evey को Docker के बिना चलाते हों, या और मज़बूत अलगाव चाहते हों। पूरा तकनीकी मॉडल प्लगइन सैंडबॉक्स और ख़तरा मॉडल में है।

आपकी सुरक्षा कौन करता है

जो प्लगइन आप इंस्टॉल करते हैं, वह अलगाव में चलता है। मशीन के हिसाब से, यह अलगाव:

  • सीमित करता है कि वह किन फ़ाइलों को छू सकता है: अपना फ़ोल्डर और वे सिस्टम लाइब्रेरी जिनकी उसे ज़रूरत है, और कुछ नहीं (न आपका मीडिया, न आपके secret, न दूसरे प्लगइन);
  • kernel के स्तर पर ख़तरनाक सिस्टम काम रोकता है: दूसरे प्रोसेस को debug करना, module लोड करना, घड़ी बदलना, डिस्क mount करना;
  • सीधी नेटवर्क पहुँच हमेशा बंद रखता है: जिस प्लगइन ने नेटवर्क माँगा और आपने मंज़ूरी दी, वह सिर्फ़ अपने बताए होस्ट तक, सर्वर के ज़रिए, पहुँचता है;
  • CPU, मेमोरी, डिस्क और प्रोसेस की संख्या की सीमा रखता है, ताकि बहुत ज़्यादा संसाधन इस्तेमाल करने वाला प्लगइन सर्वर को बंद न करवा सके;
  • आपके secret पढ़े न जा सकें, ऐसा रखता है: लॉगिन पर साइन करने वाली कुंजी और बैकअप।

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

देखें कि क्या लागू है: एडमिन → प्लगइन → सुरक्षा डैशबोर्ड होस्ट का सैंडबॉक्स दिखाता है, यानी auto ने कौन सा मोड चुना (landlock, bubblewrap या basic), जाँच के नतीजों के साथ (Landlock कर्नेल, सैंडबॉक्स लॉन्चर, Bubblewrap)। basic का मतलब है कि होस्ट हर रास्ते के हिसाब से फ़ाइलों का अलगाव नहीं देता: प्लगइन सिर्फ़ बदली हुई uid और seccomp के साथ चलते हैं, जाँच बताती है क्यों, और नीचे के हिस्से बताते हैं कि क्या बदलना है।

अपनी स्थिति चुनें

आपका सर्वर बिना कुछ किए क्या मिलता है कुछ करना है?
Docker में आधुनिक Linux (kernel 5.13 या नया, मोटे तौर पर 2021 के बाद का कुछ भी), सामान्य स्थिति सबसे मज़बूत अलगाव (Landlock), अपने-आप कुछ नहीं
Docker में पुराना NAS (5.13 से पुराना kernel) अच्छा अलगाव, बस हर फ़ोल्डर के स्तर पर फ़ाइल प्रतिबंध के बिना; secret, नेटवर्क और सिस्टम काम बंद ही रहते हैं कुछ नहीं: uid separation (नीचे) अपने-आप चालू हो जाता है
कोई भी Linux, Docker के बिना उपलब्ध सबसे मज़बूत अलगाव: आधुनिक kernel पर Landlock, वरना bubblewrap namespace बिना कंटेनर के के कदम अपनाएँ

वह एक सेटिंग जिसे आप शायद बदलें: uid separation

uid separation से प्लगइन सर्वर से अलग उपयोगकर्ता खाते में चलता है, ताकि अगर कुछ और उसे न भी रोके, तब भी वह सर्वर की secret फ़ाइलें न पढ़ सके। यह सिर्फ़ उस मशीन पर मायने रखता है जिसमें हर फ़ोल्डर के स्तर पर फ़ाइल प्रतिबंध नहीं है (basic वाली स्थिति); आधुनिक मशीन पर यह प्रतिबंध पहले से secret को पहुँच से बाहर रखता है, और separation एक अतिरिक्त, दोहरी परत है।

EVEY_PLUGINS_UID_SEPARATION:

मान मतलब कब इस्तेमाल करें
auto (डिफ़ॉल्ट) सिर्फ़ ज़रूरत होने पर चालू (basic वाली स्थिति), जहाँ दोहराव हो वहाँ बंद हमेशा, जब तक नीचे की दो में से कोई स्थिति न हो
on हमेशा चालू, फ़ाइल प्रतिबंध के ऊपर एक दूसरी, स्वतंत्र सुरक्षा आप दोनों सुरक्षाएँ चाहते हैं और नीचे बताया छोटा नुकसान स्वीकार है
off कभी नहीं कोई खास प्लगइन इसके साथ ठीक से नहीं चलता (कभी-कभार)

Warning

uid separation Docker के no-new-privileges विकल्प के साथ नहीं चलता: एक चुनें। पुरानी मशीन (basic) पर uid बदलने की अनुमति न मिल सके, तो सर्वर प्लगइन को आपके secret के पास चलाने की जगह उसे शुरू करने से मना कर देता है; आधुनिक मशीन पर वह लॉग में चेतावनी लिखता है और प्लगइन को अतिरिक्त सुरक्षा के बिना चलाता है। इमेज में ज़रूरत की हर चीज़ है, आपको सिर्फ़ वेरिएबल सेट करना है।

on का छोटा नुकसान: प्लगइन एक अलग खाते के रूप में चलता है, इसलिए जो प्लगइन अपने ही फ़ोल्डर में अस्थायी फ़ाइलें लिखता है, वह विफल हो सकता है। ऐसा हो, तो off सेट करें। इसीलिए डिफ़ॉल्ट auto है: वह यह जोखिम सिर्फ़ वहीं लेता है जहाँ असली फ़ायदा हो।

कोई दुर्भावनापूर्ण प्लगइन क्या कर सकता है

आधुनिक Linux (Docker या bare metal): दुर्भावनापूर्ण प्लगइन पूरी तरह अलगाव में रहता है। वह आपके secret नहीं पढ़ सकता, दूसरे प्लगइन की फ़ाइलें न देख सकता है न छू सकता है, मनमाने नेटवर्क कॉल नहीं कर सकता और सिस्टम से छेड़छाड़ नहीं कर सकता। इस अलगाव से बाहर निकलने का एकमात्र वास्तविक तरीका kernel का कोई गंभीर bug है, जो हर उस सैंडबॉक्स पर लागू होता है जो पूरी virtual machine नहीं है।

Docker में पुराना NAS, हर फ़ोल्डर के स्तर पर फ़ाइल प्रतिबंध के बिना (basic):

  • आपके secret (लॉगिन कुंजी, बैकअप) अलग उपयोगकर्ता खाते से सुरक्षित रहते हैं, जिसे auto यहाँ चालू करता है;
  • प्लगइन के पास सीधा नेटवर्क नहीं है; जिसे अनुमति मिली है, वह सिर्फ़ अपने बताए होस्ट तक पहुँचता है;
  • ख़तरनाक सिस्टम काम अब भी kernel के स्तर पर रोके जाते हैं;
  • पर हर फ़ोल्डर के स्तर पर फ़ाइल प्रतिबंध के बिना, दुर्भावनापूर्ण प्लगइन सामान्य, गैर-secret फ़ाइलें पढ़ सकता है, चल रहे प्रोसेस की सूची देख सकता है, और क्योंकि सभी प्लगइन एक ही खाता इस्तेमाल करते हैं, किसी दूसरे प्लगइन की फ़ाइलें पढ़ सकता है या उनमें गड़बड़ी कर सकता है।

ऐसे होस्ट पर सिर्फ़ वही प्लगइन इंस्टॉल करें जिन पर आपको भरोसा है, या पूरे फ़ाइल प्रतिबंध के लिए आधुनिक kernel पर जाएँ।

कॉन्फ़िगरेशन के उदाहरण

हर लाइन compose फ़ाइल में environment: के नीचे जाती है, KEY: value के रूप में लिखी हुई (उदाहरण के लिए EVEY_PLUGINS_UID_SEPARATION: "on")।

1. आधुनिक सर्वर, सुझाया गया (कुछ नहीं करना)
EVEY_PLUGINS_SANDBOX_MODE=auto          # सबसे मज़बूत उपलब्ध चुनता है (डिफ़ॉल्ट)
# EVEY_PLUGINS_UID_SEPARATION=auto      # (डिफ़ॉल्ट) सिर्फ़ ज़रूरत पर चालू
2. पुराना NAS (कुछ सेट नहीं करना, समझाने के लिए दिखाया गया)
# compose के security_opt में no-new-privileges न डालें, वह uid बदलना रोक देगा
EVEY_PLUGINS_SANDBOX_MODE=auto
EVEY_PLUGINS_UID_SEPARATION=auto        # (डिफ़ॉल्ट) basic वाली स्थिति में चालू
3. आधुनिक सर्वर पर दोनों सुरक्षाएँ
EVEY_PLUGINS_SANDBOX_MODE=auto          # landlock पर पहुँचता है
EVEY_PLUGINS_UID_SEPARATION=on          # ऊपर से स्वतंत्र uid separation जोड़ें
4. एक मोड तय करें (एडवांस्ड)
EVEY_PLUGINS_SANDBOX_MODE=landlock      # Landlock उपलब्ध न हो तो प्लगइन शुरू करने से मना करें
5. uid separation में कोई प्लगइन टूटता है
EVEY_PLUGINS_UID_SEPARATION=off
6. संसाधनों की सीमाएँ (बाद में एडमिन → प्लगइन → संसाधन सीमाएँ से बदली जा सकती हैं)
EVEY_PLUGINS_MEMORY_MB=256              # हर प्लगइन की अधिकतम RAM
EVEY_PLUGINS_PIDS_MAX=64                # अधिकतम प्रोसेस और thread
EVEY_PLUGINS_DISK_MAX_MB=100            # इंस्टॉल फ़ोल्डर का अधिकतम आकार (0 = बंद)
EVEY_PLUGINS_CPU_NICE=10                # scheduling प्राथमिकता 0-19 (ज़्यादा = दूसरों के लिए ज़्यादा जगह)

सर्वर चलते समय सैंडबॉक्स मोड बदलें

एडमिन → प्लगइन के संसाधन सीमाएँ कार्ड में सैंडबॉक्स मोड बदलें। चल रहे प्लगइन अपने-आप रीस्टार्ट होते हैं ताकि नया मोड तुरंत लागू हो, और सुरक्षा डैशबोर्ड लागू मोड दिखाता है। जो प्लगइन नए मोड में नहीं चल सकता (जैसे बिना विशेष अधिकार वाले कंटेनर के अंदर bubblewrap), वह त्रुटि में दिखता है: पिछले मोड पर लौट जाएँ।

जाँचें कि यह काम कर रहा है

# launcher के पास uid separation के लिए इस्तेमाल होने वाली capability है
docker exec evey-server getcap /evey-plugin-launcher        # cap_setuid=ep

# कोई चल रहा प्लगइन किस उपयोगकर्ता के रूप में चलता है (evey = सर्वर के साथ साझा,
# evey-plugin = अलग); इमेज में ps है, इसलिए `docker exec evey-server ps` भी काम करता है
docker top evey-server -o user,pid,args | grep -iE "node|python"

लागू सैंडबॉक्स मोड एडमिन → प्लगइन → सुरक्षा डैशबोर्ड का बैज है।