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 stat
rwxr-xr--
nebo osmičkově 0754
setfacl
, 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-x
Jaký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_t
už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í.seinfo
sestatus
ps -Z
ls -Z
, vypisuje i stat
getenforce
setenforce {0|1}
ausearch -m avc --start recent
chcon -t novytyp_t
restorecon
touch /.autorelabel && reboot
Vlastní 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.pp
Pokud 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-status
systemctl <akce> apparmor
aa-teardown
apparmor_parser
apparmor_parser -r /etc/apparmor.d/<jméno>
aa-enforce /bin/ping
, podobně aa-complain
a aa-disable
ps -Z
aa-notify
aa-genprof <binárka>
aa-logprof
man 2 chmod
man 2 chown
man 5 acl
man 5 apparmor.d