Jak v selinuxu pridat prava pro proces k adresari/souboru ?

Adam Pribyl pribyl na lowlevel.cz
Čtvrtek Březen 30 07:40:12 CEST 2017


Velice hezky napsano, skoro skoda, ze neco takoveho clovek na netu 
nenajde. Ja pouzivam variantu 3 a jeji zapis ve zkracene forme vypada 
takto:

grep "cochci" /var/log/audit/audit.log | adit2allow -M local
semodule -i local.pp

to uz nevypada tak slozite - z audit logu musite vzit opravdu jen 
to relevantni, bohuzel uz jsem zazil ruzna prekvapeni, ktera 
ani v audit logu videt nebyla.

Pred casem jsem napr. resil jak dostat soubor, ktery prijde mailem na web 
- to mate travers z postfixu pres procmail do httpd. Moc zabavne. Pritom 
bez selinuxu na tom nic neni.



On Thu, 30 Mar 2017, Pavel Kankovsky wrote:

> On Wed, 29 Mar 2017, Petr Simek wrote:
>
>> Jak pridat prava cteni uzivateli postfix na ten adresar /var/lib/arpwatch
>> a soubory v nem ? Aniz by to ovlivnilo stavajici nastaveni pro uzivatele
>> arpwatch ktery ma ted nejaka selinux prava k /var/lib/arpwatch .
>
> Pořádné vysvětlení SELinuxu by asi bylo na delší lokte, ale zkusím to aspoň 
> stručně:
>
> SELinux se řídí tzv. kontexty, což jsou atributy víceméně nezávislé na 
> tradičních unixových uživatelích. Kontexty procesů lze zobrazit pomocí ps s 
> parametrem Z, kontexty souborů a adresářů pomocí ls s parametrem -Z.
>
> Kontext se skládá z několika složek, typicky má formu uživatel_u:role_r:typ_t 
> případně uživatel_u:role_r:typ_t:sX.cY. Odpověď na otázku, zda má určitý 
> kontext subjektu dovoleno provést nějakou operaci s kontextem subjektu, se 
> určuje podle aktivní politiky a používá se při tom několik mechanismů, které 
> se řídí různými složkami kontextů, ale obvykle hlavní roli hrají typy a 
> mechanismus známý jako type enforcement (TE).
> Typům subjektů (což jsou v tomto případě procesy) se také říká domény.
>
> Adresář /var/lib/arpwatch a jeho obsah má pravděpodobně kontext 
> system_u:object_r:arpwatch_data_t:s0. U postfixu pak záleží na tom, který z 
> těch jeho procesů tam přistupuje. Nejpřímočařejší cesta, jak to bezpečně 
> zjistit, je obvykle pohled do audit logu, kam se zapisují pokusy o přístup, 
> které SELinux zaříznul (nebo většina z nich; jsou to zprávy typu AVC, můžete 
> je zkusit vyhledat pomocí ausearch -se arpwatch_data_t). Pro účely této 
> diskuse předpokládajme, že to bude program local, který nejspíš běží s 
> kontextem system_u:system_r:postfix_local_t:s0.
>
> Problém je, že standardní politika doméně postfix_local_t nedovoluje skoro 
> žádné operace s objekty typu arpwatch_data_t, jak se lze přesvědčit např. 
> programem sesearch:
>
> $ sesearch -A -s postfix_local_t -t arpwatch_data_t
> Found 1 semantic av rules:
>   allow mailserver_delivery arpwatch_data_t : dir { getattr search open } ;
>
> Je vidět, že dovoleno má jen koukat na obsah adresářů a nic víc.
> (Na tomto příkladu je navíc vidět použití tzv. atributu, což je de facto 
> množina typů, pomocí které lze elegantně povolit určitý přístup pro více typů 
> podobného charakteru.)
>
> V podstatě máte tři možnosti, jak postupovat:
>
> 1. Opustit ideu, že Postfix bude strkat nos přímo do dat arpwatche, a místo 
> toho nějakým programem (který bude mít oprávnění na obě strany) ta data 
> transportovat.
>
> 2. Dát souboru, který chcete mít přístupný z Postfixu, nějaký jiný kontext, 
> který bude vyhovovat všem zúčastněným. (Ad hoc to lze nastavit pomocí chcon, 
> ale čištší a trvanlivější je použít semanage fcontext a pak restorecon.)
>
> 3. Upravit politiku tak, aby doména postfix_local_t (nebo atribut 
> mailserver_delivery) mohla číst ze souborů s typem arpwatch_data_t.
>
> Varianty 1 a 2 mohou být proveditelné i bez úpravy politiky, pokud se najdou 
> vhodné typy, které mohou fungovat jako prostředník (mám pocit, že funkci na 
> hledání takových prostředníků má program apol). Pokud se takový typ nenajde, 
> tak to může vyžadovat složitější úpravu než varianta 3 (ale zase může být 
> výsledek poněkud čistší.)
>
> Varianta 3 vyžaduje úpravu politiky ve všech případech. Asi nejrychlejší a 
> pro začátečníka nejschůdnější cesta je použít program audit2allow, nejlépe s 
> parametrem -m, který umí konvertovat hlášení z audit logu na malé kousky 
> selinuxové politiky povolující přístupy, jejichž zamítnutí bylo do logu 
> zaznamenáno. Výsledek může po očištění od různého smetí vypadat třeba nějak 
> takto (je to reálný příklad řešící problém, že démon cgrulesengd neměl 
> dovoleno dynamicky vyrábět nové cgrupy):
>
>  module cgred_tmpl 1.0;
>  require {
>      type cgred_t, cgroup_t; class dir { write create };
>  };
>  allow cgred_t cgroup_t:dir { write create };
>
> Direktiva module říká, jak se modul jmenuje a jakou bude mít verzi, direktiva 
> require deklaruje použité entity (v tomto případě dva typy, třídu dir tj. 
> adresář a k ní dvě přístupová práva) a direktiva allow povoluje určitý 
> přístup (doméně cgred_t je v adresářích s typem cgroup_t povoleno vytvářet 
> nové objekty).
>
> Takový modul pak můžete příkazy checkmodule a semodule_package zkompilovat 
> (lze také použít makefile podle vzoru v /usr/share/selinux/devel/Makefile, 
> nebo snad lze finální modul přímo vygenerovat z audit2allow použitím -M) a 
> pomocí semodule -i přidat do aktuální politiky.
>
>
> -- 
> Pavel Kankovsky aka Peak                      "Que sçay-je?"


Další informace o konferenci Linux