Nemůžete dovolit, aby vás vaše selhání definovala. Musíte se nechat svými neúspěchy naučit – Barack Obama
Jednou z velkých bitev, zejména s poskytovateli řešení třetích stran, je udržování bezpečnosti našich serverů. V mnoha případech je výzvou požadavek na deaktivaci SELinuxu, aby aplikace mohla běžet hladce. Naštěstí k tomu dochází stále méně.
Ve většině těchto případů stačí analýza k nalezení správného řešení problémů nebo řešení.
SELinux je systém označování , který nám říká, že každý soubor, adresář nebo objekt v systému má odpovídající Label . Zásady řídí interakci mezi těmito prvky. Jádro tato pravidla vynucuje.
Dva nejdůležitější koncepty jsou Označení (soubory, procesy, porty atd.) a Vynucení typu (který od sebe izoluje procesy podle jejich typu).
Formát používaný štítky je:uživatel:role:typ:úroveň (volitelné).
Chcete-li zjistit aktuální konfiguraci, spusťte getenforce
a sestatus
příkazy:
# getenforce
Enforcing
# sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 32
Osvědčené postupy nám říkají, že když testujeme novou aplikaci třetí strany, měli bychom dočasně nakonfigurovat SELinux v povolovacím režimu aby bylo možné určit, které zásady nebo booleany (jednoduché řetězce, které mění chování) jsou nezbytné. Spusťte příkaz:
# setenforce 0
Prohlédnutím protokolů můžete zjistit, co SELinux vyžaduje, aby aplikace správně fungovala.
Co se mi SELinux snaží říct?
Existují pouze čtyři hlavní příčiny chyb, které generují výstrahy v SELinux:
- Označení.
- SELinux to potřebuje vědět.
- Zásady SELinux a/nebo aplikace mohou obsahovat chyby.
- Vaše informace mohou být ohroženy.
Poslední případ je způsoben úpravami provedenými za účelem útoku na zranitelná místa nebo zamezení sledování aktivit, i když v obou případech je nezbytné tato upozornění přezkoumat; z praktických důvodů se jimi prozatím nebudeme zabývat až do případného budoucího zveřejnění.
Označení
Problém s označováním :Soubory v /srv/myweb
nejsou správně označeny a nelze k nim přistupovat.
SELinux přiřadí každému prvku zapojenému do stejné služby štítek:
- Binární soubor:/usr/sbin/httpd → httpd_exec_t
- Konfigurační soubor:/etc/httpd → httpd_config_t
- Soubor protokolu:/var/log/httpd → httpd_log_t
- Adresář obsahu:/var/www/html → httpd_sys_content_t
- Spouštěcí skript:/usr/lib/systemd/system/httpd.service → httpd_unit_file_t
- Proces:/usr/sbin/httpd → httpd_t
- Porty:80/tcp, 443/tcp → httpd_t a httpd_port_t
Na webovém serveru proces běžící v httpd_t kontext může interagovat pouze s objekty s httpd_something_t štítek .
Řešení :Správné označení souborů.
Pokud znáte správný štítek, spusťte :
# semanage fcontext -a -t httpd_sys_content_t '/srv/myweb(/.*)?'
Pokud znáte soubor s ekvivalentním štítkem, spusťte:
# semanage fcontext -a -e /srv/myweb /var/www
Obnovte výchozí kontext souborů pro oba případy:
# restorecon -vR /srv/myweb
Problém s označováním :Pokud se soubor přesune, místo zkopírování si zachová původní štítek.
$ mv index.html /var/www/html/
Řešení :Správné označení souboru.
Změňte kontext na správný popisek:
# chcon -t httpd_system_content_t /var/www/html/index.html
Změna kontextu s referenčním štítkem:
# chcon --reference /var/www/html/ /var/www/html/index.html
Obnovte výchozí kontext souboru pro oba případy:
# restorecon -vR /var/www/html/
[ Také by se vám mohlo líbit: Přístup k dokumentaci zásad SELinux ]
SELinux to potřebuje vědět
Přizpůsobení služby :Webový server bude naslouchat požadavkům na portu 8585.
Chcete-li přidat požadovaný port do kontextu, spusťte:
# semanage port -a -t http_port_t -p tcp 8585
Přidání funkcí do služby :Webový server bude moci odesílat e-maily.
Chcete-li povolit funkci odesílání pošty, zapněte boolean se spuštěním:
# setsebool -P httpd_can_sendmail 1
-P
flag učiní změnu trvalou v boolean.
Chcete-li získat všechny logické hodnoty, spusťte:
# getsebool -a
Chcete-li zkontrolovat stav booleanu, spusťte:
# semanage boolean -l
Odstraňování problémů se zásadami
Některé služby nemají vytvořenou specifickou politiku obsahující dostatečná oprávnění potřebná pro práci se SELinuxem. K určení, jaká jsou tato oprávnění, je nutné nastavit permisivní režim a zkontrolovat protokoly, zda neobsahují chyby přístupu.
Služba nefunguje :wicd se používá místo služby NetworkManager ke zpracování bezdrátových připojení.
Kontrola souboru audit.log
soubor pro odepřený přístup:
# grep denied audit.log | cut -d{ -f2 | sort -n | uniq -u
create } for pid=2670 comm="wicd" scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=appletalk_socket permissive=1
create } for pid=2670 comm="wicd" scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=ax25_socket permissive=1
ioctl } for pid=2670 comm="wicd" path="socket:[52681]" dev="sockfs" ino=52681 ioctlcmd=0x8b01 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=ax25_socket permissive=1
ioctl } for pid=2670 comm="wicd" path="socket:[52684]" dev="sockfs" ino=52684 ioctlcmd=0x8b01 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=system_u:system_r:NetworkManager_t:s0 tclass=appletalk_socket permissive=1
setattr } for pid=2214 comm="wicd" name="dhclient.conf.template" dev="dm-0" ino=437068 scontext=system_u:system_r:NetworkManager_t:s0 tcontext=unconfined_u:object_r:etc_t:s0 tclass=file permissive=0
Všimněte si, že některé prvky zahrnuté v kontextech NetworkManager_t a etc_t vyžadují práva a přístup k různým souborům a vytváření soketů.
Vytvořte vynucení typu (.te) soubor s nezbytnými oprávněními pro zásady:
# vi my_wicd.te
module my_wicd 1.0;
require {
type NetworkManager_t;
type etc_t;
class ipx_socket create;
class ax25_socket { create ioctl };
class appletalk_socket { create ioctl };
class file setattr;
}
#============= NetworkManager_t ==============
allow NetworkManager_t etc_t:file setattr;
allow NetworkManager_t self:appletalk_socket { create ioctl };
allow NetworkManager_t self:ax25_socket { create ioctl };
allow NetworkManager_t self:ipx_socket create;
Chcete-li zkompilovat zásady, nainstalujte balíček selinux-policy-devel
a vygenerujte balíček zásad:
# make -f /usr/share/selinux/devel/Makefile my_wicd.pp
Chcete-li aktivovat nově vygenerovaný modul, spusťte:
# semodule -i my_wicd.pp
Chybová zpráva o zásadách :Při pokusu o přístup na můj web jsem v protokolech našel chyby SELinux.
Jedním z běžných úskalí při odstraňování chybových zpráv SELinuxu je vytváření zásad podle všech nalezených chybových zpráv. Ve většině případů, pokud setroubleshoot
Pokud je balíček nainstalován, stejné upozornění nám poskytne všechny možné možnosti řešení, od nejlepšího po nejmenší.
Chcete-li zkontrolovat setroubleshoot
výstrahy vygenerované dnes, spusťte:
# journalctl -t setroubleshoot --since today
Dec 08 13:08:33 lab.example.com setroubleshoot[12013]: failed to retrieve rpm info for /var/www/html/index.html
Dec 08 13:08:34 lab.example.com setroubleshoot[12013]: SELinux is preventing /usr/sbin/httpd from getattr access on the file /var/www/html/index.html. For complete SELinux messages run: sealert -l 011df984-4eb6-4079-98ab-cba173c4342e
Dec 08 13:08:34 lab.example.com setroubleshoot[12013]: SELinux is preventing /usr/sbin/httpd from getattr access on the file /var/www/html/index.html.
***** Plugin restorecon (99.5 confidence) suggests ************************
If you want to fix the label
/var/www/html/index.html default label should be httpd_sys_content_t.
Then you can run restorecon. The access attempt may have been stopped due to insufficient permissions to access a parent directory, in which case try to change the following command accordingly.
Do
# /sbin/restorecon -v /var/www/html/index.html
***** Plugin catchall (1.49 confidence) suggests **************************
If you believe that httpd should be allowed getattr access on the index.html file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'httpd' --raw | audit2allow -M my-httpd
# semodule -X 300 -i my-httpd.pp
V tomto případě je nejlepším možným řešením jednoduše opravit štítek souboru.
[ Zlepšete své dovednosti při správě a používání SELinuxu pomocí tohoto užitečného průvodce. ]
Sbalit
Odstraňování problémů se SELinuxem může být náročné, ale použitím zde uvedených konceptů a pochopením součástí služby můžete zvládnout jakékoli problémy, které vám přináší.
Pamatujte: