मैं ऑडिनक्स के बिना यूनिक्स सॉकेट के लिए निगंक्स एक्सेस की अनुमति देने के लिए SELinux को कैसे बता सकता हूं?


10

मेरे पास एक यूनिक्स सॉकेट के माध्यम से gunicorn करने के लिए nginx अग्रेषण अनुरोध हैं /run/gunicorn/socket। डिफ़ॉल्ट रूप से, यह व्यवहार SELinux द्वारा अनुमति नहीं है:

grep nginx /var/log/audit/audit.log
type=SERVICE_START msg=audit(1454358912.455:5390): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='unit=nginx comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'
type=AVC msg=audit(1454360194.623:7324): avc:  denied  { write } for  pid=9128 comm="nginx" name="socket" dev="tmpfs" ino=76151 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:httpd_sys_content_t:s0 tclass=sock_file
type=SYSCALL msg=audit(1454360194.623:7324): arch=c000003e syscall=42 success=no exit=-13 a0=c a1=1f6fe58 a2=6e a3=7ffee1da5710 items=0 ppid=9127 pid=9128 auid=4294967295 uid=995 gid=993 euid=995 suid=995 fsuid=995 egid=993 sgid=993 fsgid=993 tty=(none) ses=4294967295 comm="nginx" exe="/usr/sbin/nginx" subj=system_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1454361591.701:13343): avc:  denied  { connectto } for  pid=9128 comm="nginx" path="/run/gunicorn/socket" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:initrc_t:s0 tclass=unix_stream_socket
type=SYSCALL msg=audit(1454361591.701:13343): arch=c000003e syscall=42 success=no exit=-13 a0=c a1=1f6fe58 a2=6e a3=7ffee1da5950 items=0 ppid=9127 pid=9128 auid=4294967295 uid=995 gid=993 euid=995 suid=995 fsuid=995 egid=993 sgid=993 fsgid=993 tty=(none) ses=4294967295 comm="nginx" exe="/usr/sbin/nginx" subj=system_u:system_r:httpd_t:s0 key=(null)

हर जगह मैं देखता हूं (उदाहरण के लिए, यहां और यहां ), यह कहने के लिए सक्षम करने के निर्देश nginx के लिए अनुरोध करने के लिए है, अनुरोध को SELinux द्वारा अस्वीकार कर दिया जाना चाहिए, फिर audit2allowभविष्य के अनुरोधों को अनुमति देने के लिए चलाएं । मैं किसी भी समझ नहीं chconया semanageआदेश है कि इस व्यवहार को स्पष्ट रूप से अनुमति देता है।

क्या यह एकमात्र तरीका है? यह हास्यास्पद लगता है कि आप एक ऐसी नीति स्थापित नहीं कर सकते हैं जो पहले से ही बिना किसी प्रयास के इनकार किए बिना सॉकेट को लिखने की अनुमति देता है और फिर एक उपकरण चला रहा है जो उन चीजों को सक्षम बनाता है जिन्हें अस्वीकार कर दिया गया था। आप कैसे जानते हैं कि वास्तव में क्या सक्षम किया जा रहा है? यह कैसे काम करना है अगर आपके स्वचालन के तहत मशीनों की स्थापना की जाए?

मैं CentOS 7 का उपयोग कर रहा हूं।


आपको एवीसी से इनकार किए गए संदेशों को हमें दिखाना होगा और यह जानना अच्छा होगा कि आप किस ओएस और संस्करण को चला रहे हैं।
user9517

@ अच्छा बिंदु।
drs

जवाबों:


23

यह हास्यास्पद लगता है कि आप एक ऐसी नीति स्थापित नहीं कर सकते हैं जो पहले से ही बिना किसी प्रयास के इनकार किए बिना सॉकेट को लिखने की अनुमति देता है और फिर एक उपकरण चला रहा है जो उन चीजों को सक्षम बनाता है जिन्हें अस्वीकार कर दिया गया था।

खैर नहीं, SELinux अनिवार्य प्रवेश नियंत्रण है, चीजों को डिफ़ॉल्ट रूप से अस्वीकार कर दिया जाता है और आपको स्पष्ट रूप से कुछ की अनुमति देना होगा। यदि नीति लेखकों ने किसी विशेष (फ्रैंकन) स्टैक पर विचार नहीं किया है या डेमॉन के लेखकों ने इसके लिए SELinux को जागरूक और लिखित नीति नहीं बनाई है तो आप अपने दम पर हैं। आपको यह विश्लेषण करना होगा कि आपकी सेवाएं क्या कर रही हैं और वे SELinux के साथ कैसे बातचीत कर रही हैं और इसकी अनुमति देने के लिए आपकी स्वयं की नीति आती है। आपको ऑडिट 2why , ऑडिट 2 क्लॉक आदि की मदद के लिए उपकरण उपलब्ध हैं ।

... क्या यह एकमात्र तरीका है?

नहीं, लेकिन यह इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं और आप इसे कैसे करने की कोशिश कर रहे हैं। उदाहरण के लिए आप 8010 (अनारक्षित_पार्ट) को पोर्ट करने के लिए nginx (httpd_t) को बांधना चाह सकते हैं। जब आप नगनेक्स शुरू करते हैं तो यह विफल हो जाता है

Starting nginx: nginx: [emerg] bind() to 0.0.0.0:8010 failed (13: Permission denied)

और आप (अंततः) ऑडिट लॉग में देखें और खोजें

type=AVC msg=audit(1457904756.503:41673): avc:  denied  { name_bind } for
pid=30483 comm="nginx" src=8010 scontext=unconfined_u:system_r:httpd_t:s0
tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket

आप ऑडिट 2alllow के माध्यम से इसे चला सकते हैं और भोलेपन से इसे स्वीकार करते हैं

allow httpd_t port_t:tcp_socket name_bind;

जो तब httpd_t को किसी भी tcp पोर्ट से जुड़ने की अनुमति देता है। यह वह नहीं हो सकता जो आप चाहते हैं।

आप पॉलिसी की जांच करने के लिए sesearch का उपयोग कर सकते हैं और देख सकते हैं कि httpd_t किस प्रकार के name_bind को दिखा सकता है

sesearch --allow -s httpd_t | grep name_bind
...
allow httpd_t http_port_t : tcp_socket name_bind ;
allow httpd_t http_port_t : udp_socket name_bind ;
...

अन्य प्रकारों के बीच http_t http_port_t से जुड़ सकता है। अब आप थोड़ा गहरा खुदाई करने के लिए सीमेन का उपयोग कर सकते हैं ।

semanage port -l | grep http_port_t
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
...

पोर्ट 8010 सूचीबद्ध नहीं है। जैसा कि हम चाहते हैं कि नगणक्स 8010 को पोर्ट करने के लिए बाध्य करें इसे http_port_t सूची में जोड़ना अनुचित नहीं है

semanage port -a -t http_port_t -p tcp 8010

अब nginx को name_bind को 8010 nd पोर्ट करने की अनुमति दी जाएगी, जैसा कि ऊपर प्रत्येक tcp पोर्ट नहीं है।

आप कैसे जानते हैं कि वास्तव में क्या सक्षम किया जा रहा है?

नीति में किए गए बदलावों को पढ़ना काफी आसान है, ऊपर दिए गए अपने संदेशों को ऑडिट 2 क्लॉक के माध्यम से चलाएं

allow httpd_t httpd_sys_content_t:sock_file write;
allow httpd_t initrc_t:unix_stream_socket connectto;

जो काफी आत्म व्याख्यात्मक लगता है।

उन में से पहला इनम 76151 के साथ फाइल को संदर्भित करता है। आप इसका नाम पाने के लिए खोज का उपयोग कर सकते हैं (ढूँढें / -inum 76151) और फिर semanage fcontext -a -t ...संदर्भ को ठीक करने के लिए पॉलिसी और रीस्टोरॉन को बदलने के लिए उपयोग करें।

दूसरा /run/gunicorn/socketजिसका संबंध फिर से गलत संदर्भ से है। Sesearch का उपयोग करके हम देख सकते हैं कि http_t, unix_stream_sockets के प्रकार (दूसरों के बीच) http_t को कनेक्ट कर सकता है। इसलिए हम उदाहरण के अनुसार संदर्भ बदल सकते हैं

semanage fcontext -a -t httpd_t "/run/gunicorn(/.*)?"
restorecon -r /run

यह / run / gunicorn और ट्री का संदर्भ सेट करता है | इसके नीचे की फाइलें httpd_t।

यह कैसे काम करना है अगर आपके स्वचालन के तहत मशीनों की स्थापना की जाए?

आपको सिस्टम का विश्लेषण करने और परीक्षण में उचित बदलाव करने की आवश्यकता है। आप तब परिवर्तन के लिए तैनात करने के लिए अपने स्वचालन उपकरण का उपयोग करते हैं, कठपुतली और ansible के पास इसके लिए समर्थन है।

बेशक आप यह सब करने के लिए उत्पादन में सेलाइनक्स के साथ अनुमति के लिए सेट कर सकते हैं। सभी संदेशों को इकट्ठा करें, उन्हें अपने परिवर्तनों पर निर्णय लेने और उन्हें तैनात करने का विश्लेषण करें।

SELinux के बारे में जानने के लिए बहुत कुछ है लेकिन यह मेरे कौशल की सीमा है, माइकल हैम्पटन बेहतर है और मैथ्यू इफ फिर से बेहतर है, उनके पास और भी कुछ हो सकता है।


1
आपकी सलाह पूरी तरह से है और मुझे इन मुद्दों को हल करने के लिए बहुत करीब आती है, हालांकि अभी भी मुझे थोड़ा कम छोड़ देता है। allow httpd_t httpd_sys_content_t:sock_file write;मेरे लिए उतनी आत्म-व्याख्यात्मक नहीं है जितनी आपने आशा की थी। यह क्या कह रहा है कि उस फाइल पर पॉलिसी को बदलने की जरूरत है (यानी, कमांड -tमें क्या जाता है semanage?
dr

साथ ही, मुझे semanageसीधे आपके आदेशों का उपयोग करते समय उपयोग निर्देश मिलते हैं। मुझे एक --addतर्क जोड़ने की जरूरत है ।
drs

दरअसल, मुझे यह भी कहना चाहिए कि सॉकेट फ़ाइल के प्रकार httpd_var_run_tको माइकल हैम्पटन के रूप में नीचे बदलने के बाद , audit2allowसंदेश है:allow httpd_t var_run_t:sock_file write;
dr

ऐसा लगता है कि आपने इसे सेट var_run_tनहीं किया है httpd_var_run_t
user9517

@ लीन, हम्म .. कोई पासा नहीं। अब audit2allowकहते हैंallow httpd_t var_run_t:sock_file write;
डीआरएस

2

आप जिस प्रकार का उपयोग करना चाहते हैं वह नहीं है httpd_sys_content_t। यह स्थिर फ़ाइलों के लिए है जो वेब सर्वर उपयोगकर्ता एजेंटों की सेवा के लिए है।

इंटरप्रोसेस संचार के लिए उपयोग किए जाने वाले सॉकेट के लिए, आप जिस प्रकार की तलाश कर रहे हैं httpd_var_run_t

हालाँकि, कृपया ध्यान दें कि क्योंकि आप अपरिवर्तित भाग गए हैं, इसलिए इसके साथ संवाद करने में अतिरिक्त समस्याएँ हो सकती हैं।


3
धन्यवाद! ऐसा लगता है कि इस SELinux मुद्दों में से एक का ख्याल रखा। किसी भी संकेत पर कि कैसे gunicorn (या किसी अन्य सेवा) को सीमित करना है?
डीआरएस

1

मैंने सफलता के बिना पिछले जवाबों की कोशिश की, मेरे मामले में मैं एक यूजेंसी एप्लिकेशन के लिए एक नगनेक्स सर्वर का उपयोग कर रहा हूं ताकि यूनिक्स सॉकेट्स का उपयोग करके उन्हें संचारित किया जा सके, मेरा ओएस इट्स ए फेडोरा सर्वर 26।

यूनिक्स सॉकेट निर्देशिका में बनाए गए हैं /var/local/myapp:

/var/local/myapp/server.sock    
/var/local/myapp/stats.sock

SELinux को कॉन्फ़िगर करने के लिए मुझे संदर्भ प्रकार जोड़ना होगा: httpd_sys_rw_content_t

semanage fcontext -at httpd_sys_rw_content_t "/var/local/myapp(/.*)?"
restorecon -R -v '/var/local/myapp' 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.