przechodzić przez różne części systemu • w tej prezentacji tylko – jak chcemy zabezpieczać SO – Trusted Computing Base (TCB) – izolacja i tożsamość procesów – kontrola dostępu
jesteśmy właścicielami różnych bytów (plików, procesów, …) – chcemy żeby nikt w nie nie ingerował – chcemy dokładnie powiedzieć kto ma jakie dostępy • Mandatory Access Control – jesteśmy administratorem – chcemy żeby w naszym systemie był porządek, nie anarchia – więc chcemy dać możliwość dostępu do pewnych części systemu tylko dla nas
i użytkownika) – przeskakiwanie pomiędzy trybami: wywołania systemowe, przerwania, pułapka pamięci wirtualnej – jadro ma dostęp do wszystkiego (w tym do pamięci wirtualnej procesów użytkownika) • ale proces użytkownika ma już dostęp tylko do swoich zasobów
z przestrzeni uzytkownika, np. /sbin/init, /etc/rc.d, /bin/sh, /usr/sbin/sshd, /usr/bin/passwd • wszystkie te pliki mogą być modyfikowane tylko przez roota... przypadek? nie sądzę.
thread mają wskaźniki na nią – opisuje „tożsamość” procesu: UID, RUID, GID, dodatkowe grupy, kontener... – fork() dziedziczy tę strukturę – setuid, setgid zmieniają użytkownika (przykłady: logowanie, wysyłanie poczty) – podział na aktualny UID i rzeczywisty UID – możemy chcieć mieć specjalne uprawnienia tylko na początku i na końcu chcemy wrócić do tych samych – „ostatni UID”; exec-normal, exec-setuid – seteuid
port albo załadować moduł jądra? • jak wywołanie systemowe chroot sprawdza czy ten wątek który je wywołał naprawdę ma prawa do zmiany ścieżki roota? • skąd X ma wiedzieć że użytkownik U z kontenera K ma prawo do zrobienia Y?
napisane: użytkownik root ma prawo do robienia X, Y, Z...; użytkownik z kontenera ma uprawnienia A, B, C... itd.. • niejawne – rozruch systemu ma pliki konfiguracyjny w /boot – ale właścicielem /boot jest użytkownik root... więc użytkownik /root ma niejawny przywilej do modyfikacji konfiguracji programu rozruchowego
/* Can swapon(). */ PRIV_CLOCK_SETTIME /* Can call clock_settime. */ PRIV_CRED_SETUID /* setuid. */ PRIV_JAIL_ATTACH /* Attach to a jail. */ PRIV_SCHED_SETPRIORITY /* Can set lower nice value for proc. */ PRIV_SCHED_RTPRIO /* Can set real time scheduling. */ PRIV_SCHED_SETPOLICY /* Can set scheduler policy. */ PRIV_ZFS_POOL_CONFIG /* Can configure ZFS pools. */ PRIV_VFS_MOUNT /* Can mount(). */ PRIV_VFS_STICKYFILE /* Can set sticky bit on file. */ PRIV_NET_SETIFMTU /* Set interface MTU. */ PRIV_NET_SETLLADDR /* Set interface link-level address. */ PRIV_NETBLUETOOTH_RAW /* Open raw bluetooth socket. */ PRIV_NETINET_RESERVEDPORT /* Bind low port number. */
właściciel, to sprawdzamy jego uprawnienia – jeśli nie, to priv_check • pomyśl o pliku, którego właścicielem jest rafal, a root chce się do niego dostać • następnie analogicznie sprawdzamy grupę • a na końcu pozostałych
właściciela (z taką samą „procedurą” jak w modelu UNIXowym) • następnie szukamy UID wśród użytkowników dodatkowych • potem grupy – tutaj zachowujemy się odrobinę inaczej – wystarczy dowolna grupa dająca nam uprawnienia które chcemy • na końcu pozostali