# nazwa i wersja modułu module example 1.0; # wymagane typy i inne zależności require { # typ user_t - konteks procesów zwykłego użytkownika type user_t; # typ etc_t - pliki w /etc type etc_t; # typ usr_t - pliki w /usr type usr_t; # typ usr_t - pliki locale type locale_t; # typ tmp_t - pliki w /tmp type tmp_t; # typ user_devpts_t - pliki w /dev/pts/ type user_devpts_t; # terminal użytkownika (tty*) type user_tty_device_t; type getty_t; # typ sshd_t - demon sshd type sshd_t; #biblioteki i /etc/ld.so.cache type lib_t; type ld_so_cache_t; #klasy operacji, dla przykładu wymienione możliwie dużo (w praktyce wystarczy wymienić tylko te, których się chce użyć) # operacje dotyczące plików class file { ioctl read write create getattr setattr lock relabelfrom relabelto append unlink link rename execute swapon quotaon mounton execute_no_trans entrypoint execmod open }; # operacje dotyczące katalogów class dir { ioctl read write create getattr setattr lock relabelfrom relabelto append unlink link rename execute swapon quotaon mounton add_name remove_name reparent search rmdir open }; # operacje dotyczące deskryptorów plików class fd { use }; # operacje dotyczące linków symbolicznych class lnk_file { ioctl read write create getattr setattr lock relabelfrom relabelto append unlink link rename execute swapon quotaon mounton }; # operacje dotyczące urządzeń znakowych class chr_file { ioctl read write create getattr setattr lock relabelfrom relabelto append unlink link rename execute swapon quotaon mounton execute_no_trans entrypoint execmod open }; # operacje dotyczące urządzeń blokowych class blk_file { ioctl read write create getattr setattr lock relabelfrom relabelto append unlink link rename execute swapon quotaon mounton open }; # operacje dotyczące gniazd w systemie plików (aka unix-socket) class sock_file { ioctl read write create getattr setattr lock relabelfrom relabelto append unlink link rename execute swapon quotaon mounton }; # operacje dotyczące kolejek fifo class fifo_file { ioctl read write create getattr setattr lock relabelfrom relabelto append unlink link rename execute swapon quotaon mounton open }; # operacje dotyczące gniazd sieciowych class socket { ioctl read write create getattr setattr lock relabelfrom relabelto append bind connect listen accept getopt setopt shutdown recvfrom sendto recv_msg send_msg name_bind }; # operacje dotyczące gniazd sieciowych TCP class tcp_socket { ioctl read write create getattr setattr lock relabelfrom relabelto append bind connect listen accept getopt setopt shutdown recvfrom sendto recv_msg send_msg name_bind connectto newconn acceptfrom node_bind name_connect }; # operacje dotyczące gniazd sieciowych UDP class udp_socket { ioctl read write create getattr setattr lock relabelfrom relabelto append bind connect listen accept getopt setopt shutdown recvfrom sendto recv_msg send_msg name_bind node_bind }; # operacje dotyczące surowych gniazd sieciowych class rawip_socket { ioctl read write create getattr setattr lock relabelfrom relabelto append bind connect listen accept getopt setopt shutdown recvfrom sendto recv_msg send_msg name_bind node_bind }; # operacje dotyczące systemów plików class filesystem { mount remount unmount getattr relabelfrom relabelto transition associate quotamod quotaget }; # operacje dotyczące bezpieczeństwa (zarządzanie SELinux-em) class security { compute_av compute_create compute_member check_context load_policy compute_relabel compute_user setenforce setbool setsecparam setcheckreqprot }; # operacje dotyczące procesów class process { fork transition sigchld sigkill sigstop signull signal ptrace getsched setsched getsession getpgid setpgid getcap setcap share getattr setexec setfscreate noatsecure siginh setrlimit rlimitinh dyntransition setcurrent execmem execstack execheap setkeycreate setsockcreate }; # atrybut domain (typ jest domeną procesu) attribute domain; # atrybut entry_type (typ jest punkem przejścia do typu) attribute entry_type; # atrybut exec_type (typ pliku wykonywalnego) attribute exec_type; # atrybut file_type (dany typ jest file_contextem) attribute file_type; } #deklaracje typów (nowych) # typ nadany plikowi /tmp/example-file type example_file_t; typeattribute example_file_t file_type; # domena procesu example type example_t; typeattribute example_t domain; # domena pliku wykonywalnego /bin/example (kopia /bin/cat) # - jest to plik wykonywalny # - ten program ma prawo przejścia do innego typu (zgodnie z dalszymi regułami) type example_exec_t; typeattribute example_exec_t exec_type; typeattribute example_exec_t entry_type; # rola user_r ma prawo utworzyć proces o konteście example_t role user_r types example_t; # Poniższy zestaw zasad pozwala zwykłemu użytkownikowi (user_t) wykonać program # /bin/example (example_exec_t), który ma prawo zmienić kontekst user_t->example_t. # Następnie proces w konteście example_t może czytać /tmp/example-file # (example_file_t), oraz wysłać sygnał SIGCHLD do user_t (wymagane dla # poprawnego działania). # pozwól procesowi w kontekście user_t wykonać plik o kontekście example_exec_t allow user_t example_exec_t:file { getattr execute read open }; # pozwól procesowi użytkownika zmienić kontekst na example_t, dziedziczyć obsługę sygnałów, limitów allow user_t example_t:process { transition siginh rlimitinh noatsecure }; # do kontekstu example_t można wejść (tylko) programem o file_context example_exec_t allow example_t example_exec_t:file { entrypoint execute }; # zdefiniuj przejście między typami type_transition user_t example_exec_t:process example_t; # pozwól kontekstowi example_t czytać plik o kontekście example_file_t allow example_t example_file_t:file { getattr read open }; # pozwól example_t korzystać z filedeskryptorów user_t/sshd_t (stdin/stdout/stderr) allow example_t user_t:fd use; allow example_t sshd_t:fd use; # dostęp do plików w /etc (wymagane przez glibc) allow example_t etc_t:dir search; allow example_t etc_t:file { getattr read }; # dostęp do /dev/pts/ - aby mieć dostęp do terminala (stdout) allow example_t user_devpts_t:chr_file { read write getattr }; # dostęp do tty allow example_t getty_t:fd use; allow example_t user_tty_device_t:chr_file { read write getattr }; #dostęp do bibliotek allow example_t ld_so_cache_t:file { getattr read }; allow example_t lib_t:dir { search getattr read }; allow example_t lib_t:file { getattr read execute }; allow example_t lib_t:lnk_file read; allow example_t usr_t:dir { read search }; #dostęp do locale allow example_t locale_t:dir search; allow example_t locale_t:file { read getattr }; allow example_t locale_t:lnk_file read; #pliki tymczasowe allow example_t tmp_t:dir search; # pozwól wysłać SIGCHLD allow example_t user_t:process sigchld;