Linux apsaugos sistemos

Viena iš didžiulės Linux OS sėkmės priežasčių įterptiniuose, mobiliuosiuose įrenginiuose ir serveriuose yra gana aukštas branduolio, susijusių paslaugų ir programų saugumo lygis. Bet jei pažiūrėk atidžiau į Linux branduolio architektūrą, tada joje neįmanoma rasti kvadrato, atsakingo už saugumą kaip tokį. Kur slepiasi Linux saugos posistemis ir iš ko jis susideda?

„Linux“ saugos modulių ir „SELinux“ fonas

Security Enhanced Linux – tai taisyklių ir prieigos mechanizmų rinkinys, pagrįstas privalomais ir vaidmenimis pagrįstais prieigos modeliais, siekiant apsaugoti Linux sistemas nuo galimų grėsmių ir ištaisyti diskrecinės prieigos kontrolės (DAC), tradicinės Unix saugos sistemos, trūkumus. Projektas kilo iš JAV Nacionalinio saugumo agentūros ir buvo tiesiogiai sukurtas daugiausia rangovų Secure Computing Corporation ir MITER, taip pat daugybės tyrimų laboratorijų.

Linux apsaugos sistemos
Linux saugos moduliai

Linusas Torvaldsas pateikė nemažai komentarų apie naujus NSA pokyčius, kad juos būtų galima įtraukti į pagrindinį Linux branduolį. Jis apibūdino bendrą aplinką su rinkiniu gaudyklių, skirtų valdyti operacijas su objektais, ir tam tikrų apsauginių laukų rinkinį branduolio duomenų struktūrose, kad būtų saugomi atitinkami atributai. Tada šią aplinką gali naudoti įkeliami branduolio moduliai, kad būtų galima įgyvendinti bet kokį norimą saugos modelį. LSM visiškai įėjo į Linux branduolio v2.6 2003 m.

LSM sistema apima apsaugos laukus duomenų struktūrose ir iškvietimus į perėmimo funkcijas kritiniuose branduolio kodo taškuose, kad jais būtų galima manipuliuoti ir atlikti prieigos kontrolę. Ji taip pat papildo saugos modulių registravimo funkciją. /sys/kernel/security/lsm sąsajoje yra aktyvių sistemos modulių sąrašas. LSM kabliukai saugomi sąrašuose, kurie iškviečiami tokia tvarka, kokia nurodyta CONFIG_LSM. Išsami dokumentacija apie kabliukus yra įtraukta į antraštės failą include/linux/lsm_hooks.h.

LSM posistemis leido visiškai integruoti SELinux su ta pačia stabilaus Linux branduolio v2.6 versija. Beveik iš karto SELinux tapo de facto saugios Linux aplinkos standartu ir buvo įtrauktas į populiariausius platinimus: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

SELinux Glossary

  • Tapatybė — SELinux vartotojas nėra tas pats, kas įprastas Unix/Linux vartotojo ID; jie gali egzistuoti toje pačioje sistemoje, tačiau iš esmės yra visiškai skirtingi. Kiekviena standartinė „Linux“ paskyra gali atitikti vieną ar daugiau „SELinux“. SELinux tapatybė yra bendro saugumo konteksto dalis, kuri nustato, prie kurių domenų galite prisijungti ir prie kurių negalite prisijungti.
  • Domenai - SELinux sistemoje domenas yra dalyko, ty proceso, vykdymo kontekstas. Domenas tiesiogiai nustato proceso turimą prieigą. Domenas iš esmės yra sąrašas, ką procesai gali atlikti arba ką gali padaryti procesas su skirtingais tipais. Kai kurie domenų pavyzdžiai yra sysadm_t, skirtas sistemos administravimui, ir user_t, kuris yra įprastas neprivilegijuoto vartotojo domenas. Init sistema veikia init_t domene, o pavadintas procesas vykdomas named_t domene.
  • Vaidmenys — Kas tarnauja kaip tarpininkas tarp domenų ir SELinux vartotojų. Vaidmenys nustato, kuriems domenams vartotojas gali priklausyti ir kokio tipo objektus jis gali pasiekti. Šis prieigos kontrolės mechanizmas apsaugo nuo privilegijų eskalavimo atakų grėsmės. Vaidmenys įrašyti į SELinux naudojamą Role Based Access Control (RBAC) saugos modelį.
  • Tipai — Tipo vykdymo sąrašo atributas, priskiriamas objektui ir nustato, kas gali jį pasiekti. Panašus į domeno apibrėžimą, išskyrus tai, kad domenas taikomas procesui, o tipas taikomas tokiems objektams kaip katalogai, failai, lizdai ir kt.
  • Subjektai ir objektai - Procesai yra subjektai ir vykdomi konkrečiame kontekste arba saugos srityje. Operacinės sistemos ištekliai: failai, katalogai, lizdai ir pan., yra objektai, kuriems priskiriamas tam tikras tipas, kitaip tariant, privatumo lygis.
  • SELinux politika — SELinux sistemai apsaugoti naudoja įvairias strategijas. SELinux politika apibrėžia vartotojų prieigą prie vaidmenų, rolių prie domenų ir domenų prie tipų. Pirma, vartotojas turi teisę gauti vaidmenį, tada vaidmuo yra įgaliotas pasiekti domenus. Galiausiai domenas gali turėti prieigą tik prie tam tikrų tipų objektų.

LSM ir SELinux architektūra

Nepaisant pavadinimo, LSM paprastai nėra įkeliami Linux moduliai. Tačiau, kaip ir SELinux, jis yra tiesiogiai integruotas į branduolį. Bet kokiems LSM šaltinio kodo pakeitimams reikalingas naujas branduolio kompiliavimas. Atitinkama parinktis turi būti įjungta branduolio nustatymuose, kitaip LSM kodas po įkrovos nebus aktyvuotas. Tačiau net ir šiuo atveju jį galima įjungti naudojant OS įkrovos įkrovos parinktį.

Linux apsaugos sistemos
LSM čekių krūva

LSM turi pagrindinių branduolio funkcijų kabliukus, kurie gali būti svarbūs tikrinant. Viena iš pagrindinių LSM ypatybių yra ta, kad jos yra sukrautos. Taigi, vis dar atliekami standartiniai patikrinimai, o kiekvienas LSM sluoksnis prideda tik papildomų valdiklių ir valdiklių. Tai reiškia, kad draudimas negali būti atšauktas. Tai parodyta paveikslėlyje; jei įprastinių DAC patikrinimų rezultatas yra gedimas, reikalas net nepasieks LSM kabliukų.

SELinux taiko Fluke tyrimų operacinės sistemos Flask saugos architektūrą, ypač mažiausios privilegijos principą. Šios koncepcijos esmė, kaip rodo jos pavadinimas, yra suteikti vartotojui ar apdoroti tik tas teises, kurios yra būtinos numatytiems veiksmams atlikti. Šis principas įgyvendinamas naudojant priverstinės prieigos tipavimą, todėl prieigos valdymas SELinux yra pagrįstas domeno => tipo modeliu.

Dėl priverstinės prieigos įvedimo SELinux turi daug didesnes prieigos kontrolės galimybes nei tradicinis DAC modelis, naudojamas Unix/Linux operacinėse sistemose. Pavyzdžiui, galite apriboti tinklo prievado numerį, prie kurio prisijungs ftp serveris, leisti rašyti ir keisti failus tam tikrame aplanke, bet jų neištrinti.

Pagrindiniai SELinux komponentai yra šie:

  • Politikos vykdymo serveris — Pagrindinis prieigos kontrolės organizavimo mechanizmas.
  • Sistemos saugumo politikos duomenų bazė.
  • Sąveika su LSM įvykių perėmėju.
  • Selinuxfs - Pseudo-FS, tas pats kaip /proc ir sumontuotas /sys/fs/selinux. Vykdymo metu dinamiškai užpildomas Linux branduolio ir yra failų su SELinux būsenos informacija.
  • Prieiga prie vektorinės talpyklos — Pagalbinis našumo didinimo mechanizmas.

Linux apsaugos sistemos
Kaip veikia SELinux

Viskas veikia taip.

  1. Tam tikras subjektas, kalbant SELinux sąlygomis, po DAC patikrinimo atlieka leistiną veiksmą su objektu, kaip parodyta viršutiniame paveikslėlyje. Ši užklausa atlikti operaciją patenka į LSM įvykių perėmėją.
  2. Iš ten užklausa kartu su subjekto ir objekto saugos kontekstu perduodama SELinux Abstraction and Hook Logic moduliui, kuris yra atsakingas už sąveiką su LSM.
  3. Sprendimus dėl subjekto prieigos prie objekto priima Politikos vykdymo serveris ir jis gauna duomenis iš SELinux AnHL.
  4. Kad priimtų sprendimus dėl prieigos ar atsisakymo, politikos vykdymo serveris kreipiasi į prieigos vektorių talpyklos (AVC) talpyklos posistemį, kad gautų dažniausiai naudojamas taisykles.
  5. Jei talpykloje nerandamas atitinkamos taisyklės sprendimas, užklausa perduodama saugos politikos duomenų bazei.
  6. Paieškos rezultatas iš duomenų bazės ir AVC grąžinamas į politikos vykdymo serverį.
  7. Jei rasta politika atitinka prašomą veiksmą, operacija leidžiama. Priešingu atveju operacija yra draudžiama.

SELinux nustatymų tvarkymas

SELinux veikia vienu iš trijų režimų:

  • Vykdymas – griežtas saugumo politikos laikymasis.
  • Leidžiamas – leidžiamas apribojimų pažeidimas, atitinkama pažyma daroma žurnale.
  • Išjungta – saugos politika negalioja.

Galite pamatyti, kokiame režime yra SELinux, naudodami šią komandą.

[admin@server ~]$ getenforce
Permissive

Režimo keitimas prieš paleidžiant iš naujo, pavyzdžiui, nustatant jį į priverstinį arba 1. Leidžiamasis parametras atitinka skaitinį kodą 0.

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

Taip pat galite pakeisti režimą redaguodami failą:

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

Skirtumas nuo setenfoce yra tas, kad paleidus operacinę sistemą SELinux režimas bus nustatytas pagal SELINUX parametro reikšmę konfigūracijos faile. Be to, priverstinio <=> išjungimo pakeitimai įsigalioja tik redagavus /etc/selinux/config failą ir paleidus iš naujo.

Peržiūrėkite trumpą būsenos ataskaitą:

[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

Norėdami peržiūrėti SELinux atributus, kai kurios standartinės priemonės naudoja parametrą -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

Palyginti su įprasta ls -l išvestimi, yra keletas papildomų laukų tokiu formatu:

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

Paskutinis laukas žymi kažką panašaus į saugos klasifikaciją ir susideda iš dviejų elementų derinio:

  • s0 - reikšmingumas, taip pat parašytas kaip žemo lygio-aukšto lygio intervalas
  • c0, c1… c1023 - kategorija.

Keičiama prieigos konfigūracija

Naudokite semodulį SELinux moduliams įkelti, pridėti ir pašalinti.

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

Pirmoji komanda semanage prisijungimas sujungia SELinux vartotoją su operacinės sistemos vartotoju, antrasis rodo sąrašą. Galiausiai paskutinė komanda su jungikliu -r pašalina SELinux vartotojų susiejimą su OS paskyromis. MLS / MCS diapazono reikšmių sintaksės paaiškinimas pateiktas ankstesniame skyriuje.

[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 vartotojas naudojamas valdyti susiejimą tarp SELinux vartotojų ir vaidmenų.

[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

Komandos parametrai:

  • -pridėkite pasirinktinį vaidmenų susiejimo įrašą;
  • -l atitinkančių vartotojų ir vaidmenų sąrašas;
  • -d ištrinti vartotojo vaidmenų susiejimo įrašą;
  • -R vartotojui priskirtų vaidmenų sąrašas;

Failai, prievadai ir Būlio reikšmės

Kiekviename SELinux modulyje pateikiamas failų žymėjimo taisyklių rinkinys, tačiau, jei reikia, galite pridėti ir savo taisykles. Pavyzdžiui, norime, kad žiniatinklio serveris turėtų prieigos prie /srv/www aplanko teises.

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

Pirmoji komanda registruoja naujas žymėjimo taisykles, o antroji iš naujo nustato, tiksliau, nustato failų tipus pagal galiojančias taisykles.

Taip pat TCP/UDP prievadai yra pažymėti taip, kad tik atitinkamos tarnybos galėtų juos klausytis. Pavyzdžiui, kad žiniatinklio serveris klausytų 8080 prievado, turite paleisti komandą.

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

Nemažai SELinux modulių turi parametrus, kurie gali priimti Būlio reikšmes. Visą tokių parametrų sąrašą galima pamatyti naudojant getsebool -a. Galite pakeisti logines reikšmes naudodami 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

Seminaras, gaukite prieigą prie Pgadmin žiniatinklio sąsajos

Pažiūrėkime į praktinį pavyzdį: mes įdiegėme pgadmin7.6-web RHEL 4, kad administruotume PostgreSQL duomenų bazę. Mes šiek tiek vaikščiojome ieškojimas su pg_hba.conf, postgresql.conf ir config_local.py parametrais, nustatykite aplanko teises, įdiegė trūkstamus Python modulius iš pip. Viskas paruošta, paleidžiame ir gauname 500 Vidinė serverio klaida.

Linux apsaugos sistemos

Pradedame nuo tipiškų įtariamųjų, tikrindami /var/log/httpd/error_log. Ten yra keletas įdomių įrašų.

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

Šiuo metu dauguma „Linux“ administratorių bus labai linkę paleisti „setencorce 0“ ir tuo viskas baigsis. Atvirai pasakius, tai padariau pirmą kartą. Žinoma, tai taip pat yra išeitis, bet toli gražu ne pati geriausia.

Nepaisant sudėtingo dizaino, SELinux gali būti patogus naudoti. Tiesiog įdiekite trikčių šalinimo paketą ir peržiūrėkite sistemos žurnalą.

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

Atminkite, kad audituota paslauga turi būti paleista iš naujo tokiu būdu, nenaudojant systemctl, nepaisant to, kad OS yra systemd. Sistemos žurnale bus nurodyta ne tik blokavimo faktas, bet ir priežastis bei būdas įveikti draudimą.

Linux apsaugos sistemos

Vykdome šias komandas:

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

Patikriname prieigą prie pgadmin4-web tinklalapio, viskas veikia.

Linux apsaugos sistemos

Linux apsaugos sistemos

Šaltinis: www.habr.com

Добавить комментарий