Vlastník souboru (nebo root) může oprávnění libovolně měnit a tak delegovat práva na jiné uživatele.
chmod, chgrp, chown, čtení přes ls nebo statrwxr-xr-- nebo osmičkově 0754setfacl, getfacl (nemusí být ve výchozí instalaci)ls -l u módu souborů s ACL zobrazuje +příklad:
$ ls -l /home/paradise
drwxrwxr-t+ 2 root paradise 4096 30. čec 10.43 /home/paradise
$ getfacl /home/paradise
getfacl: Removing leading '/' from absolute path names
# file: home/paradise
# owner: root
# group: paradise
# flags: --t
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:group:paradise:rwx
default:mask::rwx
default:other::r-xJakýkoli program spuštěný uživatelem může cokoli, na co má uživatel právo; například číst soukromé klíče nebo přepisovat uživatelovy dokumenty. Problém je to zvlášť u démonů běžících pod rootem a vystavených veřejné síti.
read, append, lock, execute). (níže).staff_u nebo speciální system_u.user_r – obyčejný uživatelsysadm_r – administrátor (navazuje se na něj více práv)system_r – démony apod.object_r – „dummy“ role pro objektybin_t – binárky;shell_exec_t – binárky shellů;lib_t – knihovnyhttp_port_t – port TCP č. 80httpd_t, sshd_key_t, xscreensaver_tuživatel_u:role_r:typ_t.„Doména“ se v textech používá občas pro typ a občas pro štítek, ale vždy v souvislosti se subjekty, nikoli objekty.
SELinux primárně uděluje či zamítá přístup v závislosti na typech. Každé přístupové pravidlo říká, jaký typ subjektu (např. user_t, skuteční běžní uživatelé) může s jakými typy objektů (např. lib_t, knihovny a adresáře s knihovnami) provádět jaké akce. Například:
$ sesearch -s user_t -t lib_t -A
allow domain lib_t:dir { getattr ioctl lock open read search };
allow domain lib_t:file { execute getattr ioctl map open read };
allow domain lib_t:lnk_file { getattr read };
…
Název za dvojtečkou je tzv. třída (class) a odpovídá různým druhům souborů, ale třeba i soketů.
Linuxové distribuce poskytují hotové politiky (sady pravidel) týkající se různých serverů, démonů, ale i aplikací, které jsou v distribuci dostupné. Systémové politiky mají podobu binárního souboru a pro jejich změnu je nutné si opatřit soubor zdrojový. Není nutné upravovat systémovou politiku; patrně nám bude stačit vyrobit si nový modul s politikou, který následně do systému zavedeme.
Když je SELinux zapnutý, řídí se jeho politikami všechno. Přístupy, které nejsou v souladu s politikou, jsou zamítnuty. Takový stupeň restrikce ale není vždy schůdný – chceme třeba omezovat jen služby vystavené do sítě a pro zbytek systému bychom rádi, aby SELinux „nebyl“. Pro tento účel existuje několik nedotčených (unconfined) domén, např. unconfined_t, které jsou normálními SELinuxovými doménami, ale mají tolik práv, že vlastně nic neomezují.
CONFIG_AUDIT a CONFIG_SECURITY_SELINUX.selinux-basics selinux-policy-default auditd setools;selinux-activate (nastaví GRUB a PAM a naplánuje přeštítkování);getenforce má vypsat „Permissive“.selinux=0 v GRUBu./etc/selinux/config se dá nastavit, která systémová politika se používá (pokud jich je k disposici více, např. zda omezovat pouze démony nebo všechny procesy), ale nemělo by být potřeba měnit./var/log/audit/audit.log), ale akce se stane. Vhodné pro ladění.seinfosestatusps -Zls -Z, vypisuje i statgetenforcesetenforce {0|1}ausearch -m avc --start recentchcon -t novytyp_t
restorecontouch /.autorelabel && rebootVlastní pravidla můžeme do SELinuxu dostat následujícím postupem:
selinux-policy-dev)./usr/share/selinux/devel/Makefile) do svého vývojového adresáře.my_policy.te pro politiku my_policy).make; tím se vytvoří modul s politikou my_policy.pp.semodule -i my_policy.ppPokud něco v politice chybí (a např. ani nemůžeme změnit štítek u souboru na náš nový typ), dají se příslušná pravidla vyrobit přímo z logu:
tail -3 /var/log/audit/audit.log | audit2allow -r
Do politiky bude potřeba přidat spoustu pravidel zajišťujících:
unconfined_t na náš nový typ;unconfined_t;unconfined_r náš nový typ)./dev/null a případně dalším speciálním souborům.Může se hodit: seznam udělitelných oprávnění.
Příklad pravidel v souboru local_policy.te:
# Jméno a verse modulu
policy_module( local_policy, 1.0.0 )
# Které externí typy, role, třídy apod. se používají
require {
type unconfined_t;
type fs_t;
type root_t;
role unconfined_r;
}
type mytype_t;
role unconfined_r types { mytype_t };
# `getattr`, `relabelto` a `associate`, aby vůbec šlo přeštítkovat.
allow unconfined_t mytype_t : dir { getattr relabelto open create read write search add_name remove_name rmdir };
allow unconfined_t mytype_t : file { getattr relabelto open read write execute link unlink };
allow unconfined_t mytype_t : file { getattr relabelto open read write execute link unlink };
allow mytype_t fs_t : filesystem { associate };
# Když unconfined spustí binárku s `mytype_t`, poběží proces v `mytype_t`
type_transition unconfined_t mytype_t : process mytype_t;
allow mytype_t self : file { entrypoint read execute };
allow unconfined_t mytype_t : process { transition rlimitinh siginh };
# Umožní procesům v doméně `mytype_t` procházet `/`
# Podobně je potřeba přidat typy dalších systémových adresářů.
allow mytype_t root_t : dir { search }
# Pro binárky je potřeba přidat další oprávnění, aby se daly dynamicky
# přilinkovat knihovny, používat konsoli (vč. popisovačů souborů napojených na
# SSH) a aby binárka mohla číst a mapovat do paměti sama sebe.
# Potřebná oprávnění se dají vytahat z logu auditu jako porušení politiky.
Nadto se dá přidat ještě soubor local_policy.fc, který říká, kterým souborům se mají přidělit které štítky při automatickém oštítkování. Například:
/root/my_untrusted_binary -- unconfined_u:object_r:mytype_t:s0
/root/some_dir(/.*)? unconfined_u:object_r:mytype_t:s0
# `--` je nepovinný typ souboru (jako v `ls`: obyčejné `--`, adresáře `-d` apod.)
# `s0` je úroveň pro víceúrovňové politiky; nebudeme používat
deny zakazovat přístup i v režimu complain./var/log/audit/audit.log, případně /var/log/messages.CONFIG_AUDIT a CONFIG_SECURITY_APPARMOR.apparmor=1 security=apparmor, případně jádro se volbami mající stejný výsledek.auditd (v Debianu nemusí)./etc/apparmor.d/.apparmor-profiles-extra) mohou být po instalaci jinde a je potřeba je do výše zmíněného adresáře překopírovat a aktivovat.Příklad: /etc/apparmor.d/bin.ping z distribuce:
#include <tunables/global>
profile ping /{usr/,}bin/{,iputils-}ping flags=(complain) {
#include <abstractions/base>
#include <abstractions/consoles>
#include <abstractions/nameservice>
capability net_raw,
capability setuid,
network inet raw,
network inet6 raw,
/{,usr/}bin/{,iputils-}ping mixr,
/etc/modules.conf r,
#include <local/bin.ping>
}r čteníw/a zápis/přípism spustitelné mapování do pamětik zamykání_x různé režimy spustitelnosti (zde ix = bez změny oprávnění)#include umožňuje sdílet pravidla napříč profily, např #include <abstractions/perl> zpřístupní pro čtení perlové moduly.Formát je popsán v man 5 apparmor.d, ale k jednoduchému vytváření bez nutnosti psát profil od začátku dobře poslouží interaktivní nástroj (níže).
Může být zapotřebí nainstalovat balíček apparmor-utils nebo podobný.
aa-statussystemctl <akce> apparmor
aa-teardownapparmor_parser
apparmor_parser -r /etc/apparmor.d/<jméno>aa-enforce /bin/ping, podobně aa-complain a aa-disableps -Zaa-notifyaa-genprof <binárka>
aa-logprofman 2 chmodman 2 chownman 5 aclman 5 apparmor.d