Linux aizsardzības sistēmas

Viens no iemesliem, kādēļ Linux OS ir bijusi grandioza veiksme iebūvētajās, mobilajās ierīcēs un servidores, ir pietiekami augstā kodola, papildinošo pakalpojumu un lietojumprogrammu drošības pakāpe. Bet, ja pievērš uzmanību Linux kodola arhitektūrai, nevar atrast lauku, kas atbildētu par drošību kā tādu. Kur tad slēpjas Linux drošības apakšsistēma un no kā tā sastāv?

Linux drošības moduļu un SELinux vēsture

Security Enhanced Linux ir noteikumu un piekļuves mehānismu komplekts, pamatojoties uz piespiedu un lomu piekļuves modeļiem, lai aizsargātu Linux sistēmas no potenciālajiem draudiem un labotu Discretionary Access Control (DAC) - tradicionālo Unix drošības sistēmu. Projekts radās ASV Nacionālās drošības aģentūras ietvaros, pie tā galvenokārt strādāja Secure Computing Corporation un MITRE līgumslēdzēji, kā arī vairākas pētniecības laboratorijas.

Linux aizsardzības sistēmas
Linux drošības moduļi

Linus Torvalds izteica virkni piezīmju par jaunajiem NBS izstrādājumiem, lai tos varētu iekļaut Linux kodola pamatstruktūrā. Viņš aprakstīja vispārējo vidi ar notveršanas komplektu objektu darbību pārvaldībai un noteiktu aizsardzības lauku grupu datu struktūrās kodolā attiecīgo atribūtu glabāšanai. Šī vide tiek izmantota ielādējamiem kodola moduļiem, lai īstenotu jebkuru vēlamo drošības modeli. LSM pilnībā iekļāvās Linux kodolā v2.6 2003. gadā.

LSM ietvars iekļauj aizsardzības laukus datu struktūrās un funkciju notveršanas izsaukumus kodola kritiskajās vietās, lai tās pārvaldītu un veiktu piekļuves kontroli. Tas pievieno arī funkcijas drošības moduļu reģistrēšanai. Interfeiss /sys/kernel/security/lsm satur sarakstu ar aktīvajiem moduļiem sistēmā. LSM notveršanas punkti tiek glabāti sarakstos, kas tiek izsaukti secībā, kāda noteikta CONFIG_LSM. Detalizēta dokumentācija par notveršanas punktiem ir iekļauta header failā include/linux/lsm_hooks.h.

LSM apakšsistēma ļāva pabeigt SELinux pilnīgu integrāciju tajā pašā stabilā Linux kodola v2.6 versijā. Gandrīz uzreiz SELinux kļuva par de facto standartu drošām Linux vidēm un tika iekļauta populārākajos izplatījumos: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

SELinux terminoloģijas vārdnīca

  • Identitāte — SELinux lietotājs nav tas pats, kas parastais Unix/Linux lietotāja ID, tie var līdzpastāvēt vienā un tajā pašā sistēmā, bet būtībā tie ir pilnīgi atšķirīgi. Katrs standarta Linux konts var atbilst vienam vai vairākiem SELinux. SELinux identitāte ir kopējas drošības konteksta sastāvdaļa, kas nosaka, kuriem domēniem var piekļūt un kuriem — nevar.
  • Domēni — SELinux domēns ir subjekta izpildes konteksts, t. i., procesa konteksts. Domēns tieši nosaka piekļuvi, ko process var iegūt. Domēns ir būtībā saraksts ar to, ko procesi var darīt, vai kādas darbības process var veikt ar dažādiem objektiem. Daži domēnu piemēri: sysadm_t sistēmas administrēšanai un user_t, kas ir parasts nepievienoties lietotāja domēns. Inicializācijas sistēma init tiek palaista domēnā init_t, bet process named tiek palaists domēnā named_t.
  • Lomas — Tas, kas kalpo kā starpnieks starp domēniem un SELinux lietotājiem. Lomas nosaka, kuriem domēniem lietotājs var piederēt un kādiem objektiem viņš var piekļūt. Šāds piekļuves atdalīšanas mehānisms novērš privilēģiju paaugstināšanas uzbrukumu risku. Lomas ir iekļautas Role Based Access Control (RBAC) drošības modelī, kas tiek izmantots SELinux.
  • Tipi — Type Enforcement saraksta atribūts, kas tiek piešķirts objektam un nosaka, kurš tam piekļūs. Tas ir līdzīgs domēna definīcijai, izņēmums ir tas, ka domēns tiek piemērots procesam, bet tips attiecas uz tādiem objektiem kā mapes, faili, soketi utt.
  • Subjekti un objekti — Procesi ir subjekti un tiek palaisti noteiktā kontekstā, vai drošības domēnā. Operētājsistēmas resursi: faili, katalogi, soketi utt., ir objekti, kuriem tiek piešķirts noteikts tips, citiem vārdiem sakot — slepenības līmenis.
  • SELinux politikas — Lai aizsargātu sistēmu, SELinux izmanto dažādas politikas. SELinux politika nosaka lietotāju piekļuvi lomām, lomas — domēniem un domēni — tipiem. Sākumā lietotājs tiek autorizēts, lai iegūtu lomu, pēc tam loma tiek autorizēta piekļuvei domēniem. Visbeidzot, domēns var piekļūt tikai daži objektiem.

LSM un SELinux arhitektūra

Neskatoties uz nosaukumu, LSM faktiski nav Linux ielādējami moduļi. Tomēr, tāpat kā SELinux, tas ir tieši integrēts kodolā. Jebkura izmaiņa LSM avota kodā prasa jaunu kodola kompilāciju. Atbilstošajai opcijai jābūt aktivizētai kodola iestatījumos, citādi LSM kods netiks aktivizēts pēc ielādes. Taču pat šādā gadījumā to var ieslēgt ar OS ielādes opciju.

Linux aizsardzības sistēmas
LSM pārbaudes steks

LSM ir aprīkots ar hookiem galvenajās kodola funkcijās, kuras var būt attiecīgas pārbaudēm. Viens no galvenajiem LSM iezīmēm ir tas, ka tās ir organizētas steka principā. Tādējādi standarta pārbaudes joprojām tiek veikts, un katrs LSM slānis tikai pievieno papildu kontroles elementus. Tas nozīmē, ka aizliegumu nav iespējams atcelt. Tas ir parādīts attēlā — ja rutīnas DAC pārbaudes rezultāts ir atteikts, tad process pat nesasniegs LSM hookus.

SELinux ir pieņēmis Flask drošības arhitektūru no Fluke pētnieciskās operētājsistēmas, īpaši principu par minimālajām privilēģijām. Šīs koncepcijas būtība, kā to nosaka nosaukums, ir dot lietotājam vai procesam tikai tās tiesības, kas nepieciešamas iecerēto darbību veikšanai. Šis princips tiek īstenots ar piespiedu piekļuves tipizēšanu, tādējādi kontrole piekļuvēm SELinux balstās uz domēna => tipa modeli.

Pateicoties piespiedu piekļuves tipizēšanai, SELinux ir daudz lielākas iespējas piekļuves ierobežošanā nekā tradicionālā DAC modele, ko izmanto Unix/Linux OS. Piemēram, var ierobežot FTP servera izmantoto tīkla portu, atļaut failu rakstīšanu un modificēšanu noteiktā mapē, bet ne to dzēšanu.

GALVENIE SELINUX KOMPONENTI IR ŠĀDI:

  • Politikas izpildes serveris — Galvenais piekļuves kontroles mehānisms.
  • Drošības politiku datu bāze.
  • Sadarbība ar LSM notikumu notvērēju.
  • Selinuxfs — Pseido-FS, līdzīga kā /proc un piestiprināta pie /sys/fs/selinux. Dinamiski tiek aizpildīta ar Linux kodolu izpildes laikā un satur failus, kas sniedz informāciju par SELinux statusu.
  • Piekļuves vektoru kešatmiņa — Palīdzības mehānisms veiktspējas uzlabošanai.

Linux aizsardzības sistēmas
SELinux darbības shēma

Viss tas darbojas šādā veidā.

  1. Noteikts subjekts, SELinux terminoloģijā, veic atļauto darbību uz objekta pēc DAC pārbaudes, kā parādīts augšējā attēlā. Šis pieprasījums veikt darbību nonāk LSM notikumu pārraides tīklā.
  2. No turienes pieprasījums kopā ar subjekta un objekta drošības kontekstu tiek nosūtīts uz SELinux Abstraction and Hook Logic moduli, kas ir atbildīgs par mijiedarbību ar LSM.
  3. Lēmuma pieņemšanas instances par subjekta piekļuvi objektam ir Policy Enforcement Server, un tam tiek nosūtīti dati no SELinux AnHL.
  4. Lēmuma pieņemšanai par piekļuvi vai aizliegumu Policy Enforcement Server vēršas pie piekļuves noteikumu kešatmiņas apakšsystemas Access Vector Cache (AVC).
  5. Ja lēmums attiecīgajai politikai netiek atrasts kešā, tad pieprasījums tiek nosūtīts tālāk uz drošības politiku datubāzi.
  6. Meklēšanas rezultāts no datubāzes un AVC tiek atgriezts Policy Enforcement Server.
  7. Ja atrastā politika atbilst pieprasītajai darbībai, tad operācija tiek atļauta. Pretējā gadījumā operācija tiek aizliegta.

SELinux iestatījumu vadība

SELinux darbojas vienā no trim režīmiem:

  • Enforcing — Stingra drošības politiku ievērošana.
  • Permissive — Atļauts ierobežojumu pārkāpums, žurnālā tiek veikta atbilstoša piezīme.
  • Disabled — Drošības politikas neīstenojas.

Pārbaudīt, kādā režīmā atrodas SELinux, var ar sekojošo komandu.

[admin@server ~]$ getenforce
Permissive

Režīma maiņa līdz restartēšanai, piemēram, iestatot uz enforcing vai 1. Parametram permissive atbilst skaitliskais kods 0.

[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 # tas pats

Režīmu var arī mainīt, labojot 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=spiedzošs
# 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

Atšķirība no setenfoce ir tāda, ka pie operētājsistēmas ielādes SELinux režīms tiks iestatīts atbilstoši parametrs SELINUX vērtībai konfigurācijas failā. Papildus tam, izmaiņas enforcing disabled stājas spēkā tikai, mainot failu /etc/selinux/config un pēc restartēšanas.

Apskatīt īsu statusa pārskatu:

[admin@server ~]$ sestatus

SELinux statuss: ieslēgts
SELinuxfs montēšana: /sys/fs/selinux
SELinux saknes direktorija: /etc/selinux
Ielādētā politikas nosaukums: mērķēts
Pašreizējā režīms: atļauts
Režīms no konfigurācijas faila: piespiedu
Politikas MLS statuss: ieslēgts
Politikas deny_unknown statuss: atļauts
Maksimālā kodola politikas versija: 31

Lai skatītu SELinux atribūtus, daži noklusējuma rīki izmanto parametru -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īdzinājumā ar parasto ls -l izvadi, šeit ir vairāki papildu lauki šādā formātā:

:::

Pēdējais lauks apzīmē kaut ko līdzīgu slepenības grifam un sastāv no divu elementu kombinācijas:

  • s0 — nozīmīgums, to arī raksta intervālā lowlevel-highlevel
  • c0, c1… c1023 — kategorija.

Piekļuves konfigurācijas izmaiņas

Izmantojiet semodule, lai ielādētu SELinux moduļus, pievienotu un dzēstu tos.

[admin@server ~]$ semodule -l |wc -l # visi moduļi
408
[admin@server ~]$ semodule -e abrt #enable - aktivizēt moduli
[admin@server ~]$ semodule -d accountsd #disable - atslēgt moduli
[admin@server ~]$ semodule -r avahi #remove - noņemt moduli

Pirmajā komandā semanage login saista SELinux lietotāju ar operētājsistēmas lietotāju, otrā izvada sarakstu. Beidzot pēdējā komanda ar atslēgu -r dzēš saistību starp SELinux lietotājiem un OS kontiem. MLS/MCS Range sintakse skaidrojums ir iepriekšējā sadaļā.

[admin@server ~]$ semanage login -a -s user_u karol
[admin@server ~]$ semanage login -l

Piekļuves vārds SELinux lietotājam MLS/MCS diapazons
__default__ neierobežots_u s0-s0:c0.c1023 *
root neierobežots_u s0-s0:c0.c1023 *
system_u system_u s0-s0:c0.c1023 *
[admin@server ~]$ semanage login -d karol

Komanda semanage user tiek izmantota, lai pārvaldītu sakarīgus lietotājus un SELinux lomas.

[admin@server ~]$ semanage user -l
                Marķēšana   MLS/       MLS/                          
SELinux lietotājs    Priekšnoteikums     MCS Līmenis  MCS Intervals             SELinux Lomas
guest_u         lietotājs       s0         s0                    guest_r
staff_u         personāls      s0         s0-s0:c0.c1023        staff_r sysadm_r
...
user_u          lietotājs       s0         s0                    user_r
xguest_u        lietotājs       s0         s0                    xguest_r
[admin@server ~]$ semanage user -a -R 'staff_r user_r'
[admin@server ~]$ semanage user -d test_u

Komandas parametri:

  • -a pievienot lietotāja lomu atbilstību;
  • -l saraksts par lietotāju un lomu atbilstību;
  • -d dzēst lietotāja lomu atbilstību;
  • -R saraksts par lomām, kas piestiprinātas lietotājam;

Faili, porti un loģiskās vērtības

Katrs SELinux modulis nodrošina failu marķējumu komplektu, taču var pievienot arī savus noteikumus, ja tas ir nepieciešams. Piemēram, mēs vēlamies dot tīmekļa serverim piekļuves tiesības mapē /srv/www.

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

Pirmais komandas ieraksts reģistrē jaunus marķējumu noteikumus, bet otrais atjauno, jeb precizē, failu tipus atbilstoši esošajiem noteikumiem.

Līdzīgi, TCP/UDP porti ir marķēti tā, ka tikai atbilstošie pakalpojumi var tos klausīties. Piemēram, lai tīmekļa serveris varētu klausīties portā 8080, nepieciešams izpildīt komandu.

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

Ievērojamai daļai SELinux moduļu ir parametri, kas var pieņemt loģiskas vērtības. Visu šādu parametru sarakstu var apskatīt, izmantojot getsebool -a. Loģiskās 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

Praktikums, piekļuve Pgadmin-web saskarnei

Apskatīsim praktisku piemēru, mēs uzinstalējām RHEL 7.6 pgadmin4-web datubāzu administrēšanai PostgreSQL. Mēs gājām cauri nelielam uzdevumam ar pg_hba.conf, postgresql.conf un config_local.py iestatījumiem, piešķīrām tiesības mapēm, uzinstalējām trūkstošos Python moduļus caur pip. Viss ir gatavs, palaižam un saņemam 500 Internal Server error.

Linux aizsardzības sistēmas

Sākam ar tipiskajiem aizdomās turētajiem, pārbaudām /var/log/httpd/error_log. Tur ir dažas interesantas ziņas.

[timestamp] [core:notice] [pid 23689] SELinux politika ir aktivizēta; httpd darbojas kā konteksts system_u:system_r:httpd_t:s0
...
[timestamp] [wsgi:error] [pid 23690] [Errno 13] Atļauja noraidīta: ' /var /lib /pgadmin'
[timestamp] [wsgi:error] [pid 23690]
[timestamp] [wsgi:error] [pid 23690] IETEIKUMS: Jums var būt nepieciešams manuāli iestatīt atļaujas uz
[timestamp] [wsgi:error] [pid 23690] /var /lib /pgadmin, lai atļautu apache to izmantot.

Šajā brīdī lielākajai daļai Linux administratoru radīsies pamatīgs kārdinājums palaist setenforce 0, un beigt to. Jāatzīst, ka pirmajā reizē es tā arī izdarīju. Tas, protams, ir izeja, bet ne vislabākā.

Neskatoties uz SELinux konstrukciju sarežģītību, tas var būt draudzīgs lietotājam. Pietiek uzinstalēt setroubleshoot pakotni un apskatīt sistēmas žurnālu.

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

Pievērsiet uzmanību tam, ka pakalpojums auditd ir jārestartē tieši šādā veidā, nevis izmantojot systemctl, neskatoties uz to, ka sistēmā ir systemd. Sistēmas žurnālā tiks norādīts ne tikai aizlieguma fakts, bet arī iemesls un veids, kā pārvarēt aizliegumu.

Linux aizsardzības sistēmas

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 tīmekļa lapai pgadmin4-web, viss strādā.

Linux aizsardzības sistēmas

Linux aizsardzības sistēmas

Avots: habr.com

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster