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