خلفية لوحدات أمان Linux و SELinux
Security Enhanced Linux عبارة عن مجموعة من القواعد وآلية الوصول التي تستند إلى نماذج الوصول الإلزامية والقائمة على الأدوار لحماية أنظمة Linux من التهديدات المحتملة وإصلاح عيوب التحكم في الوصول التقديري (DAC) ، وهو نظام أمان Unix التقليدي. نشأ المشروع في أحشاء وكالة الأمن القومي الأمريكية ، وشارك بشكل مباشر في التطوير شركة Secure Computing Corporation و MITER ، بالإضافة إلى عدد من المعامل البحثية.

وحدات أمان Linux
أدلى Linus Torvalds بعدد من التعليقات حول التطورات الجديدة لوكالة الأمن القومي بحيث يمكن تضمينها في نواة Linux المنبع. ووصف البيئة العامة ، مع مجموعة من المعترضات لإدارة العمليات مع الكائنات ومجموعة من بعض الحقول الوقائية في هياكل بيانات النواة لتخزين السمات المقابلة. يمكن بعد ذلك استخدام هذه البيئة بواسطة وحدات kernel القابلة للتحميل لتنفيذ أي نموذج أمان مطلوب. تم دمج LSM بالكامل في Linux v2.6 kernel في 2003.
يشتمل إطار عمل LSM على حقول حماية في هياكل البيانات واستدعاءات لاعتراض الوظائف في النقاط الحرجة في كود النواة لإدارتها وتنفيذ التحكم في الوصول. كما أنه يضيف وظائف لتسجيل وحدات الأمان. تحتوي الواجهة / sys / kernel / security / lsm على قائمة بالوحدات النمطية النشطة على النظام. يتم تخزين خطافات LSM في قوائم يتم استدعاؤها بالترتيب المحدد في CONFIG_LSM. يتم تضمين وثائق الخطاف التفصيلية في ملف التضمين / linux / lsm_hooks.h الرئيسي.
سمح النظام الفرعي LSM بدمج SELinux الكامل لنفس النواة المستقرة Linux kernel v2.6. على الفور تقريبًا أصبحت SELinux المعيار الفعلي لبيئات Linux الآمنة وأصبحت جزءًا من التوزيعات الأكثر شيوعًا: RedHat Enterprise Linux و Fedora و Debian و Ubuntu.
مسرد SELinux
- — SELinux , Unix/Linux user id, , . Linux SELinux. SELinux , , — .
- — SELinux , . . . , . — , . : sysadm_t , user_t, . init init_t, named named_t.
- — , SELinux. , . . Role Based Access Control (RBAC), SELinux.
- — Type Enforcement, , . , , , , , , . .
- — , . : , , ., , , — .
- SELinux — SELinux . SELinux , — — . , . .
LSM SELinux
على الرغم من اسم LSMs ليست وحدات Linux قابلة للتحميل بشكل عام. ومع ذلك ، مثل SELinux ، يتم دمجه مباشرة في النواة. يتطلب أي تغيير في التعليمات البرمجية المصدر لـ LSM تجميعًا جديدًا لـ kernel. يجب تمكين الخيار المقابل في إعدادات kernel ، وإلا فلن يتم تنشيط رمز LSM بعد التمهيد. ومع ذلك ، يمكن تمكينه باستخدام خيار أداة تحميل نظام التشغيل.

LSM check stack
LSM مجهز بخطافات في الوظائف الأساسية التي قد تكون ذات صلة بالفحوصات. إحدى السمات الرئيسية لـ LSMs هي أنها مكدسة. وبالتالي ، لا تزال عمليات الفحص القياسية قيد التنفيذ ، وتضيف كل طبقة LSM فقط عناصر تحكم وعناصر تحكم إضافية. هذا يعني أنه لا يمكن التراجع عن الحظر. يظهر هذا في الشكل ، إذا كانت نتيجة فحوصات DAC الروتينية فاشلة ، فلن تصل حتى إلى خطافات LSM.
تبنت SELinux بنية أمان Flask لنظام تشغيل أبحاث Fluke ، ولا سيما مبدأ الامتياز الأقل. جوهر هذا المفهوم ، كما يوحي اسمه ، هو منح المستخدم أو معالجة تلك الحقوق الضرورية فقط لتنفيذ الإجراءات المقصودة. يتم تنفيذ هذا المبدأ باستخدام الكتابة القسرية للوصول ، وبالتالي فإن التحكم في قبول SELinux يعتمد على domain => type model.
بسبب الكتابة القسرية للوصول ، تمتلك SELinux قدرات تحكم في الوصول أكثر أهمية من نموذج DAC التقليدي المستخدم في نظام التشغيل Unix / Linux OS. على سبيل المثال ، يمكنك تقييد رقم منفذ الشبكة الذي سيحدث لخادم بروتوكول نقل الملفات ، والسماح لكتابة الملفات وتغييرها في مجلد معين ، ولكن لا يمكنك حذفها.
المكونات الرئيسية لـ SELinux هي:
- خادم تنفيذ السياسة - الآلية الرئيسية لتنظيم التحكم في الوصول.
- قاعدة بيانات سياسات أمن النظام.
- التفاعل مع اعتراض حدث LSM.
- Selinuxfs - Pseudo-FS ، مثل / proc ومثبت في / sys / fs / selinux. يتم ملؤها ديناميكيًا بواسطة Linux kernel في وقت التشغيل وتحتوي على ملفات تحتوي على معلومات حالة SELinux.
- الوصول إلى Vector Cache - مساعد أداء.
كيف يعمل SELinux
كل هذا يعمل على النحو التالي.
- يقوم موضوع معين ، وفقًا لمصطلحات SELinux ، بتنفيذ إجراء مسموح به على كائن بعد فحص DAC ، كما هو موضح في الصورة العليا. هذا الطلب لتنفيذ العملية يذهب إلى اعتراض حدث LSM.
- من هناك ، يتم تمرير الطلب ، إلى جانب سياق الأمان للموضوع والكائن ، إلى الوحدة النمطية SELinux Abstraction و Hook Logic المسؤولة عن التفاعل مع LSM.
- خادم تنفيذ السياسة هو المثال لاتخاذ قرار بشأن وصول الموضوع إلى الكائن ، وتأتي إليه البيانات من SELinux AnHL.
- لاتخاذ قرار بشأن الوصول أو الرفض ، يستشير خادم Policy Enforcement Server النظام الفرعي للتخزين المؤقت لقواعد Access Vector Cache (AVC) الأكثر استخدامًا.
- إذا لم يتم العثور على حل للقاعدة المقابلة في ذاكرة التخزين المؤقت ، فسيتم تمرير الطلب إلى قاعدة بيانات نهج الأمان.
- يتم إرجاع نتيجة البحث من DB و AVC إلى Policy Enforcement Server.
- إذا كانت السياسة التي تم العثور عليها تتطابق مع الإجراء المطلوب ، فسيتم السماح بالعملية. خلاف ذلك ، فإن العملية محظورة.
إدارة إعدادات SELinux
يعمل SELinux في واحد من ثلاثة أوضاع:
- الإنفاذ - التقيد الصارم بالسياسات الأمنية.
- مسموح - يُسمح بانتهاك القيود ، ويتم وضع العلامة المقابلة في السجل.
- معطل - سياسات الأمان ليست سارية المفعول.
يمكنك معرفة الوضع الذي يوجد فيه SELinux باستخدام الأمر التالي.
[admin@server ~]$ getenforce
Permissive
تغيير الوضع قبل إعادة التشغيل ، على سبيل المثال ، اضبطه على فرض ، أو 1. تتوافق المعلمة المسموح بها مع الرمز الرقمي 0.
[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #
يمكنك أيضًا تغيير الوضع عن طريق تحرير الملف:
[admin@server ~]$ cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE = targete
الاختلاف مع setenfoce هو أنه عند بدء تشغيل نظام التشغيل ، سيتم ضبط وضع SELinux وفقًا لقيمة معامل SELINUX لملف التكوين. بالإضافة إلى ذلك ، فإن التغييرات لفرض <=> تعطيل لا تسري إلا من خلال تحرير ملف / etc / selinux / config وبعد إعادة التشغيل.
عرض تقرير حالة قصير:
[admin@server ~]$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31
تستخدم بعض المرافق الأصلية المعامل -Z لعرض سمات SELinux.
[admin@server ~]$ ls -lZ /var/log/httpd/
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200920
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200927
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201004
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201011
[admin@server ~]$ ps -u apache -Z
LABEL PID TTY TIME CMD
system_u:system_r:httpd_t:s0 2914 ? 00:00:04 httpd
system_u:system_r:httpd_t:s0 2915 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 2916 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 2917 ? 00:00:00 httpd
...
system_u:system_r:httpd_t:s0 2918 ? 00:00:00 httpd
بالمقارنة مع الناتج ls -l المعتاد ، هناك عدة حقول إضافية بالتنسيق التالي:
<user>:<role>:<type>:<level>
يشير الحقل الأخير إلى شيء مثل ختم السرية ويتكون من مزيج من عنصرين:
- s0 - الأهمية ، وتكتب أيضًا كفاصل زمني منخفض المستوى وعالي المستوى
- c0 ، c1… c1023 - الفئة.
تغيير تكوين الوصول
استخدم semodule لتحميل وحدات SELinux وإضافتها وإزالتها.
[admin@server ~]$ semodule -l |wc -l #
408
[admin@server ~]$ semodule -e abrt #enable -
[admin@server ~]$ semodule -d accountsd #disable -
[admin@server ~]$ semodule -r avahi #remove -
الأمر الأول ، semanage login ، يربط مستخدم SELinux بمستخدم نظام التشغيل ، والثاني يعرض القائمة. أخيرًا ، يزيل الأمر الأخير بالمفتاح -r التعيين من مستخدمي SELinux إلى حسابات نظام التشغيل. تم العثور على شرح لبناء الجملة لقيم نطاق MLS / MCS في القسم السابق.
[admin@server ~]$ semanage login -a -s user_u karol
[admin@server ~]$ semanage login -l
Login Name SELinux User MLS/MCS Range Service
__default__ unconfined_u s0-s0:c0.c1023 *
root unconfined_u s0-s0:c0.c1023 *
system_u system_u s0-s0:c0.c1023 *
[admin@server ~]$ semanage login -d karol
و هو الأمر المستخدم semanage تستخدم لإدارة تعيينات بين المستخدمين سيلينو والأدوار.
[admin@server ~]$ semanage user -l
Labeling MLS/ MLS/
SELinux User Prefix MCS Level MCS Range SELinux Roles
guest_u user s0 s0 guest_r
staff_u staff s0 s0-s0:c0.c1023 staff_r sysadm_r
...
user_u user s0 s0 user_r
xguest_u user s0 s0 xguest_r
[admin@server ~]$ semanage user -a -R 'staff_r user_r'
[admin@server ~]$ semanage user -d test_u
معلمات الأمر:
- -a إضافة إدخال تعيين دور مخصص ؛
- -l قائمة المراسلات بين المستخدمين والأدوار ؛
- -d إزالة إدخال تعيين الدور المحدد من قبل المستخدم ؛
- -R قائمة الأدوار المخصصة للمستخدم ؛
الملفات والمنافذ والمنطقية
توفر كل وحدة SELinux مجموعة من القواعد لتمييز الملفات ، ولكن يمكنك أيضًا إضافة القواعد الخاصة بك إذا لزم الأمر. على سبيل المثال ، نريد أن يكون لخادم الويب حقوق الوصول إلى المجلد / srv / www.
[admin@server ~]$ semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?
[admin@server ~]$ restorecon -R /srv/www/
يسجل الأمر الأول قواعد وضع العلامات الجديدة ، ويقوم الأمر الثاني بإعادة تعيين أنواع الملفات أو بالأحرى تعيينها وفقًا للقواعد الحالية.
وبالمثل ، يتم تمييز منافذ TCP / UDP بحيث يمكن فقط للخدمات المقابلة الاستماع إليها. على سبيل المثال ، لكي يستمع خادم الويب على المنفذ 8080 ، تحتاج إلى تشغيل الأمر.
[admin@server ~]$ semanage port -m -t http_port_t -p tcp 8080
يحتوي عدد كبير من وحدات SELinux على معلمات يمكن أن تأخذ قيمًا منطقية. يمكن رؤية القائمة الكاملة لهذه المعلمات باستخدام getsebool -a. يمكنك تغيير القيم المنطقية باستخدام setsebool.
[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_cgi --> on
[admin@server ~]$ setsebool -P httpd_enable_cgi off
[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_homedirs --> off
ورشة عمل ، الوصول إلى واجهة Pgadmin-web
ضع في اعتبارك مثالًا من الممارسة ، قمنا بتثبيته على RHEL 7.6 pgadmin4-web لإدارة قاعدة بيانات PostgreSQL. مررنا صغيرة السعي مع وضع pg_hba.conf، postgresql.conf وconfig_local.py، تعيين حقوق إلى مجلدات، وتركيب عداد المفقودين وحدات بيثون من نقطة. كل شيء جاهز ، قم بتشغيله واحصل على 500 خطأ خادم داخلي .
بدءًا من المشتبه بهم النموذجيين ، تحقق من / var / log / httpd / error_log. هناك بعض المداخل المثيرة للاهتمام. في هذه المرحلة ، سيميل معظم مسؤولي Linux إلى تشغيل setencorce 0 ، وهذا كل شيء. بصراحة ، أول مرة فعلت ذلك. هذا ، بالطبع ، هو أيضًا حل ، لكنه ليس الأفضل.
[timestamp] [core:notice] [pid 23689] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
...
[timestamp] [wsgi:error] [pid 23690] [Errno 13] Permission denied: '/var/lib/pgadmin'
[timestamp] [wsgi:error] [pid 23690]
[timestamp] [wsgi:error] [pid 23690] HINT : You may need to manually set the permissions on
[timestamp] [wsgi:error] [pid 23690] /var/lib/pgadmin to allow apache to write to it.
على الرغم من تصميمها المرهق ، يمكن أن تكون SELinux سهلة الاستخدام. يكفي تثبيت حزمة مجموعة استكشاف الأخطاء وإصلاحها وعرض سجل النظام. لاحظ أنه يجب إعادة تشغيل خدمة التدقيق بهذه الطريقة ، وعدم استخدام systemctl ، على الرغم من وجود systemd في نظام التشغيل. لن يشير سجل النظام إلى حقيقة الحظر فحسب ، بل سيشير أيضًا إلى سبب وطريقة التغلب على الحظر . نقوم بتنفيذ هذه الأوامر: نتحقق من الوصول إلى صفحة الويب pgadmin4 ، كل شيء يعمل.
[admin@server ~]$ yum install setroubleshoot
[admin@server ~]$ journalctl -b -0
[admin@server ~]$ service restart auditd
[admin@server ~]$ setsebool -P httpd_can_network_connect 1
[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1
