V SELinuxu je jedním z častých úkolů, které můžete dělat, změnit kontext zabezpečení objektu. K tomu použijete příkaz chcon.
chcon je zkratka pro Change Context.
Tento příkaz se používá ke změně kontextu zabezpečení SELinux souboru.
Tento kurz vysvětluje následující příklady příkazů chcon:
- Změnit úplný kontext SELinux
- Změnit kontext pomocí jiného souboru jako reference
- Změnit pouze uživatele v kontextu SELinux
- Změnit pouze roli v kontextu SELinux
- Změňte pouze typ v kontextu SELinux
- Změňte pouze rozsah (úroveň) v kontextu SELinux
- Kombinovat uživatele, roli, typ a úroveň v chcon
- Výchozí chování Chcon na symbolickém odkazu
- Vynutit změnu kontextu symbolického odkazu SELinux
- Rekurzivně změnit kontext SELinux
- Zobrazení podrobných podrobností o operaci chcon
- Výchozí chování Chcon na symbolických odkazech pro rekurzivní
- Vynutit chcon procházet zadané symbolické odkazy pro rekurzivní
- Vynutit chcon procházet VŠECHNY symbolické odkazy pro rekurzivní
- Chcon Behavior on / root directory for Systemwide Change
1. Změňte úplný kontext SELinux
Chcete-li zobrazit kontext zabezpečení souboru, použijte volbu -Z (velké Z) v příkazu ls, jak je uvedeno níže.
# ls -lZ httpd.conf -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 httpd.conf
Ve výše uvedeném příkladu je kontext zabezpečení souboru httpd.conf následující:
unconfined_u:object_r:admin_home_t:s0
Toto je nesprávný kontext SELinux pro soubor httpd.conf, který je v adresáři /etc/httpd/conf.
Chcete-li tedy změnit kontext zabezpečení, použijte následující příkaz chcon.
# chcon system_u:object_r:httpd_config_t:s0 httpd.conf
Ve výše uvedeném příkladu jsme změnili kontext zabezpečení souboru httpd.conf na následující, který je správný.
system_u:object_r:httpd_config_t:s0
Můžeme to ověřit pomocí následujícího příkazu ls -lZ.
# ls -lZ httpd.conf -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 httpd.conf
Poznámka:Ve výše uvedeném příkladu poskytujeme úplný kontext SELinux souboru (tj. uživatel, role, typ a rozsah) ve formátu uživatel:role:typ:rozsah, aniž bychom jej dále rozdělovali.
Kdykoli budete čelit problémům souvisejícím se SELinuxem, můžete být v pokušení jednoduše SELinux zakázat, jak jsme vysvětlili dříve. V mnoha situacích však můžete zjistit, že jde pouze o to, že daný soubor má nesprávný bezpečnostní kontext, který lze změnit pomocí příkazu chcon.
2. Změnit kontext pomocí jiného souboru jako reference
Někdy možná nevíte, jaký kontext SELinuxu byste měli pro soubor nastavit.
V takovém případě můžete jako referenci použít kontext zabezpečení jiného souboru a použít jej k přiřazení k vašemu souboru.
V podstatě místo určení úplného kontextu SELinux pro soubor používáte pouze kontext jiného souboru pro váš soubor.
V následujícím příkladu vidíme, že jak ssl.conf, tak httpd.conf mají odlišný kontext SELinux.
# ls -lZ -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 ssl.conf -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 httpd.conf
V tomto případě víme, že soubor ssl.conf má správný kontext zabezpečení. Ale httpd.conf má nesprávný.
Změníme tedy bezpečnostní kontext souboru httpd.conf, ale jako referenci pro tuto změnu použijeme kontext ssl.conf, jak je uvedeno níže.
# chcon --reference=ssl.conf httpd.conf
Po výše uvedené změně můžete vidět, že soubor httpd.conf má stejný kontext zabezpečení jako soubor ssl.conf.
# ls -lZ -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 ssl.conf -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 httpd.conf
Související poznámka:Chcete-li zobrazit aktuální stav SELinuxu, použijte příkaz sestatus. Je důležité, abyste porozuměli výstupu příkazu sestatus, jak je vysvětleno zde:3 Výstup příkazu SELinux sestatus vysvětlený s příklady
3. Změňte pouze uživatele v kontextu SELinux
Namísto změny celého kontextu zabezpečení SELinuxu můžeme také změnit pouze jeho částečnou hodnotu.
Níže je uveden aktuální kontext zabezpečení souboru httpd.conf.
# ls -lZ httpd.conf -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 httpd.conf
Ve výše uvedeném příkladu je „unconfined_u“ uživatelská část kontextu zabezpečení.
Pomocí volby chcon -u můžeme změnit pouze uživatelskou část kontextu zabezpečení.
V následujícím příkladu nastavujeme uživatelskou část kontextu zabezpečení na system_u pro soubor httpd.conf.
# chcon -u system_u httpd.conf
Jak vidíte z následujícího výstupu, u souboru httpd.conf se změní pouze USER část kontextu zabezpečení.
# ls -lZ httpd.conf -rw-r--r--. root root system_u:object_r:admin_home_t:s0 httpd.conf
Místo -u můžete také použít –user. Oba následující příkazy jsou naprosto stejné.
# chcon --user system_u httpd.conf # chcon -u system_u httpd.conf
4. Změňte pouze roli v kontextu SELinux
Pomocí volby chcon -r můžeme změnit pouze část ROLE kontextu zabezpečení.
V následujícím příkladu nastavujeme část role kontextu zabezpečení na object_r pro soubor httpd.conf.
# chcon -r object_r httpd.conf
Jak vidíte z následujícího výstupu, u souboru httpd.conf je změněna pouze část ROLE kontextu zabezpečení.
# ls -lZ httpd.conf -rw-r--r--. root root system_u:object_r:admin_home_t:s0 httpd.conf
Když zadáte roli, kterou SELinux nerozpozná, zobrazí se následující chyba neplatného argumentu. V tomto příkladu neexistuje role jako „identity_r“.
# chcon -r identity_r httpd.conf chcon: failed to change context of ‘httpd.conf’ to ‘system_u:identity_r:admin_home_t:s0’: Invalid argument
Můžete také použít –role místo -r. Oba následující příkazy jsou naprosto stejné.
# chcon --role object_r httpd.conf # chcon -r object_r httpd.conf
5. Změňte pouze TYP v kontextu SELinux
To je pravděpodobně to, co budete většinou používat, protože TYPE je to, o co se v typickém nastavení SELinuxu většinu času zajímáme.
Níže je uveden aktuální kontext zabezpečení souboru httpd.conf.
# ls -lZ httpd.conf -rw-r--r--. root root system_u:object_r:admin_home_t:s0 httpd.conf
Ve výše uvedeném příkladu je „admin_home_t“ TYPE součástí kontextu zabezpečení.
Pomocí volby chcon -t můžeme změnit pouze typovou část kontextu zabezpečení.
V následujícím příkladu nastavujeme typovou část kontextu zabezpečení na httpd_config_t pro soubor httpd.conf.
# chcon -t httpd_config_t httpd.conf
Jak vidíte z následujícího výstupu, u souboru httpd.conf je změněna pouze část TYPE v kontextu zabezpečení.
# ls -lZ httpd.conf -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 httpd.conf
Místo -t můžete také použít –type. Oba následující příkazy jsou naprosto stejné.
# chcon -t httpd_config_t httpd.conf # chcon --type httpd_config_t httpd.conf
6. Změňte pouze rozsah (úroveň) v kontextu SELinux
Pomocí volby chcon -l můžeme změnit pouze část RANGE (která se také nazývá úroveň) kontextu zabezpečení. Rozsah se používá pouze v MLS a v typické situaci nemusíme rozsah změnit.
V následujícím příkladu nastavujeme rozsahovou část kontextu zabezpečení na „s0“ pro soubor httpd.conf.
# chcon -l s0 httpd.conf
Jak vidíte z následujícího výstupu, u souboru httpd.conf je změněna pouze část ROLE kontextu zabezpečení.
# ls -lZ httpd.conf -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 httpd.conf
Místo -l můžete také použít –range. Oba následující příkazy jsou naprosto stejné.
# chcon -l s0 httpd.conf # chcon --range s0 httpd.conf
7. Kombinujte uživatele, roli, typ, úroveň v chcon
V chcon můžete kombinovat volbu uživatele (-u), roli (-r), typ (-t) nebo úroveň (-l).
Například následující změní všechny čtyři, jak je uvedeno níže.
# chcon -u system_u -r object_r -t httpd_config_t -l s0 httpd.conf
Nebo můžete kombinovat a měnit pouze několik z nich najednou. Například v následujícím příkladu měníme pouze USER a TYPE souboru httpd.conf.
# chcon -u system_u -t httpd_config_t httpd.conf
8. Výchozí chování Chcon na symbolickém odkazu
V následujícím příkladu je apache.conf symbolický odkaz na soubor httpd.conf. Oba mají nesprávný bezpečnostní kontext.
# ls -lZ lrwxrwxrwx. unconfined_u:object_r:admin_home_t:s0 apache.conf -> httpd.conf -rw-r--r--. unconfined_u:object_r:admin_home_t:s0 httpd.conf
V následujícím příkladu měním USER a TYPE pro symbolický odkaz apache.conf.
# chcon -u system_u -t httpd_config_t apache.conf
ALE, jak vidíte zde, toto skutečně změnilo kontext SELinux pro soubor, na který ukazuje, místo toho, aby se změnil u symbolického odkazu.
# ls -lZ lrwxrwxrwx. unconfined_u:object_r:admin_home_t:s0 apache.conf -> httpd.conf -rw-r--r--. system_u:object_r:httpd_config_t:s0 httpd.conf
Toto je výchozí chování příkazu chcon. tj. Změní kontext souboru, na který ukazuje, namísto samotného symbolického odkazu.
Toto chování se nazývá de-referencování. Chcon má možnost nazvanou –dereference, která změní soubor namísto symbolického odkazu.
Oba následující příklady jsou naprosto stejné.
# chcon -u system_u -t httpd_config_t apache.conf # chcon --dereference -u system_u -t httpd_config_t apache.conf
9. Vynutit změnu kontextu symbolického odkazu SELinux
Místo změny kontextu zabezpečení souboru, na který odkazuje symbolický odkaz, můžete také přinutit chcon, aby změnil kontext samotného symbolického odkazu.
V následujícím příkladu je apache.conf symbolický odkaz na soubor httpd.conf. Oba mají nesprávný bezpečnostní kontext.
# ls -lZ lrwxrwxrwx. unconfined_u:object_r:admin_home_t:s0 apache.conf -> httpd.conf -rw-r--r--. unconfined_u:object_r:admin_home_t:s0 httpd.conf
Když v chcon zadáme volbu –no-dereference, změní se kontext symbolického odkazu a ne soubor, na který odkazuje.
Následující příklad tedy změní USER a TYPE pro symbolický odkaz apache.conf (a nikoli soubor httpd.conf).
# chcon --no-dereference -u system_u -t httpd_config_t apache.conf
Jak vidíte z následujícího, pouze kontext SELinux symbolického odkazu apache.conf je změněn na ten, který jsme specifikovali výše.
# ls -lZ lrwxrwxrwx. system_u:object_r:httpd_config_t:s0 apache.conf -> httpd.conf -rw-r--r--. unconfined_u:object_r:admin_home_t:s0 httpd.conf
Namísto –no-dereference můžeme také zadat volbu „-h“, jak je uvedeno níže.
Oba následující příkazy jsou naprosto stejné.
# chcon -h -u system_u -t httpd_config_t apache.conf # chcon --no-dereference -u system_u -t httpd_config_t apache.conf
10. Rekurzivně změnit kontext SELinux
V tomto příkladu je následující aktuální bezpečnostní linuxový kontext všech souborů pod conf.d
# ls -lZ conf.d/ -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 autoindex.conf -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 nss.conf -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 README -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 userdir.conf -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 welcome.conf
Pomocí rekurzivní volby chcon -R můžeme rekurzivně změnit všechny soubory v conf.d na kontext zabezpečení dát, jak je uvedeno níže.
# chcon -R system_u:object_r:httpd_config_t:s0 conf.d
Jak vidíte níže, kontext se rekurzivně mění pro všechny soubory v conf.d
# ls -lZ conf.d -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 autoindex.conf -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 nss.conf -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 README -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 userdir.conf -rw-r--r--. root root system_u:object_r:httpd_config_t:s0 welcome.conf
Poznámka:Pokud jsou v conf.d další podadresáře, všechny tyto podadresáře a soubory pod nimi budou také ovlivněny volbou -R.
Můžete také použít – rekurzivní možnost. Oba následující příkazy jsou naprosto stejné.
# chcon --recursive system_u:object_r:httpd_config_t:s0 conf.d # chcon -R system_u:object_r:httpd_config_t:s0 conf.d
11. Zobrazit podrobné podrobnosti o operaci chcon
Pomocí volby -v můžete zobrazit podrobnosti o tom, co chcon dělá.
-v znamená verbose, což zobrazí název souboru, který je právě zpracováván příkazem chcon, jak je uvedeno níže.
To je velmi užitečné, když kombinujete s rekurzivní volbou -R, kde můžete měnit kontext velkého množství souborů a chcete vidět, co chcon aktuálně dělá, jak je uvedeno níže.
# chcon -Rv system_u:object_r:httpd_config_t:s0 conf.d changing security context of ‘conf.d/README’ changing security context of ‘conf.d/autoindex.conf’ changing security context of ‘conf.d/userdir.conf’ changing security context of ‘conf.d/welcome.conf’ changing security context of ‘conf.d/nss.conf’ changing security context of ‘conf.d’
12. Výchozí chování Chcon na symbolických odkazech pro rekurzivní
V tomto příkladu je „config“ symbolický odkaz na adresář conf.d, jak je znázorněno níže.
# ls -lZ drwxr-xr-x. system_u:object_r:httpd_config_t:s0 conf.d lrwxrwxrwx. unconfined_u:object_r:admin_home_t:s0 config -> conf.d
Ve výchozím nastavení, když provedete rekurzivní operaci na symbolickém odkazu, nebude procházet adresářovou strukturou.
Můžete to vidět zkombinováním volby -v s -R, která ve výstupu nezobrazuje žádné názvy souborů. To znamená, že neprochází přes symbolický odkaz „config“.
# chcon -Rv -t httpd_config_t config changing security context of ‘configuration’
Na toto výchozí chování odkazuje také volba -P (velké P).
Oba následující příkazy jsou tedy naprosto stejné. Oba nebudou procházet symbolické odkazy.
# chcon -Rv -t httpd_config_t config # chcon -RPv -t httpd_config_t configuration
13. Vynutit chcon procházet specifikované symbolické odkazy pro rekurzivní
V tomto příkladu je „config“ symbolický odkaz na adresář conf.d, jak je znázorněno níže.
# ls -lZ drwxr-xr-x. system_u:object_r:httpd_config_t:s0 conf.d lrwxrwxrwx. unconfined_u:object_r:admin_home_t:s0 config -> conf.d
Když zadáte symbol v příkazu chcon, můžete přinutit chcon, aby ji prošel pomocí volby -H, jak je uvedeno níže.
Jak vidíte z následujícího výstupu, chcon prochází přes konfigurační symbolický odkaz a zpracovává všechny soubory, když jsme zadali volbu „-H“ spolu s volbou „-R“.
# chcon -RHv -t httpd_config_t config changing security context of ‘config/README’ changing security context of ‘config/autoindex.conf’ changing security context of ‘config/userdir.conf’ changing security context of ‘config/welcome.conf’ changing security context of ‘config/nss.conf’ changing security context of ‘config/ndd’ changing security context of ‘config’
14. Vynutit chcon procházet VŠECHNY symbolické odkazy pro rekurzivní
V tomto příkladu je „config“ symbolický odkaz na adresář conf.d, jak je znázorněno níže.
# ls -lZ drwxr-xr-x. system_u:object_r:httpd_config_t:s0 conf.d lrwxrwxrwx. unconfined_u:object_r:admin_home_t:s0 config -> conf.d
V následujícím příkladu v adresáři config máme adresář „ndd“, což je symbolický odkaz.
# ls -l configuration/ndd lrwxrwxrwx. 1 root root 6 Jul 8 00:13 configuration/ndd -> ../ndd
Pokud chcete, aby příkaz chcon prošel všemi symbolickými odkazy, na které narazí během rekurzivní operace, měli byste zadat volbu -L.
Následující volba zkombinovala volbu -L s volbou -R. Tím projde každý symbolický odkaz, na který narazí. Například, jak vidíte níže, toto překročilo symbolický odkaz „ndd“ a podle toho zpracovalo všechny soubory.
# chcon -RLv -t httpd_config_t configuration changing security context of ‘configuration/README’ changing security context of ‘configuration/autoindex.conf’ changing security context of ‘configuration/userdir.conf’ changing security context of ‘configuration/welcome.conf’ changing security context of ‘configuration/nss.conf’ changing security context of ‘configuration/ndd/nd1-conf’ changing security context of ‘configuration/ndd/nd2-conf’ changing security context of ‘configuration/ndd/nd3-conf’ changing security context of ‘configuration/ndd/nd-main.conf’ changing security context of ‘configuration/ndd’ changing security context of ‘configuration’
Poznámka:Když zadáváte volbu -P, nebo -H nebo -L (spolu s -R), pokud jste je z nějakého důvodu zkombinovali, vstoupí v platnost vše, co je zadáno jako poslední možnost.
15. Chcon Chcon v kořenovém adresáři pro změnu systému
Ve výchozím nastavení můžete použít chcon k rekurzivní změně kontextu SELinuxu u všech souborů ve vašem kořenovém souborovém systému, jak je uvedeno níže.
Toto se nazývá možnost nezachovat kořenový adresář (tj. výchozí chování je –no-preserve-root)
VAROVÁNÍ:Tento příkaz na vašem systému neprovádějte. Skončíte s nepoužitelným systémem. Oba následující příkazy se budou chovat úplně stejně.
chcon -Rv system_u:object_r:httpd_config_t:s0 / chcon -Rv --no-preserve-root system_u:object_r:httpd_config_t:s0 /
Nedoporučuje se to však, pokud nevíte, co děláte, protože nechcete, aby byl kontext SELinuxu pro všechny soubory ve vašem systému stejný. Pokud jste udělali chybu a nastavili nesprávný kontext souboru, možná budete chtít pochopit, jak použít příkaz restorecon k obnovení kontextu SELinux
Když zadáte volbu –no-preserve-root, nebude procházet kořenem, když ji zadáte jako volbu příkazového řádku, jak je uvedeno níže.
# chcon -Rv --preserve-root system_u:object_r:httpd_config_t:s0 / chcon: it is dangerous to operate recursively on `/' chcon: use --no-preserve-root to override this failsafe
Protože výchozí chování je nebezpečné, abyste se vyhnuli náhodným chybám, kdykoli provádíte rekurzivní volbu -R na velkém adresáři (zejména ze skriptu shellu), doporučuji vám použít –preserve-root. Tímto způsobem omylem, pokud zadáte / na konci příkazu chcon, nezmění to náhodně všechny soubory ve vašem systému.