سیستم های امنیتی لینوکس

یکی از دلایل موفقیت فوق العاده سیستم عامل لینوکس در دستگاه های جاسازی شده، تلفن همراه و سرورها، امنیت نسبتاً بالای هسته، سرویس ها و برنامه های کاربردی مرتبط است. اما اگر نگاه دقیقتری بینداز با توجه به معماری هسته لینوکس، یافتن مربعی که مسئولیت امنیت را به عهده دارد در آن غیرممکن است. زیرسیستم امنیتی لینوکس در کجا پنهان شده است و از چه چیزی تشکیل شده است؟

پیشینه ماژول های امنیتی لینوکس و SELinux

لینوکس تقویت‌شده امنیتی مجموعه‌ای از قوانین و مکانیسم‌های دسترسی مبتنی بر مدل‌های دسترسی اجباری و مبتنی بر نقش برای محافظت از سیستم‌های لینوکس در برابر تهدیدات احتمالی و اصلاح کاستی‌های کنترل دسترسی اختیاری (DAC)، سیستم امنیتی سنتی یونیکس است. این پروژه از روده های آژانس امنیت ملی ایالات متحده سرچشمه گرفت و به طور مستقیم توسط پیمانکاران Secure Computing Corporation و MITER و همچنین تعدادی از آزمایشگاه های تحقیقاتی توسعه یافت.

سیستم های امنیتی لینوکس
ماژول های امنیتی لینوکس

لینوس توروالدز در مورد پیشرفت‌های جدید NSA نظراتی ارائه کرد تا بتوان آنها را در هسته اصلی لینوکس گنجاند. او یک محیط کلی را با مجموعه ای از رهگیرها برای کنترل عملیات با اشیا و مجموعه ای از فیلدهای حفاظتی خاص در ساختارهای داده هسته برای ذخیره ویژگی های مربوطه توصیف کرد. این محیط سپس می تواند توسط ماژول های هسته قابل بارگذاری برای پیاده سازی هر مدل امنیتی مورد نظر استفاده شود. LSM به طور کامل در سال 2.6 وارد هسته لینوکس نسخه 2003 شد.

چارچوب LSM شامل فیلدهای نگهبان در ساختارهای داده و فراخوانی توابع رهگیری در نقاط بحرانی در کد هسته برای دستکاری آنها و انجام کنترل دسترسی است. همچنین قابلیتی برای ثبت ماژول های امنیتی اضافه می کند. رابط /sys/kernel/security/lsm حاوی لیستی از ماژول های فعال در سیستم است. قلاب های LSM در لیست هایی ذخیره می شوند که به ترتیب مشخص شده در CONFIG_LSM فراخوانی می شوند. مستندات دقیق در مورد قلاب ها در فایل هدر شامل/linux/lsm_hooks.h است.

زیرسیستم LSM امکان تکمیل ادغام کامل SELinux را با همان نسخه از هسته پایدار لینوکس نسخه 2.6 فراهم کرد. تقریباً بلافاصله، SELinux به استاندارد واقعی برای یک محیط امن لینوکس تبدیل شد و در محبوب ترین توزیع ها گنجانده شد: RedHat Enterprise Linux، Fedora، Debian، Ubuntu.

واژه نامه SELinux

  • هویت - کاربر SELinux با شناسه کاربر معمولی یونیکس/لینوکس یکسان نیست؛ آنها می توانند در یک سیستم همزیستی داشته باشند، اما در اصل کاملاً متفاوت هستند. هر حساب استاندارد لینوکس می تواند با یک یا چند حساب در SELinux مطابقت داشته باشد. هویت SELinux بخشی از زمینه امنیتی کلی است که تعیین می‌کند به کدام دامنه‌ها می‌توانید بپیوندید و نمی‌توانید بپیوندید.
  • دامنه - در SELinux، یک دامنه، زمینه اجرای یک موضوع، یعنی یک فرآیند است. دامنه مستقیماً دسترسی یک فرآیند را تعیین می کند. دامنه اساساً فهرستی از کارهایی است که فرآیندها می توانند انجام دهند یا کارهایی که یک فرآیند می تواند با انواع مختلف انجام دهد. برخی از نمونه‌های دامنه عبارتند از sysadm_t برای مدیریت سیستم و user_t که یک دامنه کاربر عادی غیرمجاز است. سیستم init در دامنه init_t و فرآیند نامگذاری شده در دامنه named_t اجرا می شود.
  • نقش ها - چیزی که به عنوان واسطه بین دامنه ها و کاربران SELinux عمل می کند. نقش ها تعیین می کنند که کاربر می تواند به کدام دامنه ها تعلق داشته باشد و به چه نوع اشیایی می تواند دسترسی داشته باشد. این مکانیسم کنترل دسترسی از تهدید حملات افزایش امتیاز جلوگیری می کند. نقش ها در مدل امنیتی Role Based Access Control (RBAC) مورد استفاده در SELinux نوشته می شوند.
  • انواع - یک ویژگی لیست اجرایی نوع که به یک شی اختصاص داده می شود و تعیین می کند چه کسی می تواند به آن دسترسی داشته باشد. مشابه تعریف دامنه، با این تفاوت که دامنه برای یک فرآیند اعمال می شود، و نوع برای اشیایی مانند دایرکتوری ها، فایل ها، سوکت ها و غیره اعمال می شود.
  • موضوعات و اشیاء - فرآیندها موضوع هستند و در یک زمینه خاص یا حوزه امنیتی اجرا می شوند. منابع سیستم عامل: فایل ها، دایرکتوری ها، سوکت ها و غیره، اشیایی هستند که نوع خاصی و به عبارت دیگر سطح حریم خصوصی به آنها اختصاص داده شده است.
  • سیاست های SELinux — SELinux از سیاست های مختلفی برای محافظت از سیستم استفاده می کند. خط مشی SELinux دسترسی کاربران به نقش ها، نقش ها به دامنه ها و دامنه ها به انواع را تعریف می کند. ابتدا کاربر مجاز به دریافت یک نقش است، سپس نقش مجاز به دسترسی به دامنه ها است. در نهایت، یک دامنه فقط می تواند به انواع خاصی از اشیاء دسترسی داشته باشد.

معماری LSM و SELinux

علیرغم نام، LSM ها معمولا ماژول های لینوکس قابل بارگیری نیستند. با این حال، مانند SELinux، مستقیماً در هسته ادغام می شود. هر تغییری در کد منبع LSM نیاز به یک کامپایل هسته جدید دارد. گزینه مربوطه باید در تنظیمات هسته فعال باشد، در غیر این صورت کد LSM پس از بوت فعال نمی شود. اما حتی در این حالت نیز می توان آن را توسط گزینه OS bootloader فعال کرد.

سیستم های امنیتی لینوکس
پشته چک LSM

LSM مجهز به قلاب هایی در توابع هسته هسته است که می تواند برای بررسی ها مرتبط باشد. یکی از ویژگی های اصلی LSM ها این است که آنها روی هم چیده شده اند. بنابراین، بررسی های استاندارد همچنان انجام می شود و هر لایه LSM فقط کنترل ها و کنترل های اضافی را اضافه می کند. این بدان معنی است که این ممنوعیت قابل لغو نیست. این در شکل نشان داده شده است؛ اگر نتیجه بررسی های معمول DAC خراب باشد، آنگاه موضوع حتی به قلاب های LSM هم نمی رسد.

SELinux از معماری امنیتی Flask سیستم عامل تحقیقاتی Fluke، به ویژه اصل حداقل امتیاز استفاده می کند. ماهیت این مفهوم، همانطور که از نام آن پیداست، اعطای تنها حقوقی به کاربر یا پردازش است که برای انجام اقدامات مورد نظر ضروری است. این اصل با استفاده از تایپ دسترسی اجباری پیاده سازی می شود، بنابراین کنترل دسترسی در SELinux بر اساس مدل نوع دامنه => است.

به لطف تایپ دسترسی اجباری، SELinux دارای قابلیت های کنترل دسترسی بسیار بیشتری نسبت به مدل سنتی DAC مورد استفاده در سیستم عامل های یونیکس/لینوکس است. به عنوان مثال، می توانید شماره پورت شبکه ای را که سرور ftp به آن متصل می شود محدود کنید، اجازه نوشتن و تغییر فایل ها در یک پوشه خاص را بدهید، اما آنها را حذف نکنید.

اجزای اصلی SELinux عبارتند از:

  • سرور اجرای سیاست - مکانیسم اصلی برای سازماندهی کنترل دسترسی.
  • پایگاه داده سیاست امنیتی سیستم
  • تعامل با رهگیر رویداد LSM.
  • Selinuxfs - Pseudo-FS، همان /proc و در /sys/fs/selinux نصب شده است. به صورت پویا توسط هسته لینوکس در زمان اجرا پر شده و حاوی فایل‌های حاوی اطلاعات وضعیت SELinux است.
  • دسترسی به کش برداری - مکانیزم کمکی برای افزایش بهره وری.

سیستم های امنیتی لینوکس
نحوه عملکرد SELinux

همش اینجوری کار میکنه

  1. یک سوژه خاص، در اصطلاح SELinux، یک عمل مجاز را بر روی یک شی پس از بررسی DAC انجام می دهد، همانطور که در تصویر بالا نشان داده شده است. این درخواست برای انجام یک عملیات به رهگیر رویداد LSM می رود.
  2. از آنجا، درخواست، همراه با زمینه امنیتی موضوع و شی، به ماژول Abstraction و Hook Logic SELinux ارسال می شود که وظیفه تعامل با LSM را بر عهده دارد.
  3. مرجع تصمیم گیری در مورد دسترسی سوژه به یک شی، سرور اجرای سیاست است و داده ها را از SELinux AnHL دریافت می کند.
  4. برای تصمیم گیری در مورد دسترسی یا انکار، سرور اجرای سیاست به زیرسیستم ذخیره کش بردار دسترسی (AVC) برای بیشترین قوانین استفاده می شود.
  5. اگر راه حلی برای قانون مربوطه در حافظه پنهان یافت نشد، درخواست به پایگاه داده سیاست امنیتی ارسال می شود.
  6. نتیجه جستجو از پایگاه داده و AVC به سرور اجرای سیاست بازگردانده می شود.
  7. اگر خط مشی یافت شده با عملکرد درخواستی مطابقت داشته باشد، عملیات مجاز است. در غیر این صورت عملیات ممنوع است.

مدیریت تنظیمات SELinux

SELinux در یکی از سه حالت عمل می کند:

  • اجرا - پایبندی دقیق به سیاست های امنیتی.
  • مجاز - نقض محدودیت ها مجاز است؛ یادداشت مربوطه در مجله انجام می شود.
  • غیر فعال - سیاست های امنیتی قابل اجرا نیستند.

با دستور زیر می توانید ببینید SELinux در چه حالتی است.

[admin@server ~]$ getenforce
Permissive

تغییر حالت قبل از راه اندازی مجدد، به عنوان مثال، تنظیم آن بر روی Enforcing یا 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=هدف

تفاوت با 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

برای مشاهده ویژگی های SELinux، برخی از ابزارهای استاندارد از پارامتر -Z استفاده می کنند.

[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 ورود کاربر 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 برای مدیریت نگاشت بین کاربران و نقش های SELinux استفاده می شود.

[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

پارامترهای فرمان:

  • -یک ورودی نقشه برداری نقش سفارشی را اضافه کنید.
  • -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 دسترسی پیدا کنید

بیایید به یک مثال عملی نگاه کنیم: ما pgadmin7.6-web را روی RHEL 4 نصب کردیم تا پایگاه داده PostgreSQL را مدیریت کنیم. کمی پیاده روی کردیم جستجو با تنظیمات pg_hba.conf، postgresql.conf و config_local.py، مجوزهای پوشه را تنظیم کنید، ماژول های پایتون گم شده را از pip نصب کنید. همه چیز آماده است، راه اندازی و دریافت می کنیم 500 خطای سرور داخلی.

سیستم های امنیتی لینوکس

ما با مظنونان معمولی شروع می کنیم و /var/log/httpd/error_log را بررسی می کنیم. مطالب جالبی در آنجا وجود دارد.

[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.

در این مرحله، اکثر مدیران لینوکس به شدت وسوسه می شوند که setencorce 0 را اجرا کنند و این پایان کار خواهد بود. صادقانه بگویم، من اولین بار این کار را کردم. البته این نیز یک راه خروج است، اما دور از بهترین.

علیرغم طراحی های دست و پا گیر، SELinux می تواند کاربر پسند باشد. فقط بسته setroubleshoot را نصب کنید و گزارش سیستم را مشاهده کنید.

[admin@server ~]$ yum install setroubleshoot
[admin@server ~]$ journalctl -b -0
[admin@server ~]$ service restart auditd

لطفاً توجه داشته باشید که علیرغم وجود systemd در سیستم عامل، سرویس حسابرسی شده باید از این طریق مجدداً راه اندازی شود و از systemctl استفاده نشود. در لاگ سیستم نشان داده خواهد شد نه تنها واقعیت مسدود کردن، بلکه دلیل و راهی برای غلبه بر ممنوعیت.

سیستم های امنیتی لینوکس

ما این دستورات را اجرا می کنیم:

[admin@server ~]$ setsebool -P httpd_can_network_connect 1
[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1

ما دسترسی به صفحه وب pgadmin4-وب را بررسی می کنیم، همه چیز کار می کند.

سیستم های امنیتی لینوکس

سیستم های امنیتی لینوکس

منبع: www.habr.com

اضافه کردن نظر