Linuxin turvajärjestelmät

Yksi syy Linux-käyttöjärjestelmän valtavaan menestykseen sulautetuissa, mobiililaitteissa ja palvelimissa on ytimen, siihen liittyvien palveluiden ja sovellusten melko korkea turvallisuustaso. Mutta jos katso tarkemmin Linux-ytimen arkkitehtuuriin, siitä on mahdotonta löytää neliötä, joka vastaa turvallisuudesta sellaisenaan. Missä Linuxin tietoturva-alijärjestelmä piileskelee ja mistä se koostuu?

Taustaa Linuxin suojausmoduuleista ja SELinuxista

Security Enhanced Linux on joukko sääntöjä ja pääsymekanismeja, jotka perustuvat pakollisiin ja roolipohjaisiin pääsymalleihin, jotka suojaavat Linux-järjestelmiä mahdollisilta uhilta ja korjaavat perinteisen Unix-turvajärjestelmän (Discretionary Access Control, DAC) puutteet. Projekti sai alkunsa Yhdysvaltain kansallisen turvallisuusviraston sisimmistä, ja sen kehittivät suoraan pääasiassa urakoitsijat Secure Computing Corporation ja MITER sekä useat tutkimuslaboratoriot.

Linuxin turvajärjestelmät
Linuxin suojausmoduulit

Linus Torvalds teki useita kommentteja uusista NSA-kehityksistä, jotta ne voitaisiin sisällyttää Linuxin pääytimeen. Hän kuvasi yleisen ympäristön, jossa on joukko sieppaimia, jotka ohjaavat toimintoja objektien kanssa, ja joukko tiettyjä suojakenttiä ytimen tietorakenteissa vastaavien attribuuttien tallentamiseksi. Ladattavat ydinmoduulit voivat sitten käyttää tätä ympäristöä minkä tahansa halutun suojausmallin toteuttamiseen. LSM tuli täysin Linux-ytimen v2.6:een vuonna 2003.

LSM-kehys sisältää suojakenttiä tietorakenteissa ja kutsuja sieppaustoimintoihin ytimen koodin kriittisissä kohdissa niiden manipuloimiseksi ja pääsynhallinnan suorittamiseksi. Se myös lisää toimintoja suojausmoduulien rekisteröintiä varten. /sys/kernel/security/lsm-liitäntä sisältää luettelon järjestelmän aktiivisista moduuleista. LSM-koukut tallennetaan luetteloihin, jotka kutsutaan CONFIG_LSM:ssä määritetyssä järjestyksessä. Yksityiskohtaiset asiakirjat koukuista sisältyvät otsikkotiedostoon include/linux/lsm_hooks.h.

LSM-alijärjestelmä mahdollisti SELinuxin täydellisen integroinnin saman vakaan Linux-ytimen version 2.6 kanssa. SELinuxista tuli lähes välittömästi suojatun Linux-ympäristön de facto standardi, ja se sisällytettiin suosituimpiin jakeluihin: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

SELinux Sanasto

  • identiteetti — SELinux-käyttäjä ei ole sama kuin tavallinen Unix/Linux-käyttäjätunnus; ne voivat olla rinnakkain samassa järjestelmässä, mutta ne ovat pohjimmiltaan täysin erilaisia. Jokainen standardi Linux-tili voi vastata yhtä tai useampaa SELinuxissa. SELinux-identiteetti on osa yleistä suojauskontekstia, joka määrittää, mihin toimialueisiin voit liittyä ja mihin et.
  • Verkkotunnukset - SELinuxissa domain on kohteen eli prosessin suorituskonteksti. Toimialue määrittää suoraan prosessin käyttöoikeudet. Toimialue on pohjimmiltaan luettelo siitä, mitä prosessit voivat tehdä tai mitä prosessi voi tehdä eri tyypeille. Joitakin esimerkkejä toimialueista ovat sysadm_t järjestelmän hallintaa varten ja user_t, joka on tavallinen etuoikeutettu käyttäjän toimialue. Init-järjestelmä toimii init_t-toimialueella ja nimetty prosessi toimii named_t-toimialueella.
  • rooli — Mikä toimii välittäjänä verkkotunnusten ja SELinux-käyttäjien välillä. Roolit määrittävät, mihin toimialueisiin käyttäjä voi kuulua ja minkä tyyppisiin objekteihin hän voi päästä. Tämä pääsynvalvontamekanismi estää käyttöoikeuksien eskalointihyökkäysten uhan. Roolit kirjoitetaan SELinuxissa käytettävään Role Based Access Control (RBAC) -suojausmalliin.
  • tyypit — Type Enforcement list -attribuutti, joka on määritetty objektille ja määrittää, kuka voi käyttää sitä. Samanlainen kuin toimialueen määritelmä, paitsi että toimialue koskee prosessia ja tyyppi koskee objekteja, kuten hakemistoja, tiedostoja, pistokkeita jne.
  • Aiheet ja esineet - Prosessit ovat aiheita ja niitä suoritetaan tietyssä kontekstissa tai suojausalueella. Käyttöjärjestelmän resurssit: tiedostot, hakemistot, socketit jne. ovat objekteja, joille on määritetty tietty tyyppi, toisin sanoen tietosuojataso.
  • SELinuxin käytännöt — SELinux käyttää erilaisia ​​käytäntöjä järjestelmän suojaamiseen. SELinux-käytäntö määrittää käyttäjien pääsyn rooleihin, rooleihin toimialueisiin ja toimialueisiin tyyppeihin. Ensin käyttäjällä on oikeus saada rooli, sitten rooli valtuutetaan käyttämään toimialueita. Lopuksi verkkotunnuksella voi olla pääsy vain tietyntyyppisiin objekteihin.

LSM ja SELinux-arkkitehtuuri

Nimestä huolimatta LSM:t eivät yleensä ole ladattavia Linux-moduuleja. Kuitenkin, kuten SELinux, se on integroitu suoraan ytimeen. Kaikki muutokset LSM-lähdekoodiin vaativat uuden ytimen käännöksen. Vastaava vaihtoehto on otettava käyttöön ytimen asetuksissa, muuten LSM-koodi ei aktivoidu käynnistyksen jälkeen. Mutta myös tässä tapauksessa se voidaan ottaa käyttöön käyttöjärjestelmän käynnistyslataustoiminnolla.

Linuxin turvajärjestelmät
LSM-tarkistuspino

LSM on varustettu ytimen ydintoimintojen koukuilla, jotka voivat olla tärkeitä tarkistuksia varten. Yksi LSM:ien pääominaisuuksista on, että ne on pinottu. Siten vakiotarkistukset suoritetaan edelleen, ja jokainen LSM-taso lisää vain lisäsäätimiä ja -säätimiä. Tämä tarkoittaa, että kieltoa ei voi kumota. Tämä näkyy kuvassa, jos rutiini-DAC-tarkistusten tulos on epäonnistunut, niin asia ei pääse edes LSM-koukkuihin.

SELinux ottaa käyttöön Fluke-tutkimuskäyttöjärjestelmän Flask-tietoturva-arkkitehtuurin, erityisesti vähiten etuoikeuksien periaatteen. Tämän konseptin ydin on nimensä mukaisesti myöntää käyttäjälle tai prosessille vain ne oikeudet, jotka ovat tarpeen aiottujen toimien suorittamiseksi. Tämä periaate on toteutettu pakotetun pääsyn kirjoituksella, joten pääsynhallinta SELinuxissa perustuu domain => type -malliin.

Pakotetun pääsyn kirjoittamisen ansiosta SELinuxilla on paljon paremmat kulunvalvontaominaisuudet kuin perinteisessä Unix/Linux-käyttöjärjestelmissä käytetyssä DAC-mallissa. Voit esimerkiksi rajoittaa verkkoportin numeroa, johon ftp-palvelin muodostaa yhteyden, sallia tiedostojen kirjoittamisen ja muuttamisen tietyssä kansiossa, mutta et poista niitä.

SELinuxin pääkomponentit ovat:

  • Policy Enforcement Server — Päämekanismi kulunvalvonnan järjestämiseksi.
  • Järjestelmän suojauskäytäntötietokanta.
  • Vuorovaikutus LSM-tapahtuman sieppaajan kanssa.
  • Selinuxfs - Pseudo-FS, sama kuin /proc ja asennettu tiedostoon /sys/fs/selinux. Linux-ytimen täyttämä dynaamisesti ajon aikana ja sisältää tiedostoja, jotka sisältävät SELinuxin tilatietoja.
  • Käytä vektorivälimuistia — Apumekanismi tuottavuuden lisäämiseksi.

Linuxin turvajärjestelmät
Kuinka SELinux toimii

Kaikki toimii näin.

  1. Tietty subjekti, SELinuxin termein, suorittaa sallitun toiminnon objektille DAC-tarkistuksen jälkeen, kuten yläkuvassa näkyy. Tämä toimintopyyntö menee LSM-tapahtuman sieppaajalle.
  2. Sieltä pyyntö sekä kohteen ja objektin suojauskonteksti välitetään SELinux Abstraction and Hook Logic -moduulille, joka vastaa vuorovaikutuksesta LSM:n kanssa.
  3. Päättävä viranomainen kohteen pääsystä kohteeseen on Policy Enforcement Server ja se vastaanottaa tiedot SELinux AnHL:ltä.
  4. Päättääkseen pääsystä tai kieltämisestä Policy Enforcement Server kääntyy Access Vector Cache (AVC) -välimuistialijärjestelmän puoleen saadakseen eniten käytetyt säännöt.
  5. Jos välimuistista ei löydy ratkaisua vastaavalle säännölle, pyyntö välitetään suojauskäytäntötietokantaan.
  6. Hakutulos tietokannasta ja AVC:stä palautetaan Policy Enforcement Serverille.
  7. Jos löydetty käytäntö vastaa pyydettyä toimintoa, toiminto on sallittu. Muuten toiminta on kielletty.

SELinux-asetusten hallinta

SELinux toimii yhdessä kolmesta tilasta:

  • Täytäntöönpano - Turvallisuuskäytäntöjen tiukka noudattaminen.
  • Salliva - Rajoitusten rikkominen on sallittua, vastaava huomautus tehdään päiväkirjaan.
  • Pois käytöstä – Suojauskäytännöt eivät ole voimassa.

Voit nähdä, missä tilassa SELinux on seuraavalla komennolla.

[admin@server ~]$ getenforce
Permissive

Tilan muuttaminen ennen uudelleenkäynnistystä, esimerkiksi sen asettaminen pakottavaksi tai 1. Salliva parametri vastaa numerokoodia 0.

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

Voit myös vaihtaa tilaa muokkaamalla tiedostoa:

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

Erona setenfocen kanssa on se, että käyttöjärjestelmän käynnistyessä SELinux-tila asetetaan asetustiedoston SELINUX-parametrin arvon mukaisesti. Lisäksi muutokset, jotka koskevat pakottamista <=> pois käytöstä, tulevat voimaan vain muokkaamalla /etc/selinux/config-tiedostoa ja uudelleenkäynnistyksen jälkeen.

Katso lyhyt tilaraportti:

[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

Jotkin vakioapuohjelmat käyttävät -Z-parametria tarkastellakseen SELinux-attribuutteja.

[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

Verrattuna ls -l:n normaaliin ulostuloon, siinä on useita lisäkenttiä seuraavassa muodossa:

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

Viimeinen kenttä tarkoittaa jotain turvaluokitusta ja koostuu kahden elementin yhdistelmästä:

  • s0 - merkitsevyys, kirjoitettu myös matalan tason-korkean tason väliksi
  • c0, c1… c1023 - luokka.

Käyttöoikeusmäärityksen muuttaminen

Käytä semodulia SELinux-moduulien lataamiseen, lisäämiseen ja poistamiseen.

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

Ensimmäinen joukkue semanage-kirjautuminen yhdistää SELinux-käyttäjän käyttöjärjestelmän käyttäjään, toinen näyttää luettelon. Lopuksi viimeinen komento, jossa on -r-kytkin, poistaa SELinux-käyttäjien yhdistämisen käyttöjärjestelmätileihin. MLS/MCS Range -arvojen syntaksin selitys on edellisessä osiossa.

[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

Joukkue semanage-käyttäjä käytetään yhdistämisen hallintaan SELinux-käyttäjien ja roolien välillä.

[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

Komentoparametrit:

  • - lisää mukautettu roolikartoitusmerkintä;
  • -l luettelo vastaavista käyttäjistä ja rooleista;
  • -d poistaa käyttäjän roolikartoitusmerkinnän;
  • -R luettelo käyttäjälle liitetyistä rooleista;

Tiedostot, portit ja Boolen arvot

Jokainen SELinux-moduuli tarjoaa joukon tiedostojen taggaussääntöjä, mutta voit myös lisätä omia sääntöjä tarvittaessa. Haluamme esimerkiksi, että verkkopalvelimella on käyttöoikeudet /srv/www-kansioon.

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

Ensimmäinen komento rekisteröi uudet merkintäsäännöt ja toinen nollaa, tai pikemminkin asettaa, tiedostotyypit nykyisten sääntöjen mukaisesti.

Samoin TCP/UDP-portit on merkitty siten, että vain sopivat palvelut voivat kuunnella niitä. Esimerkiksi, jotta verkkopalvelin voi kuunnella porttia 8080, sinun on suoritettava komento.

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

Huomattavassa määrässä SELinux-moduuleja on parametreja, jotka voivat ottaa Boolen arvoja. Koko luettelo tällaisista parametreista voidaan nähdä käyttämällä getsebool -a. Voit muuttaa loogisia arvoja käyttämällä setseboolia.

[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

Workshop, pääset Pgadmin-web-käyttöliittymään

Katsotaanpa käytännön esimerkkiä: asensimme pgadmin7.6-webin RHEL 4:een PostgreSQL-tietokannan hallintaa varten. Kävelimme vähän Etsintä asetuksilla pg_hba.conf, postgresql.conf ja config_local.py, aseta kansion käyttöoikeudet, asensi puuttuvat Python-moduulit pip:stä. Kaikki on valmista, käynnistämme ja vastaanotamme 500 Sisäinen palvelinvirhe.

Linuxin turvajärjestelmät

Aloitamme tyypillisistä epäillyistä tarkistamalla /var/log/httpd/error_log. Siellä on mielenkiintoisia merkintöjä.

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

Tässä vaiheessa useimmat Linux-järjestelmänvalvojat tuntevat voimakkaan kiusauksen suorittaa setencorce 0, ja siihen se loppuu. Suoraan sanottuna tein juuri niin ensimmäistä kertaa. Tämä on tietysti myös ulospääsy, mutta kaukana parhaasta.

Hankalista rakenteista huolimatta SELinux voi olla käyttäjäystävällinen. Asenna vain setroubleshoot-paketti ja tarkastele järjestelmälokia.

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

Huomaa, että auditd-palvelu on käynnistettävä uudelleen tällä tavalla, eikä systemctl:llä, vaikka systemd on olemassa käyttöjärjestelmässä. Järjestelmälokissa ilmoitetaan ei vain eston tosiasia, vaan myös syy ja tapa voittaa kielto.

Linuxin turvajärjestelmät

Suoritamme nämä komennot:

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

Tarkistamme pääsyn pgadmin4-web-sivulle, kaikki toimii.

Linuxin turvajärjestelmät

Linuxin turvajärjestelmät

Lähde: will.com

Lisää kommentti