Linux xavfsizlik tizimlari

O'rnatilgan, mobil qurilmalar va serverlarda Linux OT ning ulkan muvaffaqiyatining sabablaridan biri bu yadro, tegishli xizmatlar va ilovalarning yuqori darajadagi xavfsizligidir. Lekin agar yaqinroq ko'rib chiqing Linux yadrosining arxitekturasiga mos keladigan bo'lsak, unda xavfsizlik uchun javobgar bo'lgan kvadratni topish mumkin emas. Linux xavfsizlik quyi tizimi qayerda yashiringan va u nimadan iborat?

Linux xavfsizlik modullari va SELinux haqida ma'lumot

Security Enhanced Linux Linux tizimlarini potentsial tahdidlardan himoya qilish va an'anaviy Unix xavfsizlik tizimi bo'lgan Discretionary Access Control (DAC) kamchiliklarini tuzatish uchun majburiy va rolga asoslangan kirish modellariga asoslangan qoidalar va kirish mexanizmlari to'plamidir. Loyiha AQSh Milliy Xavfsizlik Agentligida paydo bo'lgan va asosan Secure Computing Corporation va MITER pudratchilari, shuningdek, bir qator tadqiqot laboratoriyalari tomonidan bevosita ishlab chiqilgan.

Linux xavfsizlik tizimlari
Linux xavfsizlik modullari

Linus Torvalds yangi NSA ishlanmalari haqida bir qator izohlar berdi, shunda ular asosiy Linux yadrosiga kiritilishi mumkin edi. U ob'ektlar bilan operatsiyalarni boshqarish uchun tutqichlar to'plami va tegishli atributlarni saqlash uchun yadro ma'lumotlar tuzilmalarida ma'lum himoya maydonlari to'plami bilan umumiy muhitni tasvirlab berdi. Keyinchalik bu muhit istalgan xavfsizlik modelini amalga oshirish uchun yuklanadigan yadro modullari tomonidan ishlatilishi mumkin. LSM 2.6 yilda Linux yadrosi v2003 ga to'liq kirdi.

LSM ramkasi ma'lumotlar tuzilmalaridagi himoya maydonlarini va ularni boshqarish va kirishni boshqarish uchun yadro kodining muhim nuqtalarida ushlab turish funktsiyalariga qo'ng'iroqlarni o'z ichiga oladi. Shuningdek, u xavfsizlik modullarini ro'yxatdan o'tkazish uchun funksiyalarni qo'shadi. /sys/kernel/security/lsm interfeysi tizimdagi faol modullar ro'yxatini o'z ichiga oladi. LSM ilgaklari CONFIG_LSM da ko'rsatilgan tartibda chaqiriladigan ro'yxatlarda saqlanadi. Kancalar bo'yicha batafsil hujjatlar shu jumladan/linux/lsm_hooks.h sarlavha fayliga kiritilgan.

LSM quyi tizimi SELinux-ni barqaror Linux yadrosi v2.6 ning bir xil versiyasi bilan to'liq integratsiyalashuvini yakunlash imkonini berdi. Deyarli darhol SELinux xavfsiz Linux muhiti uchun de-fakto standartiga aylandi va eng mashhur tarqatishlarga kiritildi: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

SELinux lug'ati

  • Hisobga olish — SELinux foydalanuvchisi odatdagi Unix/Linux foydalanuvchi identifikatoriga o‘xshamaydi; ular bir xil tizimda birga yashashi mumkin, lekin mohiyatan butunlay boshqacha. Har bir standart Linux hisob qaydnomasi SELinux-da bir yoki bir nechtasiga mos kelishi mumkin. SELinux identifikatori umumiy xavfsizlik kontekstining bir qismi boʻlib, qaysi domenlarga qoʻshilishingiz va qoʻshilmasligingizni belgilaydi.
  • Domenlar - SELinux-da domen sub'ektning, ya'ni jarayonning bajarilishi kontekstidir. Domen jarayonga kirish huquqini bevosita belgilaydi. Domen, asosan, qanday jarayonlar amalga oshirishi mumkinligi yoki jarayon turli turlar bilan nima qilishi mumkinligi ro'yxatidir. Domenlarga ba'zi misollar tizim boshqaruvi uchun sysadm_t va foydalanuvchi_t oddiy imtiyozsiz foydalanuvchi domenidir. Init tizimi init_t domenida ishlaydi va nomlangan jarayon name_t domenida ishlaydi.
  • Rollar — Domenlar va SELinux foydalanuvchilari o'rtasida vositachi bo'lib xizmat qiladi. Rollar foydalanuvchi qaysi domenlarga tegishli bo'lishi va qanday turdagi ob'ektlarga kirishi mumkinligini aniqlaydi. Ushbu kirishni boshqarish mexanizmi imtiyozlarning kuchayishi hujumlari tahdidining oldini oladi. Rollar SELinux-da ishlatiladigan Rolga asoslangan kirishni boshqarish (RBAC) xavfsizlik modeliga yozilgan.
  • Turlari — Ob'ektga tayinlangan va unga kim kirishi mumkinligini aniqlaydigan Type Enforcement ro'yxati atributi. Domen ta'rifiga o'xshash, faqat domen jarayonga taalluqlidir va tur kataloglar, fayllar, rozetkalar va boshqalar kabi ob'ektlarga taalluqlidir.
  • Ob'ektlar va ob'ektlar - Jarayonlar sub'ektlardir va ma'lum bir kontekstda yoki xavfsizlik sohasida ishlaydi. Operatsion tizim resurslari: fayllar, kataloglar, rozetkalar va boshqalar ma'lum bir turdagi, boshqacha aytganda, maxfiylik darajasiga ega bo'lgan ob'ektlardir.
  • SELinux siyosati — SELinux tizimni himoya qilish uchun turli siyosatlardan foydalanadi. SELinux siyosati foydalanuvchilarning rollarga, rollarning domenlarga va domenlarning turlarga kirishini belgilaydi. Birinchidan, foydalanuvchi rolni olish huquqiga ega, keyin rolga domenlarga kirish huquqi beriladi. Va nihoyat, domen faqat ma'lum turdagi ob'ektlarga kirish huquqiga ega bo'lishi mumkin.

LSM va SELinux arxitekturasi

Nomiga qaramay, LSMlar odatda yuklanadigan Linux modullari emas. Biroq, SELinux kabi, u to'g'ridan-to'g'ri yadroga birlashtirilgan. LSM manba kodiga har qanday o'zgartirish yangi yadro kompilyatsiyasini talab qiladi. Yadro sozlamalarida tegishli parametr yoqilgan bo'lishi kerak, aks holda LSM kodi yuklashdan keyin faollashtirilmaydi. Ammo bu holatda ham uni OS yuklash opsiyasi orqali yoqish mumkin.

Linux xavfsizlik tizimlari
LSM tekshirish to'plami

LSM yadro funktsiyalaridagi kancalar bilan jihozlangan bo'lib, ular tekshirish uchun tegishli bo'lishi mumkin. LSM larning asosiy xususiyatlaridan biri shundaki, ular stacked. Shunday qilib, standart tekshiruvlar hali ham bajariladi va LSM ning har bir qatlami faqat qo'shimcha boshqaruv va boshqaruv elementlarini qo'shadi. Bu shuni anglatadiki, taqiqni qaytarib bo'lmaydi. Bu rasmda ko'rsatilgan; agar muntazam DAC tekshiruvlari natijasi muvaffaqiyatsiz bo'lsa, u holda masala LSM ilgaklariga ham etib bormaydi.

SELinux Fluke tadqiqot operatsion tizimining Flask xavfsizlik arxitekturasini, xususan, eng kam imtiyozlar tamoyilini qabul qiladi. Ushbu kontseptsiyaning mohiyati, nomidan ko'rinib turibdiki, foydalanuvchiga faqat mo'ljallangan harakatlarni amalga oshirish uchun zarur bo'lgan huquqlarni berish yoki qayta ishlashdir. Ushbu tamoyil majburiy kirish usuli yordamida amalga oshiriladi, shuning uchun SELinux-da kirishni boshqarish => turi modeliga asoslangan.

Majburiy kirishni yozish tufayli SELinux, Unix/Linux operatsion tizimlarida qo'llaniladigan an'anaviy DAC modeliga qaraganda ancha katta kirishni boshqarish imkoniyatlariga ega. Misol uchun, siz ftp-server ulanadigan tarmoq port raqamini cheklashingiz, ma'lum bir papkada fayllarni yozish va o'zgartirishga ruxsat berishingiz mumkin, lekin ularni o'chira olmaysiz.

SELinux ning asosiy komponentlari quyidagilardir:

  • Siyosatni amalga oshirish serveri — Kirish nazoratini tashkil etishning asosiy mexanizmi.
  • Tizim xavfsizligi siyosati ma'lumotlar bazasi.
  • LSM hodisasi to'xtatuvchisi bilan o'zaro ta'sir.
  • Selinuxfs - Pseudo-FS, /proc bilan bir xil va /sys/fs/selinux-ga o'rnatilgan. Ishlash vaqtida Linux yadrosi tomonidan dinamik ravishda to'ldirilgan va SELinux holati ma'lumotlarini o'z ichiga olgan fayllar.
  • Vektor keshiga kirish — Hosildorlikni oshirishning yordamchi mexanizmi.

Linux xavfsizlik tizimlari
SELinux qanday ishlaydi

Hammasi shunday ishlaydi.

  1. SELinux shartlarida ma'lum bir sub'ekt yuqori rasmda ko'rsatilganidek, DAC tekshiruvidan so'ng ob'ektda ruxsat etilgan amalni bajaradi. Amaliyotni bajarish uchun ushbu so'rov LSM hodisasini to'xtatuvchisiga o'tadi.
  2. U yerdan soʻrov mavzu va obyekt xavfsizligi konteksti bilan birga LSM bilan oʻzaro aloqa qilish uchun masʼul boʻlgan SELinux Abstraction and Hook Logic moduliga uzatiladi.
  3. Subyektning ob'ektga kirishi bo'yicha qaror qabul qilish organi Siyosat ijrosi serveridir va u SELinux AnHL dan ma'lumotlarni oladi.
  4. Kirish yoki rad etish haqida qaror qabul qilish uchun Policy Enforment Server eng ko'p ishlatiladigan qoidalar uchun Access Vector Cache (AVC) keshlash quyi tizimiga murojaat qiladi.
  5. Agar keshda tegishli qoida uchun yechim topilmasa, so'rov xavfsizlik siyosati ma'lumotlar bazasiga o'tkaziladi.
  6. Ma'lumotlar bazasi va AVC qidiruv natijasi Policy Enforment Serverga qaytariladi.
  7. Agar topilgan siyosat so'ralgan amalga mos kelsa, operatsiyaga ruxsat beriladi. Aks holda, operatsiya taqiqlanadi.

SELinux sozlamalarini boshqarish

SELinux uchta rejimdan birida ishlaydi:

  • Majburlash - xavfsizlik siyosatiga qat'iy rioya qilish.
  • Ruxsat beruvchi - cheklovlarni buzishga ruxsat beriladi, jurnalda tegishli yozuv qo'yiladi.
  • O'chirilgan - Xavfsizlik siyosatlari kuchga kirmaydi.

Quyidagi buyruq yordamida SELinux qanday rejimda ekanligini ko'rishingiz mumkin.

[admin@server ~]$ getenforce
Permissive

Qayta yuklashdan oldin rejimni o'zgartirish, masalan, uni majburlash yoki 1. Ruxsat beruvchi parametr 0 raqamli kodiga mos keladi.

[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #то же самое

Bundan tashqari, faylni tahrirlash orqali rejimni o'zgartirishingiz mumkin:

[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=maqsad

Setenfoce-dan farq shundaki, operatsion tizim ishga tushganda, SELinux rejimi konfiguratsiya faylidagi SELINUX parametrining qiymatiga mos ravishda o'rnatiladi. Bunga qo'shimcha ravishda, <=> o'chirib qo'yishga o'zgartirishlar faqat /etc/selinux/config faylini tahrirlash va qayta ishga tushirilgandan so'ng kuchga kiradi.

Qisqa holat hisobotini ko'ring:

[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 atributlarini ko'rish uchun ba'zi standart yordamchi dasturlar -Z parametridan foydalanadi.

[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 ning oddiy chiqishi bilan taqqoslaganda, quyidagi formatda bir nechta qo'shimcha maydonlar mavjud:

<user>:<role>:<type>:<level>

Oxirgi maydon xavfsizlik tasnifi kabi narsani bildiradi va ikkita elementning kombinatsiyasidan iborat:

  • s0 - ahamiyatlilik, past-yuqori daraja oralig'i sifatida ham yoziladi
  • c0, c1… c1023 - toifa.

Kirish konfiguratsiyasini o'zgartirish

SELinux modullarini yuklash, qo'shish va olib tashlash uchun semoduldan foydalaning.

[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 - удалить модуль

Birinchi jamoa semanage login SELinux foydalanuvchisini operatsion tizim foydalanuvchisiga ulaydi, ikkinchisi ro'yxatni ko'rsatadi. Nihoyat, -r kaliti bilan oxirgi buyruq SELinux foydalanuvchilarining OS hisoblariga xaritasini olib tashlaydi. MLS/MCS diapazoni qiymatlari uchun sintaksisning tushuntirishi oldingi bo'limda.

[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

komanda semanage foydalanuvchisi SELinux foydalanuvchilari va rollar o'rtasidagi xaritalarni boshqarish uchun ishlatiladi.

[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

Buyruq parametrlari:

  • -o'zgacha rollarni xaritalash yozuvini qo'shish;
  • -l mos keladigan foydalanuvchilar va rollar ro'yxati;
  • -d foydalanuvchi rolini xaritalash yozuvini o'chirish;
  • -R foydalanuvchiga biriktirilgan rollar ro'yxati;

Fayllar, portlar va mantiqiy qiymatlar

Har bir SELinux moduli fayllarni teglash qoidalari to'plamini taqdim etadi, lekin agar kerak bo'lsa, o'z qoidalarini ham qo'shishingiz mumkin. Masalan, veb-server /srv/www jildiga kirish huquqiga ega bo'lishini xohlaymiz.

[admin@server ~]$ semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?
[admin@server ~]$ restorecon -R /srv/www/

Birinchi buyruq yangi belgilash qoidalarini qayd etadi, ikkinchisi esa amaldagi qoidalarga muvofiq fayl turlarini qayta o'rnatadi, to'g'rirog'i o'rnatadi.

Xuddi shunday, TCP/UDP portlari faqat tegishli xizmatlar ularni tinglashi mumkin bo'lgan tarzda belgilangan. Masalan, veb-server 8080 portni tinglashi uchun siz buyruqni bajarishingiz kerak.

[admin@server ~]$ semanage port -m -t http_port_t -p tcp 8080

SELinux modullarining katta qismi mantiqiy qiymatlarni qabul qila oladigan parametrlarga ega. Bunday parametrlarning to'liq ro'yxatini getsebool -a yordamida ko'rish mumkin. Siz setsebool yordamida mantiqiy qiymatlarni o'zgartirishingiz mumkin.

[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

Seminar, Pgadmin-veb interfeysiga kirish

Amaliy misolni ko'rib chiqaylik: biz PostgreSQL ma'lumotlar bazasini boshqarish uchun RHEL 7.6 da pgadmin4-web o'rnatdik. Bir oz yurdik izlanish pg_hba.conf, postgresql.conf va config_local.py sozlamalari bilan papkaga ruxsatlarni o'rnating, pip-dan etishmayotgan Python modullarini o'rnating. Hammasi tayyor, biz ishga tushiramiz va qabul qilamiz 500 ichki server xatosi.

Linux xavfsizlik tizimlari

Biz odatiy gumonlanuvchilardan boshlaymiz, /var/log/httpd/error_log. U erda qiziqarli yozuvlar mavjud.

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

Shu nuqtada, ko'pchilik Linux ma'murlari setencorce 0 ni ishga tushirishga qattiq vasvasaga tushishadi va bu uning oxiri bo'ladi. Rostini aytsam, men buni birinchi marta qildim. Bu, albatta, chiqish yo'lidir, lekin eng yaxshisidan uzoqdir.

Qiyin dizaynlarga qaramay, SELinux foydalanuvchilarga qulay bo'lishi mumkin. Faqat muammolarni bartaraf etish paketini o'rnating va tizim jurnalini ko'ring.

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

Esda tutingki, auditd xizmati shu tarzda qayta ishga tushirilishi kerak va OTda systemd mavjudligiga qaramay, systemctl dan foydalanmaslik kerak. Tizim jurnalida ko'rsatiladi nafaqat blokirovka qilish haqiqati, balki sabab va taqiqni yengish yo'li.

Linux xavfsizlik tizimlari

Biz ushbu buyruqlarni bajaramiz:

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

Biz pgadmin4-web veb-sahifasiga kirishni tekshiramiz, hamma narsa ishlaydi.

Linux xavfsizlik tizimlari

Linux xavfsizlik tizimlari

Manba: www.habr.com

a Izoh qo'shish