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.