Timothée Ravier siosm@floss.social - tim.siosm.fr/cours - github.com/travier
5e année cycle ingénieur, filière STI Option Sécurité des Systèmes Embarqués et du Cloud (2SEC)
2024 - 2025
« Tous les programmes et utilisateurs d'un système doivent fonctionner en utilisant le minimum de privilèges nécessaires pour mener à bien leurs fonctions. » --- Jerome Saltzer, Communications of the ACM
« Tous les programmes et utilisateurs d'un système doivent fonctionner en utilisant le minimum de privilèges nécessaires pour mener à bien leurs fonctions. »
--- Jerome Saltzer, Communications of the ACM
Pour mettre en place un tel modèle d'opération, il faut :
root
Si programme s'exécutant sous l'identité root est compromis, l'attaquant obtient les droits root et l'ensemble du système est compromis
What roles do DAC (file permissions), ACL and MAC (SELinux) play in Linux file security?
toto.te :
toto.te
policy_module(toto, 0.0.1) require { type httpd_t; type httpd_sys_script_t; type user_tmp_t; } type toto_data_t; files_type(toto_data_t); allow httpd_t toto_data_t:file read_file_perms; allow httpd_t toto_data_t:dir search_dir_perms; allow httpd_sys_script_t user_tmp_t:file read_file_perms;
Where does CIL play in the SELinux system?
system_u:system_r:httpd_t
user_u:object_r:user_home_t
Attribué à la création
Ne peut évoluer que lors d'un appel à execve
execve
id -Z
ps -Z
Appelés labels
stocké dans les attributs étendus du fichier (xattr)
peut être modifié à volonté
ls -Z
mkdir -Z
cp -Z
mv -Z
find -context
toto.fc :
toto.fc
/var/www/html/toto -d gen_context(system_u:object_r:toto_data_t,s0) /var/www/html/toto(/.*)? -- gen_context(system_u:object_r:toto_data_t,s0)
user:role:type
unconfined_u
system_u
user_u
staff_u
sysadm_u
unconfined_r
system_r
user_r
staff_r
sysadm_r
object_r
unconfined_t
httpd_t
user_home_t
passwd_file_t
system_t
user_t
applicationd_t
application_t
application_exec_t
application_conf_t
application_log_t
application_file_t
application_lib_t
application_tmp_t
applicationd_unit_file_t
Un objet/processus ne possède qu'un seul type mais un type peut être associé à plusieurs objets
Chaque type doit être déclaré avant utilisation :
# Sujet type init_t; type sshd_t; # Objet type sshd_exec_t; type admin_paswd_exec_t;
Chaque règle SELinux autorisant une interaction est constituée :
file
dir
process
socket
read
write
unkink
accept
SELinux Object Classes and Permissions Reference
file { open read execute }
socket { bind listen }
allow <type_source> <type_cible>:<class> { <permissions> };
# Les sujets avec le type sysadm_t peuvent exécuter # les fichiers avec le type ssh_exec_t allow sysadm_t ssh_exec_t:file { getattr read execute }; # Les sujets avec le type httpd_t peuvent lire # les fichiers avec le type http_sys_content_t allow httpd_t http_sys_content_t:file { getattr read };
# Lorsque le type user_t crée exécute le fichier ayant le type # ssh_exec_t il transite automatiquement vers user_ssh_t type_transition user_t ssh_exec_t:process user_ssh_t; # Lorsque le type user_t crée exécute le fichier ayant le type # passwd_exec_t il transite automatiquement vers passwd_t type_transition user_t passwd_exec_t:process passwd_t; # Règles supplémentaires correspondantes allow user_t ssh_exec_t : file { read getattr execute }; allow user_ssh_t ssh_exec_t : file entrypoint; allow user_r user_ssh_t : process transition;
unconfined
/etc/selinux
sestatus -v
/sys/fs/selinux/
/var/lib/selinux/
seinfo -v
auditd
/var/log/audit/audit.log
audit2allow
audit2why
type=AVC msg=audit(1515257682.718:409): avc: denied { getattr } for pid=4320 comm="httpd" path="/home/fedora/public_html/test" dev="sda1" ino=262285 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:httpd_user_content_t:s0 tclass=file permissive=0 type=AVC msg=audit(1515257956.228:527): avc: denied { setuid } for pid=4646 comm="sudo" capability=7 scontext=user_u:user_r:user_t:s0 tcontext=user_u:user_r:user_t:s0 tclass=capability permissive=0
auditallow
dontaudit
# Audite l'accès en lecture au type shadow_t par sysadm_t auditallow sysadm_t file:read shadow_t; # Ne pas auditer certains accès aux répertoires pour le type staff_t # Utilisation de - pour retirer le type security_file_type de file_type dontaudit staff_t { file_type -security_file_type }: dir { getattr search read lock};
semodule -DB : désactiver les règles dontaudit
semodule -DB
.te
.fc
.if
/usr/share/selinux/devel/Makefile
semodule --install --priority=500
sepolgen
allow
Fin : Désactivation du mode permissif
restorecon
-R
-v
-F
chcon
-u
-r
-t
--reference=file
fixfiles onboot
semanage
getsebool
setsebool
semanage boolean
sesearch
$ sesearch -v --allow -s httpd_t -c file -p read
shadow_t
$ sesearch -v --allow -t shadow_t -c file -p write
samba_enable_home_dirs
$ sesearch -v --allow -b samba_enable_home_dirs
sepolicy
selinux=0
# setenforce 0
# semanage permissive -l # semanage permissive -a myapp_t # semanage permissive -d myapp_t
/etc/selinux/config
Deux attributs supplémentaires ajoutés aux contextes de sécurité: unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
unconfined_u:unconfined_r:unconfined_t:s1-s3
s0
.
c0.c16
c0
c16
,
c21,c36,c45
c0.c16,c21,c36,c45
policy/mls
policy/mcs
policy/support/*perms_set.spt
r_file_perms
open getattr read lock ioctl
r_dir_perms
open getattr read lock search
x_file_perms
open getattr execute
Attributs : regroupe plusieurs types pour factoriser la politique :
# Déclaration d'un attribut attribute file_type; attribute application_domain_type; attribute application_exec_type; # Association d'un type (déjà déclaré) à un attribut (déjà déclaré) typeattribute shadow_t security_file_type; # Déclaration d'un type et association à un attribut (déjà déclaré) type sshd_exec_t executable_file_type;
# Les sujets avec le type sysadm_t peuvent exécuter # les fichiers dont le type a pour attribut application_exec_type allow sysadm_t application_exec_type:file { getattr read execute ... };
# Lorsque le processus labellé par user_t accède à un fichier de type tmp_t, # le type de cet objet transite automatiquement vers user_tmp_t type_transition user_t tmp_t:{ dir file lnk_file sock_file fifo_file } user_tmp_t; # Lorsque le processus labellé par sshd_t accède à un fichier de type tmp_t, # le type de cet objet transite automatiquement vers sshd_tmp_t type_transition sshd_t tmp_t:{ dir file sock_file } sshd_tmp_t; # Règles supplémentaires correspondantes allow user_t tmp_t: dir { open getattr create write }; allow user_t user_tmp_t:file rw_file_perms; # Lorsque qu'un processus user_t créé un dossier nommé .ssh dans un dossier # user_home_dir_t, il est labellé ssh_home_t type_transition user_t user_home_dir_t:dir ssh_home_t .ssh;
# Les types non privilégiés ne peuvent pas lire shadow_t # Utilisation de ~ pour la négation neverallow ~can_read_shadow_passwords shadow_t:file read;
mount
-o context=user:role:type
-o defcontext=user:role:type
-o fscontext=user:role:type
Sécurité des conteneurs
% # Confused deputy % - ... ---
% # Biba \& Bell ... % - ... ---
% # UBAC % - User Based Access Control % - ToDo % --- % # UDAC % - User Directed Access Control % - Android (partiel) % ---