আমি SELinux কে কীভাবে নিরীক্ষণবিহীন ছাড়াই ইউনিক্স সকেটে এনগিনেক্স অ্যাক্সেসের অনুমতি দিতে বলতে পারি?


10

আমার কাছে ইউনিক্স সকেটের মাধ্যমে বন্দুকের জন্য নগ্নিক্স ফরোয়ার্ড করার অনুরোধ রয়েছে /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)

আমি যেখানেই দেখি (উদাঃ, এখানে এবং এখানে ), এনগিনেক্সে একটি অনুরোধ করার জন্য এটি সক্ষম করার নির্দেশাবলী, অনুরোধটি সেলইনাক্স দ্বারা প্রত্যাখ্যান করা উচিত, তারপরে audit2allowভবিষ্যতের অনুরোধগুলি অনুমোদনের জন্য চালান । আমি এমন কোনও আদেশ chconবা semanageআদেশ সন্ধান করতে পারি না যা স্পষ্টভাবে এই আচরণের অনুমতি দেয়।

এই একমাত্র উপায়? এটি হাস্যকর বলে মনে হচ্ছে যে আপনি কোনও নীতি সেট আপ করতে পারবেন না যা এনজিনেক্সকে প্রথমে চেষ্টা অস্বীকার না করে এবং পরে এমন একটি সরঞ্জাম চালনা না করে সকেটে লিখতে দেয় যা প্রত্যাখ্যানিত জিনিসগুলিকে সক্ষম করে। কীভাবে সক্ষম হচ্ছেন তা আপনি কীভাবে জানবেন? আপনার অটোমেশনের অধীনে মেশিনগুলি সেট আপ করলে এটি কীভাবে কাজ করবে?

আমি CentOS 7 ব্যবহার করছি।


আপনাকে আমাদের AVC অস্বীকার করা বার্তাটি দেখাতে হবে এবং আপনি কোন ওএস এবং সংস্করণটি খুব চালাচ্ছেন তা জেনে রাখা ভাল।
ব্যবহারকারী 9517

@ ভাল কথা।
ডিআরএস

উত্তর:


23

এটি হাস্যকর বলে মনে হচ্ছে যে আপনি কোনও নীতি সেট আপ করতে পারবেন না যা এনজিনেক্সকে প্রথমে চেষ্টা অস্বীকার না করে এবং পরে এমন একটি সরঞ্জাম চালনা না করে সকেটে লিখতে দেয় যা প্রত্যাখ্যানিত জিনিসগুলিকে সক্ষম করে।

ঠিক আছে না, সেলইনাক্স হ'ল ম্যান্ডেটরি অ্যাক্সেস কন্ট্রোল, ডিফল্টরূপে জিনিসগুলি অস্বীকার করা হয় এবং আপনাকে স্পষ্টভাবে কিছু অনুমতি দিতে হবে। নীতি লেখকগণ যদি কোনও নির্দিষ্ট (স্পষ্ট) স্ট্যাক বিবেচনা না করে থাকেন বা ডেমন লেখকরা এটির জন্য সেলইনাক্সকে সচেতন এবং লিখিত নীতি না করে থাকেন তবে আপনি নিজেরাই রয়েছেন। আপনার পরিষেবাগুলি কী করছে এবং কীভাবে তারা এসইএলিনাক্সের সাথে যোগাযোগ করছে তা আপনাকে বিশ্লেষণ করতে হবে এবং এটির অনুমতি দেওয়ার জন্য আপনার নিজস্ব নীতি নিয়ে আসতে হবে with আপনাকে নিরীক্ষণ 2 কেন , নিরীক্ষণ 2 ইত্যাদি সহায়তা করার জন্য সরঞ্জামগুলি উপলব্ধ রয়েছে available

... এই একমাত্র উপায়?

না, তবে এটি নির্ভর করে যে আপনি কী করার চেষ্টা করছেন এবং সমাধান কী তা আপনি কীভাবে এটি করার চেষ্টা করছেন upon উদাহরণস্বরূপ আপনি 8010 (রক্ষিত_বন্দর_টি) পোর্টে এনজিনেক্স (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

আপনি এটি অডিট 2 এর মাধ্যমে চালাতে পারেন এবং নির্বিচারে এটির ফলাফলগুলি মেনে নিতে পারেন

allow httpd_t port_t:tcp_socket name_bind;

যা তারপরে httpd_t কে কোনও টিসিপি পোর্টের সাথে সংযোগ করতে দেয়। এটি আপনি যা চান তা নাও হতে পারে।

নীতিটি তদন্ত করতে আপনি সিসারচ ব্যবহার করতে পারেন এবং দেখতে পোর্ট কী ধরণের httpd_t নাম_বাইন্ড করতে পারে

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 তালিকাভুক্ত নয়। যেহেতু আমরা nginx 8010 বন্দরটি আবদ্ধ করতে চাই তা এটিকে http_port_t তালিকায় যুক্ত করা অযৌক্তিক নয়

semanage port -a -t http_port_t -p tcp 8010

এখন nginx উপরের মতো প্রতিটি টিসিপি পোর্ট নয় 8010 পোর্টে নাম_বাইন্ড করার অনুমতি পাবে।

কীভাবে সক্ষম হচ্ছেন তা আপনি কীভাবে জানবেন?

নীতির পরিবর্তনগুলি পড়ার পক্ষে মোটামুটি সহজ, উপরের বার্তাটি নিরীক্ষণের মাধ্যমে আমরা পেয়ে যাচ্ছি get

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

যা মোটামুটি স্ব বর্ণনামূলক বলে মনে হয়।

এর মধ্যে প্রথমটি ইনম 15 76১৫১ সহ ফাইলটিকে বোঝায় it's আপনি এর নাম (সন্ধান / -inum 76151) পেতে অনুসন্ধান ব্যবহার semanage fcontext -a -t ...করতে পারেন এবং তারপরে নীতিটি পরিবর্তন করতে এবং প্রসঙ্গটি ঠিক করতে পুনরুদ্ধার করতে পারেন।

দ্বিতীয়টির সাথে সম্পর্কিত /run/gunicorn/socketযা আবার ভুল প্রসঙ্গে। সিসারচ ব্যবহার করে আমরা দেখতে পাচ্ছি যে http_t ইউনিক্স_ স্ট্রিম_সকেটগুলিতে সংযুক্ত হতে পারে (অন্যদের মধ্যে) http_t। সুতরাং আমরা উদাহরণটি অনুসারে প্রসঙ্গটি পরিবর্তন করতে পারি

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

এটি / রান / গ্যানিকর্ন এবং গাছের প্রসঙ্গ নির্ধারণ করে এটির নীচে ফাইলগুলি httpd_t।

আপনার অটোমেশনের অধীনে মেশিনগুলি সেট আপ করলে এটি কীভাবে কাজ করবে?

আপনাকে সিস্টেমটি বিশ্লেষণ করতে হবে এবং পরীক্ষায় যথাযথ পরিবর্তন করতে হবে। তারপরে আপনি পরিবর্তনগুলি মোতায়েন করতে আপনার অটোমেশন সরঞ্জামগুলি ব্যবহার করেন, পুতুল এবং উত্তরীয়দের এর পক্ষে সমর্থন আছে have

অবশ্যই আপনি প্রযোজনার সাথে সেট সেলিনাক্সের সাথে উত্পাদনে এটি সব করতে পারেন। সমস্ত বার্তা সংগ্রহ করুন, আপনার পরিবর্তনগুলি সম্পর্কে সিদ্ধান্ত নিয়ে সেগুলি বিশ্লেষণ করুন এবং সেগুলি স্থাপন করুন।

সেলিনাক্স সম্পর্কে আরও অনেক কিছু জানার আছে তবে এটি আমার দক্ষতার সীমা, মাইকেল হ্যাম্পটন আরও ভাল এবং ম্যাথিউ আইফি আরও ভাল, তাদের আরও যোগ করার সম্ভাবনা রয়েছে।


1
আপনার পরামর্শ পুঙ্খানুপুঙ্খভাবে রয়েছে এবং নিজেকে এই সমস্যাগুলি সমাধান করার জন্য আমাকে আরও কাছে পেয়ে যায়, তবুও আমাকে কিছুটা ছোট রেখে দেয়। allow httpd_t httpd_sys_content_t:sock_file write;আপনি যেমন আশা করেছিলেন তেমন আমার কাছে স্ব-ব্যাখ্যামূলক নয়। এই ফাইলে নীতিটি কী পরিবর্তন করতে হবে (অর্থাত, কমান্ডের পরে কী -tঘটে semanage?
ডিআরএস

এছাড়াও, আপনার semanageআদেশগুলি সরাসরি ব্যবহার করার সময় আমি ব্যবহারের নির্দেশাবলী পাই । আমার --addযুক্তি যুক্ত করা দরকার
ডিআরএস

আসলে, আমার আরও বলা উচিত যে সকেট ফাইলের httpd_var_run_taudit2allowallow httpd_t var_run_t:sock_file write;
ধরণটি

দেখে মনে হচ্ছে আপনি এটি সেট var_run_tনা করেছেন httpd_var_run_t
ব্যবহারকারী 9517

@ লইন, হুম .. না পাশা। এখন audit2allowবলেছেনallow httpd_t var_run_t:sock_file write;
ডিআরএস

2

আপনি যে ধরণের ব্যবহার করতে চান তা নয় httpd_sys_content_t। এটি স্ট্যাটিক ফাইলগুলির জন্য যা ওয়েব সার্ভারটি ব্যবহারকারী এজেন্টদের পরিবেশন করতে বোঝানো হয়।

ইন্টারপ্রোসেস যোগাযোগের জন্য ব্যবহৃত সকেটের জন্য, আপনি যে ধরণের সন্ধান করছেন তা হ'ল httpd_var_run_t

যদিও, দয়া করে মনে রাখবেন যে আপনি বন্দুকবিহীন দফায় দফায় দৌড়েছিলেন, এর সাথে যোগাযোগ করার ক্ষেত্রে আরও সমস্যা হতে পারে।


3
ধন্যবাদ! দেখে মনে হচ্ছে এটি সেলইনক্স ইস্যুগুলির কোনওটির যত্ন নিয়েছে। বন্দুকবিশেষ (বা অন্য কোনও পরিষেবা) কীভাবে সীমাবদ্ধ সেট আপ করবেন তার কোনও পয়েন্টার?
ডিআরএস

1

আমি সাফল্য ছাড়াই পূর্ববর্তী উত্তরগুলি চেষ্টা করেছিলাম, আমার ক্ষেত্রে আমি ইউজগি অ্যাপ্লিকেশনটির জন্য একটি এনগিনেক্স সার্ভারটি যোগাযোগ করতে ইউনিক্স সকেট ব্যবহার করে, আমার ওএস এটি একটি ফেডোরা সার্ভার 26।

ইউনিক্স সকেট ডিরেক্টরিতে তৈরি করা হয় /var/local/myapp:

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

সেলিনাক্স কনফিগার করতে আমাকে প্রসঙ্গের প্রকারটি যুক্ত করতে হয়েছিল: httpd_sys_rw_content_t

semanage fcontext -at httpd_sys_rw_content_t "/var/local/myapp(/.*)?"
restorecon -R -v '/var/local/myapp' 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.