În articolul anterior am menționat că o politică SELinux este ca o carte uriașă care conține regulile politicii respective. SELinux conține 3 astfel de politici: targeted, minimum și mls (voi folosi termenii în engleză, pentru o mai bună recunoaștere - peste tot veți întâlni doar acești termeni, nicidecum traducerea lor).
Tipul politicii se definește în fișierul /etc/selinux/config:
$ cat /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of these three values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted
Politica targeted este cea mai folosită politică SELinux. Politica minimum este o versiune mai simplă a politicii targeted și este, în general, folosită pe sistemele cu specificații slabe și care nu fac față politicii targeted - de exemplu, pe calculatoarele cu viteză mai mică de procesare. Politica mls este o versiune mai puternică decât cea targeted și este folosită, în general, de diferite guverne.
Toate tipurile de politică SELinux sunt conținute de directorul /etc/selinux:
$ ls -l /etc/selinux/
total 12
-rw-r--r--. 1 root root 548 Jun 10 09:39 config
-rw-r--r--. 1 root root 2425 Jun 26 23:22 semanage.conf
drwxr-xr-x. 5 root root 4096 Aug 19 17:03 targeted
După cum se observă, într-o instalare normală, obișnuită, avem instalată doar politica targeted. Pentru a vizualiza și instala unul din celelalte două pachete (minimum și mls) rulăm comenzile:
# yum list available | grep policy | grep -E 'mls|minimum' selinux-policy-minimum.noarch 3.13.1-192.el7_5.6 updates selinux-policy-mls.noarch 3.13.1-192.el7_5.6 updates # # yum install selinux-policy-minimum # # ls -l /etc/selinux total 24 -rw-r--r--. 1 root root 548 Aug 22 20:01 config drwx------. 2 root root 4096 Aug 27 20:25 final drwxr-xr-x. 7 root root 4096 Aug 27 20:25 minimum -rw-r--r--. 1 root root 2321 Apr 11 11:01 semanage.conf drwxr-xr-x. 7 root root 4096 Aug 22 20:06 targeted drwxr-xr-x. 2 root root 4096 Apr 11 11:01 tmp
Fiecare din aceste foldere conține module care sunt încărcate în mod dinamic în kernel.
Principala diferență dintre aceste 3 politici este tipul atributului de securitate care este folosit ca decident pentru determinarea accesului.
Politica targeted
Politica targeted este cel mai folosit tip de politică SELinux. Din acest motiv vine instalată în mod prestabilit, spre deosebire de celelalte două (minimum și mls) care necesită instalare manuală.
Politica targeted utilizează, în primul rând, atributul de securitate type (_t). Acest atribut este utilizat ca decident principal atunci când un obiect încearcă să acceseze un alt obiect.
Procese și domenii
Când discutăm despre procese, ne referim la atributul de securitate type (_t) ca la un domeniu, ceea ce ne permite să ne putem raporta la un grup de procese. Să luăm ca exemplu comanda de mai jos:
$ ps faxZ | grep crond unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 8513 pts/1 S+ 0:00 | | _ grep --color=auto crond system_u:system_r:crond_t:s0-s0:c0.c1023 818 ? Ss 0:00 /usr/sbin/atd -f system_u:system_r:crond_t:s0-s0:c0.c1023 824 ? Ss 0:00 /usr/sbin/crond -n
Observăm că atât procesul crond, cât și procesul atd rulează sub domeniul crond_t (atributul de securitate crond_t), ceea ce înseamnă că procesul crond poate interacționa cu procesul atd, dar nu poate interacționa cu procese care au alt domeniu/atribut de securitate (de exemplu httpd_t).
Atribute de securitate SELinux
Totul, absolut tot ceea ce se află pe o mașină Linux, are atribuit un anumit context de securitate. Așa cum am menționat într-un articol anterior, un context de securitate SELinux este constituit dintr-un șir de 4 atribute delimitate de caracterul două puncte :
. Cele 4 tipuri de atribute SELinux sunt următoarele:
- user (_u)
- rol (_r)
- tip (_t)
- sensibilitate sau nivel (_s)
Întotdeauna contextele SELinux apar sub forma următoare:
user_u:role_r:type_t:level_s
Sufixul face foarte ușor de recunoscut și de înțeles tipul fiecărui atribut.
Atributul de securitate type este, așa cum am văzut până acum, cel mai important din cei 4 pentru politica targeted, deoarece această politică decide dacă un obiect Linux (de ex. un proces) poate accesa un alt obiect Linux (de ex. un fișier de configurare) în funcție de valoarea atributului de securitate type.
Pentru exemplificare, să ne uităm un pic la contextul de securitate al procesului Apache:
# ps faxZ | grep httpd unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 27729 pts/0 S+ 0:00 _ grep --color=auto httpd system_u:system_r:httpd_t:s0 27719 ? Ss 0:00 /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 27720 ? S 0:00 _ /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 27721 ? S 0:00 _ /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 27722 ? S 0:00 _ /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 27723 ? S 0:00 _ /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 27724 ? S 0:00 _ /usr/sbin/httpd -DFOREGROUND
Iar dacă listăm conținutul directorului /etc/httpd obținem:
# ll -Z /etc/httpd drwxr-xr-x. root root system_u:object_r:httpd_config_t:s0 conf drwxr-xr-x. root root system_u:object_r:httpd_config_t:s0 conf.d drwxr-xr-x. root root system_u:object_r:httpd_config_t:s0 conf.modules.d lrwxrwxrwx. root root system_u:object_r:httpd_log_t:s0 logs -> ../../var/log/httpd lrwxrwxrwx. root root system_u:object_r:httpd_modules_t:s0 modules -> ../../usr/lib64/httpd/modules lrwxrwxrwx. root root system_u:object_r:httpd_config_t:s0 run -> /run/httpd
După cum se observă, toate procesele Apache au atributul de securitate httpd_t. În politica targeted, există o regulă pentru atributul type httpd_t care spune că toate obiectele cu httpd_t pot accesa oricare alt obiect care are unul din următoarele atribute de securitate:
httpd_modules_t httpd_sys_script_t httpd_user_content_t httpd_suexec_exec_t httpd_unit_file_t httpd_unconfined_script_t httpd_config_t httpd_t httpd_log_t httpd_cache_t httpd_tmpfs_t [...]
Această abordare înseamnă că un obiect de tipul httpd_t este oprit de la interacționare cu un obiect de alt tip (de exemplu crond_t). Altfel spus, dacă Apache/httpd este compromis, dezastrul este limitat doar la sine însuși, astfel încât celelalte obiecte (ftp, ssh, cron, etc.) NU vor fi compromise.
Pentru a ne face o idee despre cât de multe atribute de securitate type există, vom rula comanda seinfo
:
# seinfo -t | head Types: 4891 NetworkManager_etc_rw_t NetworkManager_etc_t NetworkManager_exec_t NetworkManager_initrc_exec_t NetworkManager_log_t NetworkManager_ssh_t NetworkManager_t NetworkManager_tmp_t # seinfo -t | wc -l 4893
Atributul de securitate de tip unconfined_t
După cum am văzut atât în articolele precedente, cât și un pic mai sus, există un atribut de securitate type numit unconfined_t:
$ id -Z unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 $ ps axZ | grep unconfined_t | head unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1024 ? Ss 0:00 /usr/lib/systemd/systemd --user unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1052 ? Ss 0:00 /bin/sh /etc/xdg/xfce4/xinitrc -- vt unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1239 ? Sl 0:00 /usr/libexec/imsettings-daemon unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1248 ? Ssl 0:00 /usr/libexec/gvfsd unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1261 ? Sl 0:00 /usr/libexec/gvfsd-fuse /run/user/1000/gvfs -f -o big_writes unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1387 ? Ss 0:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "startxfce4" unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1413 ? Sl 0:01 xfce4-session unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1417 ? S 0:00 /usr/lib64/xfce4/xfconf/xfconfd unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1420 ? Ss 0:00 /usr/bin/gpg-agent --sh --daemon --write-env-file /home/bobses/.cache/gpg-agent-info unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1421 ? S 0:42 xfwm4 --display :0.0 --sm-client-id 29f9608c2-787c-4626-ae6d-df2c87cfbce5
Toate obiectele de acest tip - unconfined_t - nu sunt restricționate de SELinux în niciun fel, sau, altfel spus, putem considera că SELinux este dezactivat pentru aceste obiecte. Așadar, neaplicându-se stratul de securitate MAC (Mandatory Access Control), singurele restricții care rămân asupra acestor obiecte sunt cele de tipul DAC (Discretionary Access Control).
Dacă o politică SELinux (politica targeted în cazul nostru) nu are nicio regulă scrisă pentru un anumit obiect, atunci automat obiectului respectiv i se atribuie atributul de securitate unconfined_t.
Trebuie reținut că politica targeted atribuie contextul unconfined_t tuturor conturilor de utilizator din Linux - toate conturile de utilizator adăugate cu comanda useradd
(inclusiv contul de superutilizator root) aparțin domeniului unconfined_t. Toate procesele generate de un utilizator moștenesc atributele SELinux ale utilizatorului respectiv:
Obiectele Linux cu atributul unconfined_t se pot accesa unele pe altele și, cel mai important, pot accesa orice alt obiect din sistem.
Cele povestite până acum despre obiectele cu atributul unconfined_t par să provoace o imensă gaură de securitate în sistem - în realitate lucrurile nu stau chiar așa. Asta deoarece obiectul principal al SELinux este să securizeze în primul rând procesele care au acces la internet (căci ele sunt cele mai vulnerabile atacurilor), decât să se ocupe îndeaproape de toate procesele interne. De asemenea, SELinux se ocupă de securizarea proceselor care pornesc la boot, în eventualizatea că aceste procese ar putea fi compromise.
Domeniul unconfined_t este doar o reprezentare a obiectelor Linux pentru care SELinux este dezactivat. Există mai multe domenii unconfined; o listă a acestora poate fi vizualizată folosind comanda seinfo
:
# seinfo --attribute=unconfined_domain_type -x unconfined_domain_type abrt_handle_event_t anaconda_t install_t preupgrade_t httpd_unconfined_script_t authconfig_t bacula_unconfined_script_t kernel_t boinc_project_t bootloader_t certmonger_unconfined_t cinder_api_t cinder_backup_t cinder_scheduler_t cinder_volume_t cloud_init_t condor_startd_t conman_unconfined_script_t [...]
[…] din politica SELinux care este activă în momentul respectiv (de cele mai multe ori este vorba de politica targeted, cea mai […]