tame(2) ląduje w drzewie OpenBSD

Theo de Raadt, założyciel OpenBSD wysłał na listę mailingową tech@ opis nowego podsystemu ograniczającego uprawnienia uruchamianych procesów tame(2). Szczegółowemu opisowi podsystemu towarzyszy spory patch, który już trafił do źródeł. Przed wprowadzeniem tame(2) jedynymi mechanizmami ograniczającym uprawnienia programów były chroot(2) oraz systrace(1), z którego deweloperzy nie byli nigdy do końca zadowoleni.

Na chwilę obecną, tame(2) ujarzmia już 29 aplikacji bazowych systemu:

cat pax ps dmesg ping ping6 dc diff finger from id kdump
logger script sed signify uniq w wc whois arp authpf bgpd
httpd ntpd relayd syslogd tcpdump traceroute

Theo zwraca uwagę na dwa główne podejścia przy projektowaniu podsystemów kontrolujących uprawnienia procesów:

  1. Sposób wymagający przepisywania/dostosowywania aplikacji w szerokim zakresie poprzez dostarczanie API, które na bardzo niskim poziomie pozwala wybierać jakie operacje mogą być wykonywane w każdej chwili na dowolnym zasobie. Takie podejście stosuje capsicum(4) z FreeBSD.
  2. Określenie uprawnienia na czas życia całej aplikacji, takie podejście nie pozwala na wybiórcze stosowanie ograniczeń w czasie życia programu. Sporo aplikacji potrzebuje wysokich uprawnień w momencie inicjalizacji a następnie w trakcie normalnej pracy znaczną ich część można uciąć. Ten model był stosowany przez systrace(1), brak kontroli uprawnień w cyklu pracy aplikacji był jednym z głównych powodów, dla których nie był do końca lubiany.

Wspomniano ponadto o rozwiązaniach w stylu BPF, polegających na tworzeniu programu monitorującego proces celem wymuszania polityki bezpieczeństwa. Theo skwitował to krótko jako „szaleństwo”.

Podejście, jakie przyjęto w OpenBSD jest mieszanką modelu pierwszego i drugiego. Aplikacje będą wymagać modyfikacji, lecz całe API podsystemu tame(2) to jedna funkcja, przyjmująca flagi określające której grupy uprawnień od tego momentu aplikacja ma prawo używać. Uprawnienia można wyłącznie zawężać, nie ma opcji przywrócenia szerszego ich zakresu.

Na przykładzie łatki dla ntpd(8) widzimy wstępnie szeroki zakres uprawnień (trzy grupy wywołań systemowych)

tame(TAME_STDIO | TAME_UNIX | TAME_PROC);

następnie zostaje on zawężony do jednej:

tame(TAME_STDIO);

Prostota API zdecydowanie ułatwia modyfikacje aplikacji. W przeciwieństwie do capsicum(4) ilość modyfikacji, które należy wykonać jest zdecydowanie mniejsza, co powinno pozwolić na nakładanie takich łat również na oprogramowanie z katalogu portów przy znacznie mniejszym nakładzie pracy.

Skomentuj

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *