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

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Čtvrtek Březen 30 01:59:58 CEST 2017


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