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

Petr Simek psimek na jcu.cz
Čtvrtek Březen 30 13:20:34 CEST 2017


On Thu, 30 Mar 2017, Adam Pribyl wrote:

Dobry den

dekuji za obsirny popis p. Kankovskeho i za tenhle zkraceny priklad.

Udelal jsem to nakonec podle nej a kupodivu to zafungovalo. V logu
byla hlaska co je za problem , audit2allow z ni udelal pravidlo ktere
je treba zadat a vytvoril i modul ktery po natazeni pomoci semodule
zpusobil ze to ted funguje. Dokonce i po rebootu :-)

Vypada to ze se to pravidlo nejak zabudovalo do konfigurace selinuxu,
ten prikaz "semodule -i local.pp" trval asi 30 vterin nez skoncil,
docela dlouho na to ze to vlatne aplikovalo jednu radku :

   allow postfix_local_t arpwatch_data_t:file { getattr open read };


Kazdopadne diky - mam co jsem potreboval.


*------------------------------------------------------------------------*
|                          Petr Simek   APS JU                           |
|                             psimek na jcu.cz                              |
*------------------------------------------------------------------------*


> 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