Uvod u osnovne konfiguracije u SELinuxu

Posljednje ažuriranje: 17/12/2025
Autor: Isaac
  • SELinux dodaje obavezni sloj kontrole pristupa zasnovan na kontekstima i tipovima kako bi se ojačala sigurnost. Linux izvan tradicionalnih dozvola.
  • Dnevna administracija se fokusira na načine rada (prisilni, permisivni), pravilno označavanje, logičke vrijednosti i alate kao što su semanage, semodule i restorecon.
  • Zapisnici u /var/log/audit/audit.log, zajedno sa audit2why i audit2allow, omogućavaju vam dijagnosticiranje problema i, ako je potrebno, kreiranje specifičnih lokalnih politika.
  • Razvoj prilagođenih modula i korištenje modularnih politika olakšavaju prilagođavanje SELinuxa vašim vlastitim aplikacijama bez žrtvovanja finog sigurnosnog modela.

Osnovni koncepti SELinuxa

Ako upravljate Linux sistemima i brinete se o sigurnosti, prije ili kasnije ćete naići na SELinux. Iako ponekad ima reputaciju da "kvari stvari", on je zapravo... vrlo moćan zaštitni sloj koji ograničava ono što svaki proces može učiniti u sistemu, čak i nakon što je prošao tradicionalne dozvole Unix.

Kroz ovaj vodič ćemo detaljno i najjasnijim mogućim jezikom vidjeti kako SELinux interno funkcioniše, koje su njegove komponente. konteksti, politike, načini rada i osnovni alati upravljanjai kako ga mudro početi koristiti bez gubitka u pokušaju, kako u distribucijama tipa Red Hat, tako i u Debianu ili SUSE-u.

Šta je SELinux i kako se uklapa u sigurnost Linuxa?

SELinux (Sigurnosno poboljšani Linux) je Obavezna kontrola pristupa (MAC) koji je integriran u Linux kernel putem LSM (Linux Security Modules) interfejsa. Dok se klasična diskrecionarna kontrola pristupa (DAC) zasniva na korisnicima, grupama i dozvolama za čitanje/pisanje/izvršavanje, SELinux dodaje dodatni sloj koji odgovara na pitanje: "Može li ovaj subjekt izvršiti ovu radnju na ovom objektu?".

Sa DAC-om, vlasnik datoteke ima znatnu slobodu da mijenja dozvole, a u praksi, proces koji kompromituje račun može dobiti pristup mnogo većem broju resursa nego što bi trebao. SELinux, s druge strane, primjenjuje centralizovanu politiku: Čak i ako tradicionalni sistem dozvola dozvoljava pristup, ako SELinux politika to ne odobri, on će biti blokiran.SELinux pravila se evaluiraju nakon DAC pravila, tako da ako DAC već nešto odbija, SELinux se čak ni ne koristi.

U praksi, sistemsko jezgro konsultuje SELinux prije autorizacije svakog relevantnog sistemskog poziva kako bi odlučilo da li je uključeni proces... ovlašten za izvršavanje operacije na određenom resursu u skladu s učitanom politikomTa politika je veliki skup pravila koja opisuju koji procesi mogu komunicirati s kojim datotekama, direktorijima, socketima, portovima i drugim objektima.

SELinux odgovara na ovo pitanje autorizacije koristeći ključni koncept: sigurnosni kontekstI procesi i objekti (datoteke, direktoriji, portovi itd.) imaju pridruženu posebnu oznaku, SELinux kontekst, koji apstrahira detalje niskog nivoa i fokusira se na njihova sigurnosna svojstva. Ovo izbjegava tipične dvosmislenosti, na primjer, kada je ista datoteka dostupna kroz različite putanje zbog montiranja veza.

SELinux konteksti: korisnik, uloga, tip i nivo

SELinux kontekst se obično predstavlja kao string sa nekoliko polja: SELinux korisnik, SELinux uloga, tip i nivo sigurnostiIako su sva polja relevantna, u praksi je najvažniji dio za većinu politika tip, jer su najčešća pravila pristupa definirana između tipova.

SELinux tipovi se lako prepoznaju jer završavaju sa _tNa primjer, proces Apache web servera obično se izvršava s tipom httpd_t, datoteke koje web server objavljuje u /var/www/html/ Obično su označeni sa httpd_sys_content_t, privremene datoteke od /tmp y /var/tmp/ to su obično tmp_t, a portovi koje web serveri mogu koristiti su označeni kao http_port_t. Politika definira koje su kombinacije tipova dozvoljene, a koje zabranjene..

Zahvaljujući tome, čak i ako je Apache kompromitovan, SELinux može spriječiti pokretanje tog procesa. httpd_t pristupiti, na primjer, podacima MariaDB-a. Ako ne postoji pravilo koje dozvoljava httpd_t pristup objektima označenim kao mysqld_db_t (tipično za /data/mysql/), taj pristup će biti odbijen čak i ako bi ga Unix sistem dozvola dozvolio.

Kontekst procesa ne zavisi samo od izvršne datoteke, već i od SELinux korisnika, uloge i domene koju trenutno ima. Domena je, u stvari, tip povezan s procesom (na primjer, ssh_t za demona SSH) i Domen je taj koji određuje šta taj proces može, a šta ne može da uradi.Uloge kontrolišu koje domene korisnik može usvojiti i kako se može prebacivati ​​između njih.

Kada se korisnik prijavi, dodjeljuje mu se zadani SELinux kontekst koji postavlja njegove SELinux identitet, početna uloga i domen procesa koje pokrećeAko želite promijeniti svoju ulogu (i, obično, povezanu domenu), morate koristiti naredbu newrole -r rol_r -t dominio_tšto će zahtijevati lozinku kako bi se spriječilo da programi automatski mijenjaju uloge. Takvi prijelazi bit će mogući samo ako politika to eksplicitno dozvoljava.

SELinux stanja i operativni režimi

SELinux se može globalno omogućiti ili onemogućiti, a kada je omogućen, radi u jednom od nekoliko načina rada. Važno je razlikovati status (omogućeno ili onemogućeno) i modo (kako se politike primjenjuju kada su omogućene).

Kada je SELinux omogućen u kernelu, može raditi u ova tri glavna načina:

  • Primjena (način primjene)SELinux strogo primjenjuje učitanu politiku. Ako neka radnja prekrši pravilo, operacija se blokira i poruka se zapisuje u zapisnike revizije. najsigurniji način rada i preporučeni nakon što je sistem pravilno konfigurisan.
  • Dozvoljeno (dozvoljeni način rada)Politika se evaluira, ali kršenja se ne blokiraju; ona se jednostavno evidentiraju. /var/log/audit/audit.logOvaj način rada je idealan za testiranje, otklanjanje grešaka i pripremu za migraciju na primjenu bez prekida servisa.
  • OnemogućenoSELinux je potpuno isključen; ne provodi pravila niti bilježi incidente. U ovom stanju nema dodatne SELinux zaštite.
  Alis vs ArchInstall: Prave razlike prilikom instaliranja Arch Linuxa

U Red Hat-u ili sličnim sistemima, trenutni režim se može provjeriti pomoću getenforce, koji vraća Provođenje, dopuštanje ili onemogućavanjeZa dinamičko prebacivanje između prinudnog i permisivnog režima bez ponovnog pokretanja, koristite setenforce 0 (dozvoljivo) ili setenforce 1 (primjena), pod uslovom da nije potpuno onemogućeno u konfiguracijskoj datoteci.

Da biste konfigurirali trajno ponašanje nakon ponovnog pokretanja, uredite datoteku /etc/selinux/configosiguravajući da linija SELINUX = uvjeravanje, SELINUX=dozvoljen o SELINUX = onemogućeno odražavaju ono što želimo. Ako se promijeni u disabledSELinux prestaje s učitavanjem kada se sistem pokrene i ne može se samostalno mijenjati. setenforce.

U Debian okruženjima, pored ovih načina rada, parametri se mogu proslijediti kernelu kao što su selinux=1 security=selinux da se to omogući, audit=1 prisiliti registraciju odbijenih transakcija i enforcing=1 da se direktno počne s primjenom politike. Ovi parametri se dodaju u GRUB liniju kernela, obično modifikovanjem GRUB_CMDLINE_LINUX en /etc/default/grub i trčanje update-grub.

Osnovna instalacija i aktivacija SELinuxa

U većini modernih distribucija, kernel dolazi s ugrađenom SELinux podrškom, a korisnički alati su dostupni u namjenskim paketima. Ako trebate prilagoditi postavke kernela, pogledajte [link do relevantne dokumentacije]. Kako pretražiti konfiguracije u `make menuconfig`Međutim, način omogućavanja i konfiguracije se neznatno mijenja ovisno o distribucijskoj porodici, iako je osnovna ideja uvijek ista: Instalirajte pravila, označite datotečni sistem i pokrenite kernel sa omogućenim SELinuxom..

U Debianu, na primjer, naredba apt install selinux-basics selinux-policy-default auditd Automatski instalira komponente potrebne za korištenje SELinuxa. Paket selinux-policy-default Uključuje standardnu ​​modularnu politiku, koja je po zadanim postavkama Ograničava samo određene izložene usluge i ostavlja korisnike u nekoj vrsti neograničenog domena (modul unconfined). Ako želite politiku sličniju staroj "strogoj", morate onemogućiti taj modul.

Nakon instaliranja politike, obavezno je označiti sve sistemske datoteke, tj. dodijelite im odgovarajući SELinux tip prema pravilima označavanjaU Debianu se ovo može uraditi sa fixfiles relabelOvaj proces skenira sistem i primjenjuje oznake u skladu s instaliranim pravilima. Ovaj proces može potrajati znatno vrijeme, posebno na mašinama s velikim količinama podataka.

Postoji skripta, selinux-activatešto automatizira veći dio ovog procesa u Debianu: prilagođava parametre bootPripremite etiketiranje i prisiljava relej pri sljedećem ponovnom pokretanjusprečavanje kreiranja neoznačenih datoteka dok SELinux još nije u potpunosti pokrenut i pokrenut.

U Red Hat i derivativnim okruženjima, kada se SELinux prvi put omogući, obično se radi nešto slično: prilagođava se /etc/selinux/config a SELINUX=dozvoljenPrazna datoteka je kreirana /.autorelabel i sistem se ponovo pokreće (na primjer, sa init 6Datoteka /.autorelabel govori sistemu da mora Preimenujte cijeli datotečni sistem pri sljedećem pokretanjuNakon završetka, možete preći na način primjene i u konfiguracijskoj datoteci i pomoću setenforce 1.

SELinux politike: vrste, moduli i administracija

SELinux politika je u suštini veliki skup pravila koja određuju kako procesi i objekti mogu međusobno komunicirati unutar sistema. Međutim, ne održava se kao jedna monolitna datoteka, već na strukturiran način. modularno, putem paketa politika koje se mogu aktivirati ili deaktivirati ovisno o instaliranim uslugama.

U Debianu, na primjer, dostupni moduli pravila nalaze se u /usr/share/selinux/default/, a aktivna konfiguracija je pohranjena u /etc/selinux/default/Iako su ove datoteke čitljive, ne bi ih trebalo ručno uređivati: Uvijek biste trebali koristiti alate dizajnirane za njihovo upravljanje., kako semodule y semanage.

Naredba semodule se koristi za upravljanje instaliranim modulima pravilaMeđu njegovim osnovnim opcijama su:

  • semodule -i modul.pp.bz2: instalira modul pravila (komprimiran sa bzip2) u trenutnu konfiguraciju.
  • semodule -r naziv_modula: uklanja već instalirani modul.
  • semodul -l: navodi prisutne module, sa njihovim verzijama.
  • semodule -e naziv_modula y semodule -d naziv_modula: selektivno aktiviranje ili deaktiviranje modula bez njihovog deinstaliranja.

Default, semodule Primijenite promjene na politiku koju je odabrala varijabla. SELINUXTIPE en /etc/selinux/configMoguće je raditi na drugoj vrsti politike koristeći opciju -s. Promjene su trenutne osim ako se ne koristi opcija -nšto izbjegava preopterećenje političkog sistema u žaru trenutka.

S druge strane je semanageŠvicarski nožić za fino podešavanje SELinux konfiguracije visokog nivoa: mapira korisnike sistema na SELinux identitete, upravlja pravilima označavanja datoteka i portova, mijenja logičke vrijednosti itd. Svaki tip podataka kojim upravlja semanage Ima svoju vlastitu stranicu priručnika, kao što je semanage-login(8) o korisnik-upravljanja-semanom (8), a sintaksa podredova je prilično konzistentna: -a za dodavanje, -d za brisanje, -m za izmjenu, -l za listanje i -t za određivanje tipa ili domene.

  Profiliranje pokretanja pomoću systemd-analyze u Linuxu

con semanage login -l Dobijena su trenutna mapiranja između korisničkih imena i SELinux korisnika. Korisnici koji nisu eksplicitno navedeni nasljeđuju zadani identitet, predstavljen kao __default__. Na primjer, sedmična prijava -a -s korisnik_u korisnik dodjeljuje SELinux identitet user_u tom Unix korisniku i semanage prijava -d korisnik poništava tu alokaciju.

Naredba semanage user -l Prikazuje veze između SELinux identiteta (kao što su user_u, staff_u, sysadm_u) i uloge koje su im dozvoljene. Prilikom kreiranja novog SELinux identiteta, morate navesti uloge koje može preuzeti i prefiks označavanja (user, staff o sysadm) koji određuje vrstu ličnih datoteka, na primjer početni_direktorij_osoblja za korisnike s prefiksom staffTipična narudžba bi bila semanage user -a -R 'staff_r user_r' -P staff test_u, što kreira SELinux korisnika test_u sa određenim ulogama i specifičnom shemom označavanja.

Označavanje datoteka, direktorija i portova

Nakon što je politika instalirana, svaka relevantna datoteka, direktorij, uređaj, socket ili port na sistemu mora imati SELinux tip u skladu sa svojom funkcijomOva povezanost između putanja/portova i tipova poznata je kao pravila konteksta datoteke ili pravila označavanja.

Za datoteke i direktorije, SELinux oznake se pohranjuju kao prošireni atributi datotečnog sistemaMogu se lako vidjeti sa ls -Z, na primjer ls -Z /etc/httpdZa procese i portove, kernel održava kontekst i on se može pregledati pomoću naredbe como ps auxZ | grep httpd za procese ili netstat -anpZ | grep httpd da biste vidjeli označene portove.

Ako želimo znati koji se kontekst primjenjuje po zadanim postavkama na datoteke pod /var/www/html, možemo koristiti ls -Z /var/www/html o semanage fcontext -l | grep '/var/www'Uobičajeno je pronaći nešto poput httpd_sys_content_t za sadržaj koji poslužuje Apache. Nasuprot tome, početni direktorij poput /home/dan/html možda ima nešto slično user_home_tšto će spriječiti web server da mu pristupi čak i ako DAC to dozvoli.

Da biste omogućili web serveru da čita sadržaj sa /home/dan/html U skladu sa SELinuxom, politici bi trebalo reći da se tip treba primijeniti na te datoteke. httpd_sys_content_tTo se postiže registracijom pravila označavanja sa semanage fcontext -a -t httpd_sys_content_t '/home/dan/html(/.*)?' a zatim izvršavanje restorecon -Rv /home/dan/html da biste primijenili novi kontekst na postojeće datoteke.

Šef '/home/dan/html(/.*)?' To je regularni izraz koji označava da se primjenjuje i na direktorij i na sav njegov rekurzivni sadržaj. Naredba restorecon je odgovorna za sinhronizaciju stvarnih oznaka datotečnog sistema s pravilima pohranjenim u politici.Ovo se također koristi nakon većih promjena ili restauracija sigurnosnih kopija.

Slično tome, TCP/UDP portovi također imaju SELinux tip. Web server, na primjer, koristi portove označene kao http_port_tAko želimo da Apache osluškuje port 8080, pored konfigurisanja na samom web serveru, moramo registrovati port sa semanage port -m -t http_port_t -p tcp 8080 tako da SELinux to smatra važećim portom za tu uslugu.

SELinux Boolean-ovi: Prekidači ponašanja

Pored statičkih pravila, mnoge SELinux politike otkrivaju Boolean opcije koje vam omogućavaju da aktivirate ili deaktivirate određene dijelove ponašanja bez ponovnog kompajliranja ili učitavanja novih modula. Vrlo su korisni za prilagođavanje dozvola stvarnim potrebama bez potrebe za zaglavljivanjem u prilagođenim politikama.

Možemo vidjeti sve dostupne opcije sa getsebool -aOvo navodi naziv svake logičke vrijednosti i njenu trenutnu vrijednost (uključeno/isključeno). Za više detalja, uključujući opis, možete koristiti semanage boolean -li filtrirajte po ključnim riječima sa grep da pronađemo ono što nas zanima, na primjer FTP o httpd.

Zamislite da želimo da FTP server ima dozvole za čitanje i pisanje u kućnim direktorijima korisnika, i iako sve izgleda ispravno konfigurisano na nivou sistema, datoteke nisu vidljive. Provjeravamo sa semanage boolean -l | grep ftp možemo pronaći logičku vrijednost pod nazivom ftp_home_dir s opisom „Dozvoli ftp-u čitanje i pisanje datoteka u korisničkom kućnom direktoriju“ i vrijednošću isključen. Aktivirajte ga sa setsebool ftp_home_dir on Ovo omogućava FTP serveru pristup tim direktorijima u skladu s politikom.

Drugi tipičan primjer je Booleova funkcija httpd_enable_homedirsšto omogućava web serveru pristup ličnim direktorijima kako bi opsluživao sajtove poput ~/public_html/Njegovu vrijednost možemo provjeriti pomoću getsebool httpd_enable_homedirsa ako se pojavi kao isključeno, trajno ga omogućite pomoću setsebool -P httpd_enable_homedirs on. Opcija -P Osigurava da se promjena trajno sačuva i preživi ponovno pokretanje sistema.

Općenito, prije pisanja složenih pravila, vrijedi pažljivo pregledati logičke vrijednosti povezane s uslugom koju prilagođavate. Često, Jednostavna opcija uključivanja/isključivanja rješava ono što se čini kao ozbiljan problem s dozvolama..

Dijagnoza: logovi, audit2why i audit2allow

Kada SELinux odbije operaciju, generira događaj kontrole pristupa (AVC) koji se prijavljuje. /var/log/audit/audit.log (ako usluga auditd je aktivan i audit=1 (konfigurisano je). Za svakodnevnu administraciju, učenje čitanja ovih poruka je ključno za razumijevanje Zašto je nešto blokirano?.

Tipična AVC poruka može izgledati ovako: avc: denied { read write } for pid=1876 comm="syslogd" name="xconsole" dev=tmpfs ino=5510 scontext=system_u:system_r:syslogd_t:s0 tcontext=system_u:object_r:device_t:s0 tclass=fifo_file permissive=1Označava koje su dozvole odbijene, koji je proces uključen (PID, komanda i izvorni kontekst) i protiv kojeg objekta (naziv, tip i klasa objekta). S tim informacijama moguće je izraditi pravilo koje izričito ovlašćuje tu operaciju, na primjer allow syslogd_t device_t:fifo_file { read write }.

Ručna analiza zapisnika je komplicirana, pa postoje specifični alati poput ausearch tražiti događaje od interesa i, prije svega, audit2why y audit2allow interpretirati šta se dešava. Sa audit2why < /var/log/audit/audit.log Možemo dobiti sažetak uzroka odbijanja, što uveliko pomaže u identifikovanju netačnih konfiguracija ili nedostajućih logičkih vrijednosti.

  NVIDIA grafičke kartice ranjive na Rowhammer napade na GDDR6

Ako, uprkos prilagođavanju logičkih vrijednosti i konteksta, i dalje vidimo ponovljene greške za istu uslugu, možemo razmotriti kreiranje specifična lokalna politika za taj slučajNa primjer, da bismo kompajlirali pravila koja dozvoljavaju trenutno zabranjen pristup Apacheu, možemo uraditi nešto poput grep httpd_t /var/log/audit/audit.log | audit2allow -M http_policy, koji generira lokalni modul pravila pod nazivom http_policy.pp.

Slično tome, mogli bismo kreirati politiku za Sambu sa grep smbd_t /var/log/audit/audit.log | audit2allow -M smb_policyNakon generiranja, učitavaju se u aktivnu politiku sa semodule -i http_policy.pp y semodule -i smb_policy.pp. Ovo omogućava integraciju pravila generiranih iz zapisa u SELinux. i, u principu, da će se demanti vezani za te slučajeve prestati pojavljivati.

Uprkos tome, preporučljivo je ručno pregledati pravila koja generira audit2allow, jer obično bude velikodušan i može dati više dozvola nego što je zapravo potrebno. Dobra praksa je kreirajte specifičnije tipove i ograničite dozvole na te namjenske tipoveUmjesto otvaranja prevelikog pristupa općim tipovima, kada određena odbijanja nisu kritična, možda je bolje koristiti pravila. dontaudit kako ne bi stvarali buku u zapisima umjesto da je dozvoljavaju.

Razvoj prilagođenih modula politika

U složenim okruženjima ili interno razvijenim aplikacijama, uobičajeno je da ne postoji specifičan SELinux modul koji ih pokriva. U takvim slučajevima preporučuje se Razviti prilagođene module koji proširuju referentnu politiku, umjesto da se sve forsira u generičke politike ili logičke vrijednosti.

Da bi se to postiglo, paketi kao što su selinux-policy-dev y selinux-policy-doc, koji pružaju i dokumentaciju standardnih pravila (na primjer u /usr/share/doc/selinux-policy-doc/html/) kao primjeri datoteka koje služe kao predlošci. Uobičajeno je kopirati osnovne datoteke kao što su Makefile.example, example.fc, example.if y example.te u radni direktorij radi njihovog prilagođavanja.

datoteku .te (primjena tipa) je srž modula: Deklariše tipove, domene i pravila dozvoljavanja/nedopuštanja revizije. Fajl .fc (konteksti datoteka) definira kako su datoteke povezane s modulom označene, koristeći putanje i regularne izraze. Konačno, datoteka .if definira javne interfejse koje drugi moduli mogu pozvati za interakciju s našim, nešto poput funkcija visokog nivoa za višekratnu upotrebu.

U tipičnom primjeru, u datoteci .te domen bi se mogao deklarirati myapp_t, tip izvršne datoteke myapp_exec_t, tip za rezanje myapp_log_t i još jedan za privremene datoteke myapp_tmp_tMakroi bi se koristili kao tip_domene(), datoteka_unosa_domene(), logging_log_file() o datoteke_tmp_datoteka() da se pravilno strukturira politika, nakon čega slijede specifična pravila dozvoljavanja koja ovlašćuju, na primjer, čitanje i dodavanje u datoteke dnevnika i upravljanje privremenim datotekama.

U datoteci .if interfejsi bi bili definirani kao myapp_domtrans (da biste kontrolisali ko može pokrenuti aplikaciju i ući u vaš domen) ili myapp_read_log (da bi se omogućilo drugim domenama da čitaju njegove zapise). Svaki interfejs mora deklarisati tipove koji su mu potrebni sa gen_require i generirati važeći blok pravila koji bi se, ako se proširi, mogao besprijekorno integrirati u .te.

Nakon što su tri datoteke (interfejsi, konteksti i pravila) prilagođene, one se preimenuju stvarnim imenom aplikacije (na primjer, mi_programa.te, mi_programa.fc, mi_programa.if) i modul se kompajlira sa nečim sličnim make NAME=develkoji će proizvesti paket politika mi_programa.pp. Ovaj paket se može odmah učitati sa semodule -i mi_programa.ppA ako u direktoriju postoji više modula, make generirat će sve odgovarajuće .pp.

Najosetljiviji dio razvoja modula je određivanje minimalnog skupa pravila potrebnih da bi aplikacija funkcionirala bez narušavanja sigurnosnog modela. Uobičajena tehnika je pravilno označavanje svih objekata koje aplikacija koristi, postavljanje SELinuxa u permisivni način rada i Pokrenite aplikaciju za generiranje odbijanja u zapisimakoji se zatim analiziraju alatima za reviziju kako bi se poboljšala politika.

Pronalaženje ravnoteže između funkcionalnosti i sigurnosti je iterativni radAli kada se pravilno implementira, nudi vrlo granularnu zaštitu koja sprječava da ranjivost u aplikaciji postane potpuno kompromitovanje sistema.

SELinux je od "te smetnje koja prekida servise" postao moćan i fleksibilan alat koji, kada se pravilno konfiguriše, pruža... sloj odbrane od ogromne vrijednosti protiv napada i konfiguracijskih grešakaRazumijevanje njegovih osnovnih koncepata - konteksta, tipova, modova, logičkih vrijednosti, označavanja i modula - prvi je korak ka njegovom korištenju bez straha.

Kako pretražiti postavke u Make Menuconfig
Povezani članak:
Kako pronaći konfiguracije u make menuconfig i fino podesiti kernel