एक SELinux नीति उल्लंघन को ट्रिगर करने का एक तरीका?


12

मैं SELinux के बुनियादी कामकाज का अध्ययन कर रहा हूं और इसे इनकार को ट्रिगर करने के लिए उपयोगी होगा। मेरी टेस्ट मशीन CentOS 7 चल रही है, यह बिना किसी अतिरिक्त सेवाओं के स्थापित एक बेसिक सर्वर है, और इसमें 'एनफोर्सिंग' प्राप्त करने की स्थिति है। इसलिए मुझे यकीन था कि दुनिया को पढ़ने योग्य / जड़ बनाना, और एक अप्रभावित उपयोगकर्ता के रूप में वहाँ से फ़ाइलों को पढ़ने का प्रयास करना होगा। लेकिन भाग्य नहीं! क्या कोई त्वरित परीक्षण सुझा सकता है? रास्तों, या खुले बंदरगाहों आदि तक पहुँचने की कोशिश करना।

आदर्श रूप से मैं सीधे शेल कमांड की तलाश कर रहा हूं जो एक डीएसी प्रतिबंधित नहीं होगा, लेकिन एक मैक नोटिस और इनकार करेगा। जैसे कि मैं इसे प्राप्त करने के लिए बीस्पोक कार्यक्रमों को संकलित करने, या विशिष्ट सेवाओं (जैसे एक वेब-सर्वर) को स्थापित करने के लिए नहीं देख रहा हूं। यह मूल्यवान है क्योंकि यह SELinux को कार्रवाई में देखने का एक सामान्य और स्पष्ट तरीका प्रदान करता है।

मुझे DAC (यानी फाइलसिस्टम अनुमतियों) को संशोधित करने में कोई समस्या नहीं है, क्योंकि वे एक परीक्षण के भाग के रूप में डिफ़ॉल्ट रूप से कम प्रतिबंधात्मक हैं।


1
+1 यह जानकर कि आपके सुरक्षात्मक सिस्टम को कैसे ट्रिगर किया जाए ताकि आप यह सत्यापित कर सकें कि वे कार्य कर रहे हैं एक महत्वपूर्ण और बार-बार छूटा हुआ कदम है।
ग्वेनफैवर

मैं इस प्रश्न को ऑफ-टॉपिक के रूप में बंद करने के लिए मतदान कर रहा हूं क्योंकि यह यूनिक्स और लिनक्स एसई पर है।
मार्क

जवाबों:


3

में SELinux की उपयोगिता प्रदर्शित करने के लिए बग का पता लगाने तीसरे पक्ष के / अपने स्वयं के डेवलपर के कोड के लिए, यहाँ एक स्मृति संरक्षण परीक्षण (पहले कोड उदाहरण को संशोधित है यहाँ ):

#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>

int main (void) {
  // open file read-write, get a memory-mapped pointer with private access, write permission
  int fd = open ("file_to_test", O_RDWR);
  char *p = mmap (NULL, 42, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);

  p[0] = 'a';   // put something

  // Update protection mode; SELinux response depends on sebool: allow_execmod
  int r = mprotect (p, 42, PROT_READ | PROT_EXEC);

  // Display mprotect result
  printf ("mprotect = %d\n", r);

  close(fd);
  return 0;
}
संकलित करें और डिफ़ॉल्ट दिखाएं (पकड़ा नहीं गया)
$ echo "test data" > file_to_test
$ gcc execmod.c 

$ ./a.out 
mprotect = 0

$ sudo aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
<no events of interest were found>

समस्या को पकड़ने के लिए बूलियन बदलें:

$ sudo getsebool allow_execmod
allow_execmod --> on

$ sudo setsebool allow_execmod 0
$ ./a.out 
mprotect = -1

$ sudo aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
1. 04/30/2015 12:26:41 a.out unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 10 file execmod unconfined_u:object_r:user_home_t:s0 denied 3612

यह निश्चित रूप से उपयोगी है, और अच्छी तरह से प्रलेखित (+1) है, हालांकि मैं एक प्रोग्रामर नहीं हूं और कोड को वास्तव में नहीं समझता हूं। आदर्श रूप से, मैं एक खुला उदाहरण देखना चाहूंगा, जिसमें एक पोर्ट खोलने की कोशिश से इनकार करते हुए SELinux या शेल, नेटकैट, टेलनेट आदि सरल कमांड लाइन टूल्स का उपयोग करते हुए एक पथ का उपयोग किया जा सकता है। मैं इसे स्पष्ट करने के लिए प्रश्न को संपादित करूंगा।
Thoughtitious

मुझे खुद कोड भागों को देखना था। मुझे खुशी है कि आपने नीचे एक बैश परीक्षण जोड़ा। मैंने CentOS7 पर स्नॉर्ट और पोस्टफ़िक्स (शायद dovecot) त्रुटियों को छोड़ दिया क्योंकि वे पैकेज हैं, इंस्टॉल करने के लिए अधिक काम है, यह बाद में तय हो सकता है और यह सिर्फ अधिक कॉन्फ़िगरेशन है। यदि आप पहले से ही इस तरह से जा रहे हैं तो यह नीति निर्माण अभ्यास के लिए उपयोगी है।
.bρǝɲǝɲ

3

यह मैक नीति को स्पष्ट रूप से प्रदर्शित करता है जहां सेंटो 7 के बेस इंस्टाल पर एक बराबर डीएसी को बायपास किया जा सकता था।

  1. डिफ़ॉल्ट रूप से (लेखन के समय CentOS में) असंबद्ध, गैर-सिस्टम उपयोगकर्ताओं को 'unconfined_u' भूमिका के रूप में लॉग इन किया जाता है। हालाँकि हम अपने सिस्टम को बदल सकते हैं ताकि हमारे unprivileged उपयोगकर्ता 'alice' को इसके बजाय 'user_u' भूमिका में रखा जाए। डिफ़ॉल्ट नीतियों को केवल कुछ अतिरिक्त कॉन्फ़िगरेशन के साथ इस भूमिका को स्पष्ट रूप से प्रतिबंधित करने के लिए बनाया जा सकता है।

    [root]# echo "alice:user_u:s0-s0:c0.c1023" >> /etc/selinux/targeted/seusers
    
  2. अब इन उपयोगकर्ताओं के लिए अपने घरेलू निर्देशिका और / tmp में स्थित फ़ाइलों को निष्पादित करने की क्षमता को बंद करें। एक बार फिर, डिफ़ॉल्ट को इस व्यवहार की अनुमति देना है। इस कमांड को पूरा होने में कुछ समय लग सकता है

    [root]# setsebool -P user_exec_content off
    
  3. अब (हमारे अप्रभावित उपयोगकर्ता के साथ) हम लॉग इन कर सकते हैं और इन नो गो क्षेत्रों में से किसी एक पर कुछ निष्पादित करने का प्रयास कर सकते हैं। जैसा कि आप देख सकते हैं, हमें नकार दिया गया है।

    [alice]$ cp /bin/ls /tmp/
    [alice]$ /tmp/ls
    -bash: /tmp/ls: Permission denied
    
  4. अंत में, हम अपने SELinux इनकार को देखने के लिए AVC लॉग देख सकते हैं।

    [root]# aureport -a
    
    AVC Report
    ========================================================
    # date time comm subj syscall class permission obj event
    ========================================================
    1. 02/05/15 21:08:33 bash user_u:user_r:user_t:s0 59 file execute user_u:object_r:user_tmp_t:s0 denied 693
    

अरे हाँ जो काम करता है! मुझे विशेष रूप से पसंद है कि आपने इसे "कोई निष्पादन सामग्री" दृष्टिकोण नहीं चुना, क्योंकि यह निश्चित रूप से पकड़ा जाना चाहिए। मैंने पहले स्थान पर निष्पादन योग्य निर्माण को रोकने के लिए ऑडिट को प्राथमिकता देने का प्रयास किया है, लेकिन मुझे यह पसंद है। एक उपयोग का मामला: मैं एक सामान्य क्लाउड-आधारित सेवा का उपयोग करता हूं जो नए सॉफ़्टवेयर को स्थापित करना कठिन बनाता है (आपको उनके पैकेज प्रबंधक का उपयोग करना होगा, और कोई sudo नहीं है), लेकिन बहुत कम बिंदु है; वे निर्माण या निष्पादन को अवरुद्ध नहीं करते हैं और वे डेवलपर वातावरण हैं ... इसलिए मैं केवल उन पैकेजों को भूल / स्केप करता हूं जिनकी मुझे आवश्यकता है और उन्हें संकलित करता है। +1
--bρɯͽ

1

जब तक आपने सिस्टम-कॉन्फिग-सेलाइन (या / इत्यादि / सेलिनक्स / पॉलिसी) के बूलियन टैब में अपनी नीतियों को बदल दिया है, तब तक डिफॉल्ट को निम्नलिखित का जवाब देना चाहिए (एनबी, आप एक गहरा गोता लगाने के लिए सेटट्राउटलशॉट भी स्थापित करना चाह सकते हैं) :

mkdir -m 755 -p / install / ks

cp /root/anaconda-ks.cfg / install / ks

chmod 644 /install/ks/anaconda-ks.cfg

उसके बाद, अपने वेब सर्वर को पुनः आरंभ करें और अपने वेब ब्राउजर के साथ http: // localhost / ks एक्सेस करने का प्रयास करें । आपको "निषिद्ध" संदेश देखना चाहिए। यदि आप सिलाई कर रहे हैं /var/log/audit/audit.logया यदि आप दौड़ते हैं ausearch -m avc -ts recent, तो आपको संदेश देखने में सक्षम होना चाहिए:type=AVC msg=audit(1391277951.222:266): avc: denied { read } for pid=1731 comm="httpd" name="ks" dev=sda1 ino=22351 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined u:object r:default t:s0 tclass=dir

आप तब SELinux संदर्भ बदल सकते हैं chcon -Rv --reference /var/www/html /install/ksयदि आप SELinux को निष्क्रिय नहीं करना चाहते हैं, लेकिन संसाधन तक पहुँचने में सक्षम हैं।

संपादित करें: क्षमा करें, यह नहीं देखा कि आपने कहा "वेबसर्वर नहीं"। chcon -u fake_u <filename>सिस्टम फ़ाइल पर एक अप्रकाशित खाते का उपयोग करने का प्रयास करें ।


मुझे काम करने के लिए आपका दूसरा सुझाव नहीं मिला (नए बनाए गए उपयोगकर्ता का उपयोग करके)। इसके अलावा, मैं एक ऐसा परीक्षण कर रहा था जो अधिक सामान्य था, मैक का एक उदाहरण जहां डीएसी ने अनुमति दी होगी, वहां कदम रखा: जबकि यह परीक्षण कि SELinux लेबलिंग के प्रशासनिक परिवर्तनों के खिलाफ कितनी अच्छी तरह से रक्षा कर सकता है।
Thoughtitious

0

दो छोटे पैकेज स्थापित करें - कोई निर्भरता नहीं

  yum install -y vsftpd lftp

FTP सर्वर शुरू करें

  systemctl start vsftpd

रूट के घर में एक फ़ाइल बनाएँ

  touch ~/tux.tch

रूट के घर से एफ़टीपी डायरेक्टरी में जाएं।
नोट: स्थानांतरित करें, प्रतिलिपि न करें, या फ़ाइल का फ़ॉन्क्सटैक्स बदल जाएगा

  mv ~/tux.tch /var/ftp/pub

एफ़टीपी क्लाइंट उपयोगकर्ता के रूप में अपने एफ़टीपी सर्वर में प्रवेश करें और नई फ़ाइल तक पहुँचने का प्रयास करें।
नोट: टैब स्वतः पूर्ण होने से यहां काम नहीं होगा

  lftp localhost
    ls pub/tux.tch
    exit

कच्चे लॉग में इनकार देखें

  grep AVC /var/log/audit/audit.log

या यदि आपने setroubleshoot*स्थापित किया है

  grep sealert /var/log/messages
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.