MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

MongoDB प्रतिकृति सेट के लिए SELinux को कैसे कॉन्फ़िगर करें

2025 तक, दुनिया लगभग 200 ज़ेटाबाइट डेटा संग्रहीत करेगी। वह डेटा सार्वजनिक, निजी, ऑन-प्रिमाइसेस या क्लाउड स्टोरेज, पीसी, लैपटॉप, स्मार्टफोन और इंटरनेट-ऑफ-थिंग्स (IoT) उपकरणों में भी संग्रहीत किया जाएगा। प्रक्षेपण पर, इंटरनेट से जुड़े उपकरणों की संख्या भी 2025 में लगभग 75 बिलियन तक बढ़ने की उम्मीद है। हम में से कुछ या कम आईटी पृष्ठभूमि वाले लोगों के लिए, वे संख्याएं कुछ भी नहीं हैं। लेकिन सुरक्षा के प्रति उत्साही लोगों के लिए यह चिंताजनक है क्योंकि अधिक से अधिक डेटा खतरे में है।

ओपन-सोर्स प्रौद्योगिकी और डेटाबेस की दुनिया में, सुरक्षा महत्वपूर्ण विषयों में से एक है। समय-समय पर सुरक्षा से जुड़े कई नए आविष्कार और विकास होंगे। उनमें से एक सुरक्षा-संवर्धित लिनक्स या (SELinux) संक्षेप में है, जिसे लगभग 21 साल पहले यूनाइटेड स्टेट्स नेशनल सिक्योरिटी एजेंसी (NSA) द्वारा विकसित किया गया था। भले ही इसे इतने साल पहले पेश किया गया हो, यह तेजी से विकसित हुआ है और लिनक्स सिस्टम के लिए सुरक्षा उपायों में से एक के रूप में व्यापक रूप से उपयोग किया जाता है। हालांकि इसे डेटाबेस के साथ कॉन्फ़िगर करने के तरीके के बारे में जानकारी प्राप्त करना काफी आसान नहीं है, लेकिन MongoDB ने इसका लाभ उठाया है। इस ब्लॉग पोस्ट में, हम SELinux और इसे MongoDB प्रतिकृति सेट में कॉन्फ़िगर करने के तरीके के बारे में जानेंगे।

इस उद्देश्य के लिए, हम अपने परीक्षण वातावरण के लिए 3 CentOS 8 VMs का उपयोग करने जा रहे हैं और MongoDB 4.4 का उपयोग करेंगे। इससे पहले कि हम आगे बढ़ें, आइए SELinux के बारे में थोड़ा और गहराई से जानें।

प्रवर्तन, अनुमेय और अक्षम मोड

ये तीन मोड हैं जिन्हें SELinux किसी भी समय चला सकता है। बेशक, सुरक्षा नीति के संदर्भ में उन सभी का अपना कार्य और उद्देश्य है। हम इसे एक-एक करके देखेंगे।

प्रवर्तन मोड में होने पर, सिस्टम पर कोई भी कॉन्फ़िगर की गई नीति लागू की जाएगी और उपयोगकर्ताओं या प्रक्रियाओं दोनों द्वारा किए गए हर एक अनधिकृत एक्सेस प्रयास को SELinux द्वारा अस्वीकार कर दिया जाता है। इतना ही नहीं, उन एक्सेस अस्वीकृत कार्रवाइयों को भी संबंधित लॉग फाइलों में दर्ज किया जाएगा। हालांकि यह सबसे अनुशंसित मोड है, आजकल अधिकांश Linux सिस्टम में सिस्टम व्यवस्थापक द्वारा SELinux की जटिलता जैसे विभिन्न कारणों से इस मोड को सक्षम नहीं किया गया है।

अनुमोदक मोड के लिए, हम सुरक्षित रूप से कह सकते हैं कि SELinux अर्ध-सक्षम स्थिति में है। इस मोड में, SELinux द्वारा कोई नीति लागू नहीं की जाएगी, साथ ही साथ किसी भी एक्सेस को अस्वीकार नहीं किया जाएगा। इसके बावजूद, कोई भी नीति उल्लंघन अभी भी ऑडिट लॉग में रिकॉर्ड और लॉग इन किया जाता है। आमतौर पर, इस मोड का उपयोग SELinux को अंतिम रूप देने और इसे लागू करने के लिए आगे बढ़ने से पहले परीक्षण करने के लिए किया जाता है।

अंतिम मोड के लिए जो अक्षम है, सिस्टम पर कोई उन्नत सुरक्षा नहीं चल रही है। क्या आप जानते हैं कि आपका सिस्टम अब कौन सा SELinux मोड चलाता है? देखने के लिए बस निम्न कमांड चलाएँ:

$ sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      33

हमारे परीक्षण सिस्टम के लिए, SELinux को सक्षम और लागू करने के रूप में कॉन्फ़िगर किया गया है ताकि हम बाकी गाइड के साथ आगे बढ़ सकें। यदि आपके सिस्टम में SELinux अक्षम या अनुमेय है, तो आप इसे सक्षम करने और लागू करने के लिए बदलने के लिए नीचे दिए गए चरणों का पालन कर सकते हैं।

  1. निर्देश को लागू करने के लिए बदलने के लिए /etc/selinux/config फ़ाइल संपादित करें

vi /etc/sysconfig/selinux
...
SELINUX=enforcing
…

आपको यह सुनिश्चित करना होगा कि उपरोक्त निर्देश लागू करने के लिए सेट है।

  1. सेटिंग लागू करने के लिए सिस्टम को रीबूट करें

$ रीबूट करें

सिस्टम के ऑनलाइन होने के बाद, हमें यह पुष्टि करने की आवश्यकता है कि SELinux को सही तरीके से कॉन्फ़िगर किया गया है और परिवर्तन हो गया है। जाँच करने के लिए निम्न कमांड चलाएँ, यह पहले वाले (सेस्टेटस) के अलावा इसे जांचने का एक और तरीका है।

$ getenforce

लागू करना

एक बार जब हम "एन्फोर्सिंग" शब्द देखते हैं, तो अब हम पुष्टि कर सकते हैं कि यह जाना अच्छा है। चूंकि हम एक प्रतिकृति सेट का उपयोग करने जा रहे हैं, हमें यह सुनिश्चित करने की आवश्यकता है कि SELinux को सभी MongoDB नोड्स पर कॉन्फ़िगर किया गया है। मेरा मानना ​​है कि यह सबसे महत्वपूर्ण हिस्सा है जिसे हमें MongoDB के लिए SELinux को कॉन्फ़िगर करने के साथ आगे बढ़ने से पहले कवर करना चाहिए।

अनुशंसित "ulimit" सेटिंग 

इस उदाहरण में, हम मानते हैं कि MongoDB 4.4 को 3 नोड्स पर स्थापित किया गया है। स्थापना बहुत सरल और आसान है, अपना समय बचाने के लिए हम आपको चरण नहीं दिखाने जा रहे हैं, लेकिन यहां दस्तावेज़ीकरण का लिंक दिया गया है।

कुछ मामलों में, सिस्टम का "ulimit" कुछ मुद्दों का कारण होगा यदि सीमाओं का डिफ़ॉल्ट मान कम है। यह सुनिश्चित करने के लिए कि MongoDB सही ढंग से चलता है, हम यहाँ MongoDB अनुशंसा के अनुसार "ulimit" सेट करने की अत्यधिक अनुशंसा करते हैं। जबकि प्रत्येक परिनियोजन की अपनी विशिष्ट आवश्यकताएं या सेटिंग्स हो सकती हैं, निम्नलिखित "ulimit" सेटिंग्स का पालन करना सबसे अच्छा है:

-f (file size): unlimited
-t (cpu time): unlimited
-v (virtual memory): unlimited
-l (locked-in-memory size): unlimited
-n (open files): 64000
-m (memory size): unlimited
-u (processes/threads): 64000

"ulimit" मान को बदलने के लिए, बस निम्न आदेश जारी करें, उदाहरण के लिए, "-n" (खुली फ़ाइलें) के लिए मान बदलना:

$ ulimit -n 64000

सभी सीमाएं बदल जाने के बाद, नई सीमा में बदलाव सुनिश्चित करने के लिए mongod इंस्टेंस को फिर से शुरू करना होगा:

$ sudo systemctl restart mongod

SELinux को कॉन्फ़िगर करना

MongoDB दस्तावेज़ के अनुसार, वर्तमान SELinux नीति MongoDB प्रक्रिया को /sys/fs/cgroup तक पहुँचने की अनुमति नहीं देती है, जो आपके सिस्टम पर उपलब्ध मेमोरी को निर्धारित करने के लिए आवश्यक है। तो हमारे मामले के लिए, जिसमें SELinux प्रवर्तन मोड में है, निम्नलिखित समायोजन करना होगा।

cgroup तक पहुंच की अनुमति दें

पहला कदम यह सुनिश्चित करना है कि हमारे सिस्टम में "चेकपॉलिसी" पैकेज स्थापित है:

$ sudo yum install checkpolicy

yum install checkpolicy

Last metadata expiration check: 2:13:40 ago on Fri 11 Jun 2021 05:32:10 AM UTC.

Package checkpolicy-2.9-1.el8.x86_64 is already installed.

Dependencies resolved.

Nothing to do.

Complete!

अगला, हमें "mongodb_cgroup_memory.te" के लिए एक कस्टम नीति फ़ाइल बनाने की आवश्यकता है:

cat > mongodb_cgroup_memory.te <<EOF
module mongodb_cgroup_memory 1.0;
require {
      type cgroup_t;
      type mongod_t;
      class dir search;
      class file { getattr open read };
}

#============= mongod_t ==============
allow mongod_t cgroup_t:dir search;
allow mongod_t cgroup_t:file { getattr open read };
EOF

पॉलिसी फ़ाइल बनने के बाद, अंतिम चरण इन तीन कमांडों को चलाकर कस्टम पॉलिसी मॉड्यूल को संकलित और लोड करना है:

$ checkmodule -M -m -o mongodb_cgroup_memory.mod mongodb_cgroup_memory.te
$ semodule_package -o mongodb_cgroup_memory.pp -m mongodb_cgroup_memory.mod
$ sudo semodule -i mongodb_cgroup_memory.pp

आखिरी कमांड में कुछ समय लगना चाहिए और एक बार यह हो जाने के बाद, MongoDB प्रक्रिया SELinux एनफोर्सिंग मोड के साथ सही फाइलों तक पहुंचने में सक्षम होनी चाहिए।

FTDC के लिए नेटस्टैट तक पहुंच की अनुमति दें

फुल टाइम डायग्नोस्टिक डेटा कैप्चर (FTDC) के लिए

/proc/net/netstat आवश्यक है। FTDC संक्षेप में MongoDB सर्वर के विश्लेषण की सुविधा के लिए एक तंत्र है। FTDC में डेटा फ़ाइलें संकुचित हैं, मानव-पठनीय नहीं हैं, और MongoDB डेटा फ़ाइलों के समान फ़ाइल एक्सेस अनुमति प्राप्त करती हैं। इसके कारण, केवल FTDC डेटा फ़ाइलों तक पहुँच वाले उपयोगकर्ता ही डेटा संचारित कर सकते हैं।

इसे कॉन्फ़िगर करने के चरण लगभग पिछले वाले के समान हैं। बस बात यह है कि कस्टम नीति अलग है।

$ sudo yum install checkpolicy
Create a custom policy file “mongodb_proc_net.te”:
cat > mongodb_proc_net.te <<EOF
module mongodb_proc_net 1.0;
require {
    type proc_net_t;
    type mongod_t;
    class file { open read };
}

#============= mongod_t ==============
allow mongod_t proc_net_t:file { open read };
EOF

अंतिम चरण कस्टम नीति को संकलित और लोड करना है:

$ checkmodule -M -m -o mongodb_proc_net.mod mongodb_proc_net.te
$ semodule_package -o mongodb_proc_net.pp -m mongodb_proc_net.mod
$ sudo semodule -i mongodb_proc_net.pp

कस्टम MongoDB निर्देशिका पथ

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

सबसे पहले, हमें mongod सेवा को नई निर्देशिका का उपयोग करने की अनुमति देने के लिए SELinux नीति को अपडेट करने की आवश्यकता है, यह ध्यान देने योग्य है कि हमें निर्देशिका के अंत में .* को शामिल करना सुनिश्चित करना होगा:

$ sudo semanage fcontext -a -t <type> </some/MongoDB/directory.*>
  • डेटा निर्देशिका के लिए mongod_var_lib_t

  • लॉग फ़ाइल निर्देशिका के लिए mongod_log_t

  • पिड फ़ाइल निर्देशिका के लिए mongod_var_run_t

फिर, नई निर्देशिका के लिए SELinux उपयोगकर्ता नीति अपडेट करें:

$ sudo chcon -Rv -u system_u -t <type> </some/MongoDB/directory>
  • डेटा निर्देशिका के लिए mongod_var_lib_t

  • लॉग निर्देशिका के लिए mongod_log_t

  • पिड फ़ाइल निर्देशिका के लिए mongod_var_run_t

अंतिम चरण निर्देशिका में अद्यतन SELinux नीतियों को लागू करना है:

restorecon -R -v </some/MongoDB/directory>

चूंकि MongoDB डेटा और लॉग फ़ाइलों दोनों के लिए डिफ़ॉल्ट पथ का उपयोग कर रहा है, हम इसे कैसे लागू करें, इस पर निम्नलिखित उदाहरण देख सकते हैं:

/mongodb/data के गैर-डिफ़ॉल्ट MongoDB डेटा पथ के लिए:

$ sudo semanage fcontext -a -t mongod_var_lib_t '/mongodb/data.*'
$ sudo chcon -Rv -u system_u -t mongod_var_lib_t '/mongodb/data'
$ restorecon -R -v '/mongodb/data'
For non-default MongoDB log directory of /mongodb/log (e.g. if the log file path is /mongodb/log/mongod.log):

$ sudo semanage fcontext -a -t mongod_log_t '/mongodb/log.*'
$ sudo chcon -Rv -u system_u -t mongod_log_t '/mongodb/log'
$ restorecon -R -v '/mongodb/log'

कस्टम MongoDB पोर्ट

कुछ स्थितियों के लिए, कुछ MongoDB संस्थापन डिफ़ॉल्ट पोर्ट नंबर के अलावा एक अलग पोर्ट नंबर का उपयोग कर रहे हैं जो कि 27017 है। इस विशेष मामले में, हमें SELinux को भी कॉन्फ़िगर करने की आवश्यकता है और कमांड बहुत सरल है :

$ sudo semanage port -a -t mongod_port_t -p tcp <portnumber>
For example, we are using port 37017:
$ sudo semanage port -a -t mongod_port_t -p tcp 37017

ClusterControl के साथ सक्षम MongoDB SELinux को परिनियोजित करना

ClusterControl के साथ, आपके पास अपने MongoDB प्रतिकृति सेट के परिनियोजन के दौरान SELinux को सक्षम करने का विकल्प होता है। हालाँकि, आपको अभी भी मोड को लागू करने के लिए बदलने की आवश्यकता है क्योंकि ClusterControl केवल इसे अनुमेय पर सेट करता है। परिनियोजन के दौरान इसे सक्षम करने के लिए, आप नीचे दिए गए स्क्रीनशॉट के अनुसार "AppArmor/SELinux अक्षम करें" को अनचेक कर सकते हैं।

उसके बाद, आप जारी रख सकते हैं और अपने MongoDB प्रतिकृति सेट के लिए नोड्स जोड़ सकते हैं और तैनाती शुरू करें। ClusterControl में, हम MongoDB के लिए संस्करण 4.2 का उपयोग कर रहे हैं।

क्लस्टर तैयार हो जाने के बाद, हमें SELinux को इनफोर्स करने के लिए बदलना होगा सभी नोड्स और इसे कॉन्फ़िगर करने के लिए उन चरणों का उल्लेख करते हुए आगे बढ़ें, जिनसे हम अभी-अभी गुजरे हैं।

निष्कर्ष

किसी भी Linux सिस्टम के लिए SELinux के 3 तरीके उपलब्ध हैं। SELinux एनफोर्सिंग मोड के लिए, कुछ कदम हैं जिनका पालन करने की आवश्यकता है ताकि यह सुनिश्चित हो सके कि MongoDB बिना किसी समस्या के चलता है। यह भी ध्यान देने योग्य है कि कुछ "ulimit" सेटिंग्स को सिस्टम आवश्यकताओं के साथ-साथ विनिर्देशों के अनुरूप भी बदलने की आवश्यकता है।

ClusterControl के साथ, SELinux को परिनियोजन के दौरान सक्षम किया जा सकता है, हालाँकि आपको अभी भी प्रवर्तन मोड में बदलने और प्रतिकृति सेट तैयार होने के बाद नीति को कॉन्फ़िगर करने की आवश्यकता है।

हमें उम्मीद है कि यह ब्लॉग पोस्ट आपके MongoDB सर्वर के लिए SELinux को सेट करने में आपकी मदद करेगी


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. क्या मोंगोडब एग्रीगेशन फ्रेमवर्क मैप/कम करने से तेज है?

  2. उल्का में उदाहरण चलाने में समस्या

  3. MongoDB ने mLab का अधिग्रहण किया – विभिन्न MongoDB होस्टिंग विकल्प क्या हैं?

  4. MongoDB के साथ फास्ट पेजिंग

  5. मोंगोडीबी $ सॉर्ट