Podpora pro omezování uživatelů v SELinuxu se hodí, když si chcete pojistit, že uživatelé nebudou dělat, co by neměli. Jde o účinnější a snazší způsob, než jiné, které jsem zkoušel. Díky Danu Walshovi, že mi to připomněl během své přednášky SELinux in the Enterprise na letošním Red Hat Summitu.
Poznámka: Článek původně vyšel v blogu Majora Haydena jako Confine untrusted users (including your children) with SELinux.
SELinux má pět hlavních uživatelských typů (šikovný náčrt v dokumentaci Fedory):
- guest_u: – žádné X windows, žádné sudo, žádné sítě
- xguest_u: – stejný jako guest_u, ale je dovolené X a spojení jen s webovými porty (hodí se pro kiosky)
- user_u: – stejný jako xguest_u, ale síťování není omezené
- staff_u: – stejný jako user_u, ale může sudo (nikoliv však su)
- unconfined_u: – plný přístup (výchozí)
Zajímavý detail je to, že ve výchozím nastavení všichni uživatelé smějí spouštět binární aplikace ve svých domovských adresářích. Lze to vypnout pomocí několika booleovských přepínačů (které za chvilku ukážu).
Tak se pojďme podívat, jakou mají tato omezení sílu. Nejprve zobrazíme výchozí nastavení:
# semanage login -l Login Name SELinux User MLS/MCS Range Service __default__ unconfined_u s0-s0:c0.c1023 * root unconfined_u s0-s0:c0.c1023 * system_u system_u s0-s0:c0.c1023 *
Noví uživatelé nemají ve výchozím nastavení žádná omezení (viz unconfined_u). Vytvořím uživatele selinuxtest a nastavím heslo. Když se přihlásím přes ssh, je vidět, že nejsem nijak omezován:
$ id -Z unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
To jsme očekávali. Nastavme tomuto uživateli nejpřísnější omezení, tj. guest_u:
# semanage login -a -s guest_u selinuxtest
Spustím novém ssh sezení jako selinuxtest a vyzkouším některé příkazy, které by na linuxovém serveru běžně fungovaly:
$ ping google.com ping: icmp open socket: Permission denied $ curl google.com curl: (7) Failed to connect to 74.125.225.129: Permission denied $ sudo su - sudo: unable to change to sudoers gid: Operation not permitted $ ./hello Hello world $ file hello hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x5ffb25a7171c3338d6c76147cccc666ddc752dde, not stripped
Omezení síťování a sudo funguje podle očekávání. Mohl jsem však zkompilovat a spustit malou binárku v C („Hello World“). To by na některých serverech mohl být problém. Nastavíme přepínač, který tuto činnost omezí:
# getsebool -a | grep exec_content auditadm_exec_content --> on guest_exec_content --> on secadm_exec_content --> on staff_exec_content --> on sysadm_exec_content --> on user_exec_content --> on xguest_exec_content --> on # setsebool guest_exec_content off
Zkusím binárku opět spustit jako uživatel selinuxtest:
$ ./hello -bash: ./hello: Permission denied
Už nemohu v domovském adresáři nebo v /tmp spouštět binární aplikace. Přepneme uživatele selinuxtest na xguest_u:
# semanage login -a -s xguest_u selinuxtest
A znovu vyzkoušíme, co selinuxtest může:
$ curl -si google.com | head -1 HTTP/1.1 301 Moved Permanently $ ping google.com ping: icmp open socket: Permission denied
Mohu se připojit k webu, ale už nic jiného na síti nesmím. Přepneme na user_u:
# semanage login -a -s user_u selinuxtest
A testování user_u s uživatelem selinuxtest ukáže:
$ ping -c 1 google.com PING google.com (74.125.225.134) 56(84) bytes of data. 64 bytes from ord08s09-in-f6.1e100.net (74.125.225.134): icmp_seq=1 ttl=57 time=29.3 ms --- google.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 29.332/29.332/29.332/0.000 ms $ curl -si google.com | head -n1 HTTP/1.1 301 Moved Permanently $ sudo su - sudo: PERM_SUDOERS: setresuid(-1, 1, -1): Operation not permitted
Síťování otevřené, ale sudo stále nesmím. Zkusíme staff_u:
# semanage login -a -s staff_u selinuxtest
Testování staff_u dává předpokládané výsledky:
$ sudo su - [sudo] password for selinuxtest:
Nepřidal jsem uživatele selinuxtest do sudoers, takže tento příkaz selže, ale už ho mohu spustit.
Tato omezení mohou být užitečná, když na svém systému musíte řešit uživatele, kterým plně nedůvěřujete. Můžete například přidat do systému kioskového uživatele a nechat členy rodiny nebo spolupracovníky prohlížet na vašem stroji web. Lze to také využít k přidání další vrstvy ochrany na serverech sdílených mnoha uživateli, aby se uživatelům zabránilo spotřebovávat příliš moc zdrojů nebo generovat škodlivý síťový provoz.