Povinné riadenie prístupu (SELinux, AppArmor)

Radoslav Sabol, xsabol@fi.muni.cz

Obsah

Povinné a volitelné řízení přístupu (MAC a DAC).

Discretionary Access Control (DAC)

Riadenie prístupu k datám na základe identity uživatelov a/alebo skupín do ktorých patria. Užívatel, ktorý
je vlastníkom dát (alebo k tomu má príslušné práva) je schopný nastavovať prístupové práva pre ostatných uživatelov/skupiny.

DAC je jednoduché na údržbu a dobre sa škáluje medzi užívatelmi, avšak nieje úplne bezpečné. Preto je volitelné riadenie prístupu je vhodné pre relatívne malé multiuživatelské systémy v ktorých sa nenachádzajú velmi
citlivé data (napr. zdravotné, finančné, vládne dokumenty).

Mandatory Access Control (MAC)

Riadenie prístupu je kontrolované centrálne prostredníctvom bezpečnostnej politky. Užívatelia nedokážu
bezpečnostnú policy prepísať. Bezpečnostná politika je manuálne spravovaná administrátorom.

Príklady riadenia prístupu k súborom v Linuxe

  • - prístupové masky (DAC)
  • - Access Control Lists (DAC)
  • Príklady riadenia prístupu procesov v Linuxe

  • - chroot jail
  • - hlavný proces vymedzí menší proces ktorý beží pod rootom
  • - capabilities
  • SELinux

    SELinux je séria úprav a modifikácií Linuxového jadra spolu s userspace utilitami ktoré sa starajú o konfiguráciu a vynucovanie bezpečnostnej politky.

    História

    Pôvodne bol SELinux projektom pod National Security Agency (NSA) (2000). Implementácia modulu bola založená na bezpečnostnej architektúre
    FLASK. Ten sa zakladá na princípe "least privilege", čo znamená že práva procesu by mali byť obmedzené tak aby sotva stačili na úlohu ktorú
    musí proces vykonať.

    Pôvodne NSA integrovala SELinux ako súčasť Loadable Security Modules (LSA). Od verzie jadra 2.4 (2003) bol SELinux podporovaný ako modul vďaka úsiliu
    NSA, RedHatu a samotnej komunity SELinuxu.

    Bezpečnostný kontext

    Každý proces má pridelený práve jeden bezpečnostný kontext (inač nazývané aj label), ktorý spolu s užívatelom pod ktorým proces beží pomáha
    identifikovať čo proces môže/nemôže robiť.
  • Príklad: kontext procesu je možné vypísať pomocou príkazu ps s prepínačom -Z
  • root#

    ps -eZ | grep -E '(auditd|sshd|grep)' system_u:system_r:auditd_t:s0 root 3934 ? 00:00:00 /sbin/auditd system_u:system_r:kernel_t:s0 root 3946 ? 00:00:00 [kauditd] system_u:system_r:sshd_t:s0-s0:c0.c1023 root 4159 ? 00:00:00 /usr/sbin/sshd unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 4240 ? 00:00:00 grep
    Syntax: user:role:type:[level]

    User

  • - cieľom SELinuxového užívatela je mať nemennú časť kontextu ktorý sa mapuje na UNIXových uživatelov
  • - UNIXový užívatel je namapovaný práve na jedného SELinux uživatela
  • - SELinuxový uživatel môže mať viacerých UNIXových uživatelov
  • - SELinuxový uživatel sa potom mapuje na jednotlivé roles
  • Príklady uživatelov

  • unconfined_u - užívatel ktorého sa netýkajú bezpečnostné obmedzenia
  • sysadm_u - užívatel ktorý má navyše povolené administratívne úkony
  • user_u - bežný neprivilegovaný uživatel
  • Role

  • - mapujú sa na ňu SELinuxový uživatelia
  • - diktuje v akých doménach môže byť uživatel
  • Type

  • - typ (pre procesy sa typ nazýva "doména") je používaný v samotných pravidlách (poďľa typu sa vynucuje špecifická politika)
  • Kontexty v súboroch (objektoch)

    Pre väčšinu filesystémov sa kontext v súboroch ukladá pomocou extented attributes. V prípade že filesystém nepodporuje
    extended attributes, tak všetky súbory v danom fs budú mať priradený rovnaký kontext (typicky cez mount options).
    User space SELinux si udržiava databázu regulárnych výrazov ciest ku súborov a korešpondujúcim labelom.
    Kontext súborov je možné meniť pomocou nástroja semanage (keď mu to SELinux dovolí), po čom je potrebný relabelling pomocou nástroja restorecon.

    Kontextu v procesoch (subjektoch)

    Defaultné správanie pre SELinux je že potomkovia procesov dedia kontext po rodičoch. Kontexty už nieje možné meniť. V prípade že užívatel chce
    spustiť proces pod iným kontextom, je možné tak učiniť programom "runcon" (v prípade že mu to aktuálna policy dovolí).

    Konfigurácia (/etc/selinux/conf)

    Módy

    Nastavitelné pomocou premennej SELINUX (po zmene je nutný reboot systému).
  • - disabled: SELinux po boote nebude vynucovať žiadnu politku
  • - permissive: SELinux dovolí narušenie bezpečnostnej politky, no vypíše hlášku do logov, prípadne na chybový výstup
  • - enforcing: SELinux bude vynucovať dodržanie bezpečnostnej politky (a teda zamietne akékolvek neoprávnené správanie)
  • Policy type

    Nastavitelné premennou SELINUXTYPE.
  • - targeted: používané defaultne, SELinux rozhoduje primárne podľa type
  • - mls: Multi Level Security
  • Booleans

    Booleans sú konfigurovatelné dvojstavové nastavenia (podobne ako má napr. sysctl). Slúžia na zapínanie/vypínanie policies.
    Následujúci boolean povolí bežným uživatelom používať príkaz dmesg.
    setsetbool user_dmesg on
    

    Politika

    Politika je sada pravidiel ktorú SELinux bude vynucovať.
  • Vlastnosti:
  • - full enclosure: všetko čo potrebuje SELinux vedieť na zabezpečenie kontroly prístupu je uvedené v politike.
    Žiadne dalšie informácie niesú potrebné.
    - modularita: pre jednoduchšiu správu SELinux podporuje viacero policy modulov ktoré sa môžu načítať/vypnúť na
    žiadosť. Základná systémová policy obsahuje moduly ktoré sa síce nedajú vypínať, no je ich možné nahradiť (base policy
    musí byť vždy načítaná). Mimo základnej policy existujú jednotlivé moduly, ktoré sa typicky týkajú samotných aplikácii.

    Vytvorenie vlastnej politiky

    Vytvorenie .pe súboru

    #názov a verzia politiky
    #názov musí byť rovnaký aako meno súboru bez koncovky
    policy_module(example, 1.0)
    
    #makro v ktorom deklarujeme existujúce typy ktoré budeme používať
    gen_require(`
        type user_t;
        user user_u;
        role user_r;
    ')
    
    
    #definícia typu
    type example_t;
    
    #definícia role
    user example_u roles { user_r };
    
    # povoliť subjektu user_t na objekt example_t
    # otváranie bežného súboru, čítanie, a získanie atribútov súboru
    allow user_t example_t:file { getattr open read };
    
    # makro povoluje prehľadávanie adresára /var/log pre label user_t
    logging_list_logs(user_t)
    
    Definovanú politiku je možné zostaviť pomocou:
     
    make -f /usr/share/selinux/refpolicy-arch/include/Makefile test.pp
    
    Výsledný *.pp súbor môžeme načítať pomocou:
    semodule -i test.pp
    
    Modul bude prístupný aj po reštarte. Zmazanie modulu:
    semodule -d test
    

    AppArmor

    Podobne ako SELinux, AppArmor je implementáciou MAC od Immunix z roku 2003. Aktuálne je udržiavaný firmou Canonical Ltd
    od roku 2009.

    Rozdiely od SELinuxu

  • - politika v AppArmore sa nazýva profil
  • - AppArmor je považovaný ako viac user friendly (jednoduchšia konfigurácia)
  • - v kerneli pracuje priamo s cestami
  • - nemá implementované Multi Layer Security
  • - profily sa ukladajú v /etc/apparmor.d/
  • - namiesto permissive a enforcing módov má AppArmor complain a enforce
  • Príklad profilu v AppArmore (prevzatý z man 5 apparmor.d)

            # Definícia premennej
            @{HOME} = /home/*/ /root/
    
            # profile pre /usr/bin/foo.
            /usr/bin/foo {
              /bin/mount          ux,
              /dev/{,u}random     r,
              /etc/ld.so.cache    r,
              /etc/foo.conf       r,
              /etc/foo/*          r,
              /lib/ld-*.so*       rmix,
              /lib/lib*.so*       r,
              /proc/[0-9]**       r,
              /usr/lib/**         r,
              /tmp/foo.pid        wr,
              /tmp/foo.*          lrw,
              /@{HOME}/.foo_file  rw,
              /usr/bin/baz        Cx -> baz,
    
              # podprofil pre foo, baz.
              profile baz {
                #include <abstractions/bash>
                owner /proc/[0-9]*/stat r,
                /bin/bash ixr,
                /var/lib/baz/ r,
                owner /var/lib/baz/* rw,
              }
            }
    
    
    Nastavenie profile na complain mode:
    aa-complain /etc/apparmor.d/nazov_profilu
    
    Nastavenie profile na enforce mode:
    aa-enforce /etc/apparmor.d/nazov_profilu
    

    Literatúra