Linux droŔības sistēmas

Viens no Linux OS milzÄ«go panākumu iemesliem iegultajās, mobilajās ierÄ«cēs un serveros ir diezgan augstā kodola, saistÄ«to pakalpojumu un lietojumprogrammu droŔības pakāpe. Bet ja ieskaties tuvāk uz Linux kodola arhitektÅ«ru, tad tajā nav iespējams atrast laukumu, kas atbild par droŔību kā tādu. Kur slēpjas Linux droŔības apakÅ”sistēma un no kā tā sastāv?

PriekÅ”vēsture par Linux droŔības moduļiem un SELinux

Security Enhanced Linux ir noteikumu kopums un piekļuves mehānisms, kura pamatā ir obligāti un uz lomu balstÄ«ti piekļuves modeļi, lai aizsargātu Linux sistēmas no iespējamiem draudiem un novērstu diskrecionārās piekļuves kontroles (DAC), tradicionālās Unix droŔības sistēmas, nepilnÄ«bas. Projekts radās ASV Nacionālās droŔības aÄ£entÅ«ras iekÅ”ienē, un tā izstrādē bija tieÅ”i iesaistÄ«ti darbuzņēmēji Secure Computing Corporation un MITER, kā arÄ« vairākas pētniecÄ«bas laboratorijas.

Linux droŔības sistēmas
Linux droŔības moduļi

Linuss Torvalds sniedza vairākas piezÄ«mes par NSA jauninājumiem, lai tos varētu iekļaut Linux kodola galvenajā atzarā. ViņŔ aprakstÄ«ja kopÄ«gu vidi ar pārtvērēju komplektu, lai pārvaldÄ«tu operācijas ar objektiem, un dažus aizsargājoÅ”us laukus kodola datu struktÅ«rās atbilstoÅ”o atribÅ«tu glabāŔanai. Pēc tam Å”o vidi var izmantot ielādējami kodola moduļi, lai ieviestu jebkuru vēlamo droŔības modeli. LSM pilnÄ«bā ievadÄ«ja Linux kodolu v2.6 2003. gadā.

LSM ietvars ietver apsardzes laukus datu struktÅ«rās un pārtverÅ”anas funkciju izsaukumus kodola koda kritiskajos punktos, lai tos pārvaldÄ«tu un veiktu piekļuves kontroli. Tas arÄ« pievieno funkcionalitāti droŔības moduļu reÄ£istrÄ“Å”anai. /sys/kernel/security/lsm saskarne satur sistēmas aktÄ«vo moduļu sarakstu. LSM āķi tiek saglabāti sarakstos, kas tiek izsaukti CONFIG_LSM norādÄ«tajā secÄ«bā. Detalizēta āķa dokumentācija ir iekļauta header failā include/linux/lsm_hooks.h.

LSM apakÅ”sistēma ļāva pabeigt tās paÅ”as stabilā Linux kodola v2.6 versijas pilnÄ«gu SELinux integrāciju. Burtiski uzreiz SELinux kļuva par de facto standartu droÅ”ai Linux videi un kļuva par daļu no populārākajiem izplatÄ«jumiem: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

Glosārijs

  • Identitāte - SELinux lietotājs nav tas pats, kas parastais Unix / Linux lietotāja ID, tie var pastāvēt lÄ«dzās vienā sistēmā, taču pēc bÅ«tÄ«bas tie ir pilnÄ«gi atŔķirÄ«gi. Katrs standarta Linux konts var atbilst vienam vai vairākiem SELinux. SELinux identitāte ir daļa no kopējā droŔības konteksta, kas nosaka, kuriem domēniem varat pievienoties un kuriem domēniem nevar pievienoties.
  • Domains - SELinux domēns ir subjekta, t.i., procesa, izpildes konteksts. Domēns tieÅ”i nosaka procesam pieŔķirto piekļuvi. Domēns bÅ«tÄ«bā ir saraksts ar to, ko procesi var veikt vai kādas darbÄ«bas process var veikt ar dažādiem veidiem. Daži domēnu piemēri ir sysadm_t sistēmas administrÄ“Å”anai un user_t, kas ir parasts un priviliģēts lietotāja domēns. Init sistēma darbojas init_t domēnā, un nosauktais process darbojas named_t domēnā.
  • Lomas - Kaut kas kalpo kā starpnieks starp domēniem un SELinux lietotājiem. Lomas nosaka, kādiem domēniem lietotājs var piederēt un kāda veida objektiem lietotājs var piekļūt. Šāds piekļuves kontroles mehānisms novērÅ” privilēģiju eskalācijas uzbrukuma draudus. Lomas ir ierakstÄ«tas uz lomu balstÄ«tas piekļuves kontroles (RBAC) droŔības modelÄ«, ko izmanto SELinux.
  • Veidi ā€” Ierakstiet Enforcement list atribÅ«tu, kas tiek pieŔķirts objektam un nosaka, kas tam varēs piekļūt. LÄ«dzÄ«gi kā domēna definÄ“Å”anai, izņemot to, ka domēns attiecas uz procesu, savukārt tips attiecas uz tādiem objektiem kā direktoriji, faili, ligzdas utt.
  • PriekÅ”meti un objekti - Procesi ir subjekti un tiek palaisti noteiktā kontekstā vai droŔības jomā. Operētājsistēmas resursi: faili, direktoriji, ligzdas utt. ir objekti, kuriem ir pieŔķirts noteikts veids, citiem vārdiem sakot, slepenÄ«bas lÄ«menis.
  • SELinux politikas - SELinux izmanto dažādas politikas, lai aizsargātu sistēmu. SELinux politika definē lietotāju piekļuvi lomām, lomas domēniem un domēnus veidiem. Pirmkārt, lietotājs ir pilnvarots iegÅ«t lomu, pēc tam loma ir pilnvarota piekļūt domēniem. Visbeidzot, domēnam var bÅ«t piekļuve tikai noteikta veida objektiem.

LSM un SELinux arhitektūra

Neskatoties uz nosaukumu, LSM parasti nav ielādējami Linux moduļi. Tomēr, tāpat kā SELinux, tas ir tieÅ”i integrēts kodolā. Lai veiktu jebkādas izmaiņas LSM avota kodā, ir nepiecieÅ”ama jauna kodola kompilācija. Kodola iestatÄ«jumos ir jāiespējo atbilstoŔā opcija, pretējā gadÄ«jumā LSM kods pēc sāknÄ“Å”anas netiks aktivizēts. Bet pat Å”ajā gadÄ«jumā to var iespējot, izmantojot opciju OS sāknÄ“Å”anas ielādētājs.

Linux droŔības sistēmas
LSM čeku kaudze

LSM ir aprīkots ar kodola galveno funkciju āķiem, kas var būt svarīgi pārbaudēm. Viena no galvenajām LSM iezīmēm ir tā, ka tās ir balstītas uz steku. Tādējādi joprojām tiek veiktas standarta pārbaudes, un katrs LSM slānis tikai pievieno papildu vadīklas un vadīklas. Tas nozīmē, ka aizliegumu nevar atcelt. Tas ir parādīts attēlā, ja kārtējo DAC pārbaužu rezultāts ir kļūme, tad tas pat nesasniegs LSM āķus.

SELinux pieņēma Fluke pētniecÄ«bas operētājsistēmas Flask droŔības arhitektÅ«ru, Ä«paÅ”i mazāko privilēģiju principu. Å Ä«s koncepcijas bÅ«tÄ«ba, kā liecina to nosaukums, ir pieŔķirt lietotājam vai apstrādāt tikai tās tiesÄ«bas, kas nepiecieÅ”amas paredzēto darbÄ«bu Ä«stenoÅ”anai. Å is princips tiek Ä«stenots, izmantojot piespiedu piekļuves ierakstÄ«Å”anu, tāpēc SELinux piekļuves kontrole ir balstÄ«ta uz domēna => tipa modeli.

Izmantojot piespiedu piekļuves ierakstÄ«Å”anu, SELinux ir daudz lielākas piekļuves kontroles iespējas nekā tradicionālajam DAC modelim, ko izmanto Unix/Linux operētājsistēmās. Piemēram, varat ierobežot tÄ«kla porta numuru, kas notiks ar ftp serveri, atļaut rakstÄ«t un mainÄ«t failus noteiktā mapē, bet ne tos dzēst.

Galvenās SELinux sastāvdaļas ir:

  • Politikas izpildes serveris - Galvenais piekļuves kontroles organizÄ“Å”anas mehānisms.
  • Sistēmas droŔības politiku datu bāze.
  • MijiedarbÄ«ba ar LSM notikumu klausÄ«tāju.
  • Selinuxfs - Pseido-FS, tāds pats kā /proc un uzstādÄ«ts mapē /sys/fs/selinux. To izpildes laikā dinamiski aizpilda Linux kodols, un tajā ir faili, kas satur SELinux statusa informāciju.
  • Piekļūstiet vektora keÅ”atmiņai - PalÄ«gmehānisms veiktspējas uzlaboÅ”anai.

Linux droŔības sistēmas
Kā darbojas SELinux

Tas viss darbojas Ŕādi.

  1. Subjekts SELinux izteiksmē veic atļauto darbÄ«bu ar objektu pēc DAC pārbaudes, kā parādÄ«ts augŔējā attēlā. Å is darbÄ«bas pieprasÄ«jums tiek nosÅ«tÄ«ts uz LSM notikumu uztvērēju.
  2. No turienes pieprasījums kopā ar objekta un objekta droŔības kontekstu tiek nodots SELinux Abstraction and Hook Logic modulim, kas ir atbildīgs par mijiedarbību ar LSM.
  3. Politikas izpildes serveris ir lēmumu pieņemÅ”anas iestāde par subjekta piekļuvi objektam, un tas saņem datus no SELinux AnHL.
  4. Lai pieņemtu lēmumus par piekļuvi vai atteikumu, politikas izpildes serveris visbiežāk izmantotajām kārtulām izmanto Access Vector Cache (AVC) keÅ”atmiņas apakÅ”sistēmu.
  5. Ja keÅ”atmiņā atbilstoŔā noteikuma risinājums netiek atrasts, pieprasÄ«jums tiek nodots droŔības politikas datu bāzei.
  6. MeklÄ“Å”anas rezultāts no datu bāzes un AVC tiek atgriezts politikas izpildes serverÄ«.
  7. Ja atrastā politika atbilst pieprasītajai darbībai, darbība ir atļauta. Pretējā gadījumā operācija ir aizliegta.

SELinux iestatījumu pārvaldība

SELinux darbojas vienā no trim režīmiem:

  • Izpilde ā€“ stingra droŔības politikas izpilde.
  • Atļauja - Ierobežojumu pārkāpums ir pieļaujams, žurnālā tiek veikta atbilstoÅ”a atzÄ«me.
  • Atspējots ā€” droŔības politikas nav spēkā.

JÅ«s varat redzēt, kādā režīmā ir SELinux, izmantojot Ŕādu komandu.

[admin@server ~]$ getenforce
Permissive

Piemēram, mainot režīmu pirms atsāknÄ“Å”anas, iestatiet to uz piespiedu vai 1. AtļaujoÅ”ais parametrs atbilst ciparu kodam 0.

[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #тŠ¾ Š¶Šµ сŠ°Š¼Š¾Šµ

Varat arī mainīt režīmu, rediģējot failu:

[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=mērķis

AtŔķirÄ«ba no setenfoce ir tāda, ka operētājsistēmas sāknÄ“Å”anas laikā SELinux režīms tiks iestatÄ«ts atbilstoÅ”i SELINUX parametra vērtÄ«bai konfigurācijas failā. Turklāt <=> atspējoto izmaiņu piespiedu izpilde stājas spēkā tikai rediģējot /etc/selinux/config failu un pēc atsāknÄ“Å”anas.

Skatīt kopsavilkuma statusa pārskatu:

[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

Lai skatītu SELinux atribūtus, dažas akciju utilītas izmanto opciju -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

Salīdzinot ar parasto ls -l izvadi, ir vairāki papildu lauki Ŕādā formātā:

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

Pēdējais lauks apzÄ«mē kaut ko lÄ«dzÄ«gu droŔības zÄ«mogam un sastāv no divu elementu kombinācijas:

  • s0 - nozÄ«mÄ«gums, ierakstÄ«ts arÄ« zema lÄ«meņa-augsta lÄ«meņa intervālā
  • c0, c1ā€¦ c1023 ir kategorija.

Piekļuves konfigurācijas maiņa

Izmantojiet semodule, lai ielādētu SELinux moduļus, pievienotu un noņemtu tos.

[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 - уŠ“Š°Š»Šøть Š¼Š¾Š“уŠ»ŃŒ

Pirmā komanda semanage pieteikÅ”anās saista SELinux lietotāju ar operētājsistēmas lietotāju, otrajā to uzskaita. Visbeidzot, pēdējā komanda ar slēdzi -r noņem SELinux lietotāju kartÄ“Å”anu OS kontiem. MLS/MCS diapazona vērtÄ«bu sintakses skaidrojums ir sniegts iepriekŔējā sadaļā.

[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 lietotājs izmanto, lai pārvaldītu kartējumus starp SELinux lietotājiem un lomām.

[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

Komandu opcijas:

  • -a pievienot pielāgotu lomu kartÄ“Å”anas ierakstu;
  • -l atbilstoÅ”o lietotāju un lomu saraksts;
  • -d dzēst lietotāja lomu kartÄ“Å”anas ierakstu;
  • -R lietotājam piesaistÄ«to lomu saraksts;

Faili, porti un Būla vērtības

Katrs SELinux modulis nodroÅ”ina failu marÄ·Ä“Å”anas noteikumu kopu, taču, ja nepiecieÅ”ams, varat pievienot arÄ« savus noteikumus. Piemēram, mēs vēlamies, lai tÄ«mekļa serverim bÅ«tu piekļuves tiesÄ«bas /srv/www mapei.

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

Pirmā komanda reÄ£istrē jaunus marÄ·Ä“Å”anas noteikumus, bet otrā atiestata vai drÄ«zāk atklāj failu tipus saskaņā ar paÅ”reizējiem noteikumiem.

Tāpat TCP/UDP porti ir marķēti tā, lai tos varētu klausÄ«ties tikai atbilstoÅ”ie pakalpojumi. Piemēram, lai tÄ«mekļa serveris klausÄ«tos portā 8080, jums ir jāpalaiž komanda.

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

Ievērojamam skaitam SELinux moduļu ir parametri, kas var iegÅ«t BÅ«la vērtÄ«bas. Visu Ŕādu opciju sarakstu var redzēt ar getsebool -a. BÅ«la vērtÄ«bas var mainÄ«t, izmantojot 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

Seminārs, iegūstiet piekļuvi Pgadmin tīmekļa saskarnei

Apsveriet piemēru no prakses, mēs instalējām pgadmin7.6-web uz RHEL 4, lai administrētu PostgreSQL datu bāzi. Pabraucām garām mazam quest iestatot pg_hba.conf, postgresql.conf un config_local.py, iestatiet tiesÄ«bas uz mapēm, instalējiet trÅ«kstoÅ”os Python moduļus no pip. Viss gatavs, skrien un saņemies 500 IekŔējā servera kļūda.

Linux droŔības sistēmas

Mēs sākam ar tipiskiem aizdomās turamajiem, pārbaudiet /var/log/httpd/error_log. Tur ir daži interesanti ieraksti.

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

Šajā brīdī lielākajai daļai Linux administratoru būs liels kārdinājums palaist setencorce 0 un ar to tikt galā. Godīgi sakot, Ŕī ir pirmā reize, kad es to daru. Tas, protams, ir arī izeja, taču tālu no labākās.

Neskatoties uz apgrÅ«tinoÅ”o dizainu, SELinux var bÅ«t lietotājam draudzÄ«gs. VienkārÅ”i instalējiet problēmu novērÅ”anas pakotni un skatiet sistēmas žurnālu.

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

Ņemiet vērā, ka auditētais pakalpojums ir jārestartē Ŕādā veidā, nevis ar systemctl, neskatoties uz systemd klātbÅ«tni OS. Sistēmas žurnālā tiks norādÄ«ts ne tikai bloÄ·Ä“Å”anas fakts, bet arÄ« iemesls un veids, kā pārvarēt aizliegumu.

Linux droŔības sistēmas

Mēs izpildām Ŕīs komandas:

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

Pārbaudām piekļuvi pgadmin4-web lapai, viss darbojas.

Linux droŔības sistēmas

Linux droŔības sistēmas

Avots: www.habr.com

Pievieno komentāru