SELinux - confined users

Sat 26 June 2010 by admin

Kolejny wpis z serii SELinux w tytule. Poprzedni wpis koncentrował się na ograniczaniu działania konkretnej aplikacji, tym razem na celownik trafiają użytkownicy.

Począwszy od Fedory 9 mamy do czynienia z pojęciem confined users, są to użytkownicy, którzy przypisani mają konkretne role, a one z kolei są ściśle kontrolowane przez SELinux. Wyróżniamy w systemie Fedora 13 następujących ..confined users'':

  • guest_u
  • xguest_u
  • user_u
  • staff_u
  • sysadm_u
  • git_shell_u

Użytkownik, który mam przypisaną rolę guest_r, może się zalogować do systemu, natomiast nie może wykonywać programów w swoim katalogu domowym, nie może wykonywać programów typu suid (nie przełączy się np. poprzez su), nie może nawiązywać połączeń sieciowych. Rozszerzeniem roli guest_r jest rola xguest_r, jak nie trudno zgadnąć może zalogować się do serwera X-ów oraz może łączyć się ze światem za pomocą tylko i wyłączenie przeglądarki firefox. Reszta ról omówiona jest pod adresem [1]. Zostaje tylko rola git_shell_u i ją też zapewne łatwo zaklasyfikować, jasności nabierze po wykonaniu polecenia:

sesearch --allow -s git_shell_t

zaprezentuje ono wszystkie reguły allow dla danego typu.

Przypisanie konkretnej roli do istniejącego konta wykonać można następująco:

usermod -Z guest_u nazwa_uzytkownika

sprawdzenie czy przypisanie się powiodło:

semanage login -l

Rola guest_r jest dobrym punktem wyjścia do tworzenia nowych ról np. poprzez dodawania kolejnych uprawnień. Załóżmy, że nasz nieszczęśnik z rolą guest_r ma mieć możliwość nawiązywania połączeń na portach http (m.in. 80, 443).  Do tego celu podobnie jak w przykładzie aplikacji w poprzednim wpisie wykorzystamy tryb permissive oraz audit.log. Po próbie połączenie wygenerowany został wpis audytu na bazie którego stworzymy nowy moduł rozszerzający uprawnienia guest_r:

cat /var/log/audit/audit.log | audit2allow -m guestenh > guestenh.te

po skompilowaniu i dodaniu modułu, użytkownik z guest_r będzie mógł ustawiać połączenia do portów zdefiniowanych jako http_port_t. Należy pamiętać, że tym sposobem rozszerzyliśmy sobie niebezpiecznie std. rolę guest_r, korzystniej jest stworzyć nową rolę na bazie roli guest_r. Uczynić tą można najprościej graficzną nakładką na SELinux'a system-config-selinux.

Opisywana rola guest_u znacząco ogranicza poczynania nieuprawnionych użytkowników, można ją dowolnie rozbudowywać. Stanowi ona dobry punkt wyjściowy do stworzenia użytkownika typu kiosk ( patrz. komputery ogólnie dostępne dla wszystkich )  lub też służyć może do bezpiecznego surfowania po internecie (patrz. xguest_u) np. złośliwy kod pobrany z internetu nie będzie miał szansy się wykonać, podobnie jak kilka wydawać by się mogło std. poleceń:

[guest@fedora13 ~]$ id -Z
guest_u:guest_r:guest_t:s0
[guest@fedora13 ~]$ w
Segmentation fault (core dumped)
[guest@fedora13 ~]$ top
Segmentation fault (core dumped)
[guest@fedora13 ~]$ dmesg
klogctl: Permission denied
[guest@fedora13 ~]$ less /var/log/messages
/var/log/messages: Permission denied
[guest@fedora13 ~]$ su - 
Command not found.

[1]  http://fedoraproject.org/wiki/Test_Day:2009-10-20


Comments