A Linux OS phenomenal success on embedded, mobile devices and servers can largely be attributed to the high level of security in its kernel, associated services, and applications. But if at the architecture of the Linux kernel, you won't find a designated area for security as such. So where does the Linux security subsystem hide and what does it comprise?
Background of Linux Security Modules and SELinux
Security Enhanced Linux is a set of rules and access mechanisms based on mandatory and role-based access models, designed to protect Linux systems from potential threats and address the shortcomings of Discretionary Access Control (DAC) — the traditional Unix security system. The project originated within the United States National Security Agency, primarily developed by contractors from Secure Computing Corporation and MITRE, as well as several research laboratories.

Linux Security Modules
Linus Torvalds made several comments on the new developments from the NSA, so they could be included in the mainline of the Linux kernel. He described a general environment with a set of hooks to manage object operations and a set of protective fields in kernel data structures to store corresponding attributes. This environment can then be used by loadable kernel modules to implement any desired security model. LSM fully integrated into the Linux kernel v2.6 in 2003.
The LSM framework includes protective fields in data structures and function call hooks at critical points in the kernel code to manage them and enforce access control. It also adds functions for registering security modules. The interface /sys/kernel/security/lsm contains a list of active modules in the system. LSM hooks are stored in lists that are invoked in the order specified in CONFIG_LSM. Detailed documentation on the hooks is included in the header file include/linux/lsm_hooks.h.
The LSM subsystem allowed for the complete integration of SELinux of the same version of the stable Linux kernel v2.6. Almost immediately, SELinux became the de facto standard for the secured Linux environment and became part of the most popular distributions: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.
SELinux Glossary
- Identity A SELinux-felhasználó nem ugyanaz, mint a megszokott Unix/Linux felhasználói azonosító, bár együtt élhetnek ugyanazon a rendszeren, de lényegileg teljesen különböznek. Minden standard Linux-fióknak megfelelhet egy vagy több a SELinux rendszerében. A SELinux identitás a biztonsági kontextus általános részét képezi, amely meghatározza, hogy milyen domainekbe lehet belépni és melyekbe nem.
- Domainek A SELinux rendszerében a domain egy alany végrehajtási kontextusa, azaz a folyamat. A domain közvetlenül meghatározza a folyamat hozzáférését. A domain lényegében egy lista arról, hogy a folyamatok mit tehetnek, vagy milyen műveleteket hajthatnak végre különféle típussal. Néhány példa a domainekre: sysadm_t a rendszergazdálkodáshoz és user_t, amely egy normál nem privilégizált felhasználói domain. Az init rendszerindító a init_t domainekben indul, míg a named folyamat a named_t domainekben fut.
- Szerepek A közvetítő, amely a domainek és a SELinux felhasználók között áll. A szerepek meghatározzák, hogy a felhasználó mely domainekhez tartozhat, és milyen típusú objektumokhoz férhet hozzá. Az ilyen hozzáférés-szabályozási mechanizmusok megelőzik a jogosultságok emelésére irányuló támadásokat. A szerepek be vannak ágyazva a SELinux-ban alkalmazott Role Based Access Control (RBAC) biztonsági modellbe.
- Típusok A Type Enforcement lista attribútuma, amely egy objektumnak van rendelve, és meghatározza, ki férhet hozzá. Hasonló a domain meghatározásához, a különbség annyi, hogy a domain a folyamatra vonatkozik, míg a típus olyan objektekre, mint a könyvtárak, fájlok, socketek stb.
- Alanyok és objektumok A folyamatok alanyok, és egy adott kontextusban, vagy biztonsági domainben indulnak. Az operációs rendszer erőforrásai: fájlok, könyvtárak, socketek stb., objektumok, amelyekhez egy adott típus tartozik, más szóval - titkosítási szint.
- SELinux irányelvek A SELinux védi a rendszert, és különféle politikákat alkalmaz. A SELinux politika meghatározza a felhasználók hozzáférését a szerepekhez, a szerepek hozzáférését a domainekhez, és a domainek hozzáférését a típusokhoz. Először a felhasználó engedélyt kap, hogy szerepet szerezzen, majd a szerep engedélyt kap a domainekhez való hozzáférésre. Végül a domainnek csak néhány típusú objektumhoz lehet hozzáférése.
LSM és SELinux architektúra
Bár az LSM elnevezése nem teljesen a Linux betölthető moduljaira vonatkozik, a SELinux-hoz hasonlóan közvetlenül be van ágyazva a kernelbe. Bármilyen módosítás az LSM forráskódjában új kernel fordítást igényel. A megfelelő opciót be kell kapcsolni a kernel beállításaiban, különben az LSM kód nem aktiválódik a rendszerindítás után. De még ebben az esetben is aktiválható az operációs rendszer betöltő opciójával.

LSM ellenőrzési verem
Az LSM alapvető funkciókban található horgokkal van ellátva, amelyek relevánsak lehetnek az ellenőrzések szempontjából. Az LSM egyik fő jellemzője, hogy verem alapú felépítéssel rendelkezik. Így a standard ellenőrzések továbbra is végrehajtódnak, és minden LSM réteg csak további irányítási és ellenőrzési elemeket ad hozzá. Ez azt jelenti, hogy a tiltás nem vonható vissza. Ezt az ábrán láthatjuk: ha a rutinszerű DAC ellenőrzéseknek a végeredménye megtagadás, akkor az LSM horgokhoz be sem jutunk.
A SELinux átvette a Flask biztonsági architektúráját a Fluke kutatási operációs rendszerből, különös tekintettel a legkisebb jogosultságok elvére. Ennek a koncepciónak a lényege, ahogy a neve is sugallja, abban rejlik, hogy a felhasználónak vagy folyamatnak csak azokat a jogokat adja meg, amelyek a szándékozott intézkedések végrehajtásához szükségesek. Ez az elv a kötelező típustípusos hozzáférés alkalmazásával valósul meg, így a SELinux-ban a hozzáférési ellenőrzés a domain => típus modellje alapján történik.
A kötelező típustípusos hozzáférés révén a SELinux sokkal jelentősebb elérhetőség-szétválasztási lehetőségekkel rendelkezik, mint a hagyományos DAC modell, amely az Unix/Linux operációs rendszerekben használatos. Például lehet korlátozni a hálózati port számát, amelyen az ftp szerver hallgat, engedélyezni a fájlok írását és módosítását egy adott mappában, de nem engedélyezni azok törlését.
A SELinux fő komponensei a következők:
- Politika Kényszerítő Szerver — A hozzáférés-ellenőrzés szervezésének fő mechanizmusa.
- A rendszer biztonsági politikáinak adatbázisa.
- Kapcsolat az LSM eseményelhárítójával.
- Selinuxfs — Pseudofájl rendszer, hasonló a /proc-hoz, és a /sys/fs/selinux-ra van csatolva. Dinamikusan töltődik ki a Linux kernel által futás közben, és tartalmazza a SELinux állapotáról szóló információkat.
- Hozzáférési Vektor Cache — Teljesítménynövelő segédmechanizmus.

A SELinux működési elve
Mindez így működik.
- Egy subjektum, SELinux terminológiájában, engedélyezett műveletet hajt végre egy objektumon a DAC ellenőrzés után, ahogy azt a felső képen látható. Ez a végrehajtási kérés a LSM eseménykezelőhöz kerül.
- Ebből a kérés a subjektum és az objektum biztonsági kontextusával együtt továbbítódik a SELinux Abstraction and Hook Logic modulhoz, amely felelős az LSM-mel való interakcióért.
- A hozzáférés eldöntésének példánya a Policy Enforcement Server, amelyhez adatokat kap a SELinux AnHL-tól.
- A hozzáférés vagy a tilalom eldöntéséhez a Policy Enforcement Server a leggyakrabban használt szabályok gyorsítótárához (Access Vector Cache, AVC) fordul.
- Ha a megfelelő szabályra vonatkozó döntés nem található a gyorsítótárban, a kérés továbbítódik a biztonsági politikák adatbázisába.
- A keresési eredmény az adatbázisból és az AVC-ből visszatér a Policy Enforcement Serverhez.
- Ha a talált politika összhangban áll a kért művelettel, akkor a művelet engedélyezésre kerül. Ellenkező esetben a művelet tiltható.
SELinux beállításainak kezelése
A SELinux három üzemmódban működik:
- Enforcing — A biztonsági politikák szigorú betartása.
- Permissive — A korlátozások megsértése megengedett, erről a naplóban bejegyzés készül.
- Disabled — A biztonsági politikák nem érvényesek.
A SELinux aktuális üzemmódjának ellenőrzéséhez használja a következő parancsot.
[admin@server ~]$ getenforce
PermissiveAz üzemmód megváltoztatása a rendszer újraindítása előtt, például enforcing-re állítva, vagy 1-re. A permissive paraméter numerikus kódja 0.
[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #ugyanaz
Az üzemmódot a fájl szerkesztésével is megváltoztathatja:
[admin@server ~]$ 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=megerősített
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targete
A setenfoce-hoz képest a különbség az, hogy a rendszerinduláskor a SELinux üzemmód a konfigurációs fájl SELINUX paraméterének értékének megfelelően kerül beállításra. Ezenkívül a változtatások (enforcing disabled) csak a /etc/selinux/config fájl szerkesztésével lépnek érvénybe és a rendszer újraindítást igényelnek.
Rövid állapotjelentés megtekintése:
[admin@server ~]$ sestatus SELinux állapot: engedélyezve
SELinuxfs csatolás: /sys/fs/selinux
SELinux gyökér könyvtár: /etc/selinux
Betöltött politika neve: célzott
Jelenlegi mód: megengedő
Mód a konfigurációs fájlból: érvényesítő
Politika MLS állapot: engedélyezve
Politika deny_unknown állapot: engedélyezett
Max kernel politika verzió: 31
A SELinux attribútumainak megtekintéséhez néhány alapértelmezett segédeszköz a -Z paramétert használja.
[admin@server ~]$ ls -lZ /var/log/httpd/
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200920
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200927
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201004
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201011
[admin@server ~]$ ps -u apache -Z
LABEL PID TTY TIME CMD
system_u:system_r:httpd_t:s0 2914 ? 00:00:04 httpd
system_u:system_r:httpd_t:s0 2915 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 2916 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 2917 ? 00:00:00 httpd
...
system_u:system_r:httpd_t:s0 2918 ? 00:00:00 httpdAz ls -l szokásos kimenetéhez képest itt több, a következő formátumú, kiegészítő mező található:
:::
Az utolsó mező valami titkossági címkét jelöl, és két elem kombinációjából áll:
- s0 — jelentőség, váltig feltüntetik lowlevel-highlevel intervallumként.
- c0, c1… c1023 — kategória.
Hozzáférési konfiguráció módosítása
Használja a semodule-t a SELinux modulok betöltésére, hozzáadására és eltávolítására.
[admin@server ~]$ semodule -l |wc -l #a modulok listája
408
[admin@server ~]$ semodule -e abrt #enable - modul aktiválása
[admin@server ~]$ semodule -d accountsd #disable - modul letiltása
[admin@server ~]$ semodule -r avahi #remove - modul eltávolításaElső parancs semanage login összekapcsolja a SELinux felhasználót az operációs rendszer felhasználójával, a második a lista megjelenítésére szolgál. Végül az utolsó parancs -r kapcsolóval eltávolítja a SELinux felhasználók és az OS fiókok közötti kapcsolatot. Az MLS/MCS tartomány szintaxisa az előző szakaszban található.
[admin@server ~]$ semanage login -a -s user_u karol
[admin@server ~]$ semanage login -l Bejelentkezési név SELinux felhasználó MLS/MCS tartomány
__default__ unconfined_u s0-s0:c0.c1023 *
root unconfined_u s0-s0:c0.c1023 *
system_u system_u s0-s0:c0.c1023 *
[admin@server ~]$ semanage login -d karol
A parancs semanage user a SELinux felhasználók és szerepek közötti kapcsolatok kezelésére használatos.
[admin@server ~]$ semanage user -l
Címkézés MLS/ MLS/
SELinux Felhasználó Előtag MCS Szint MCS Tartomány SELinux Szerepek
guest_u user s0 s0 guest_r
staff_u staff s0 s0-s0:c0.c1023 staff_r sysadm_r
...
user_u user s0 s0 user_r
xguest_u user s0 s0 xguest_r
[admin@server ~]$ semanage user -a -R 'staff_r user_r'
[admin@server ~]$ semanage user -d test_uA parancs paraméterei:
- -a szerepkör-kapcsolat felhasználói bejegyzés hozzáadása;
- -l a felhasználók és szerepek kapcsolati listája;
- -d felhasználói bejegyzés törlése a szerepkör kapcsolatról;
- -R a felhasználóhoz kötött szerepek listája;
Fájlok, portok és logikai értékek
Minden SELinux modul egy fájlok címkézésére szolgáló szabálykészletet biztosít, de lehetőség van saját szabályok hozzáadására is, ha szükséges. Például, ha szeretnénk engedélyezni a webkiszolgáló számára a hozzáférést a /srv/www mappához.
[admin@server ~]$ semanage fcontext -a -t httpd_sys_content_t "\/srv\/www(\/.*)?
[admin@server ~]$ restorecon -R \/srv\/www\/Az első parancs új címkezési szabályokat regisztrál, míg a második visszaállítja, pontosabban beállítja a fájltípusokat a jelenlegi szabályoknak megfelelően.
Hasonlóképpen, a TCP/UDP portok olyan módon vannak megjelölve, hogy csak a megfelelő szolgáltatások képesek hallgatni azokat. Például ahhoz, hogy a webkiszolgáló hallgathassa a 8080-as portot, a következő parancsot kell végrehajtani.
[admin@server ~]$ semanage port -m -t http_port_t -p tcp 8080Jelentős számú SELinux modul rendelkezik olyan paraméterekkel, amelyek boolean értékeket vehetnek fel. Az ilyen paraméterek teljes listáját a getsebool -a paranccsal lehet megtekinteni. A boolean értékeket a setsebool paranccsal lehet módosítani.
[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_cgi --> on
[admin@server ~]$ setsebool -P httpd_enable_cgi off
[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_homedirs --> off
Gyakorlati példa, hozzáférni a Pgadmin-web felülethez
Nézzük meg a gyakorlatból vett példát, RHEL 7.6-on telepítettük a pgadmin4-web-et a PostgreSQL adatbázisok adminisztrálására. Átmentünk egy rövid a pg_hba.conf, postgresql.conf és config_local.py konfigurálásával, beállítottuk a mappák jogosultságait, telepítettük a hiányzó Python modulokat pip által. Minden készen áll, indítsuk el, és kapjuk meg 500 Internal Server error.

Kezdjük a tipikus gyanúsítottakkal, ellenőrizzük a /var/log/httpd/error_log-ot. Ott van néhány érdekes bejegyzés.
[timestamp] [core:notice] [pid 23689] Az SELinux szabályzat engedélyezve van; az httpd a system_u:system_r:httpd_t:s0 kontextussal fut.
...
[timestamp] [wsgi:error] [pid 23690] [Errno 13] Hozzáférés megtagadva: '\/var\/lib\/pgadmin'
[timestamp] [wsgi:error] [pid 23690]
[timestamp] [wsgi:error] [pid 23690] Javaslat: Lehet, hogy kézzel kell beállítani a jogosultságokat a
[timestamp] [wsgi:error] [pid 23690] \/var\/lib\/pgadmin mappában, hogy az apache írni tudjon oda.
Ezen a ponton sok Linux adminisztrátor számára vonzó lehetőség keletkezik a setenforce 0 parancs futtatása, hogy ezzel véget vessenek a problémának. Bevallom, az első alkalommal én is így tettem. Ez persze megoldás, de messze nem a legjobb.
A SELinux bonyodalmainak ellenére felhasználóbarát is lehet. Elég, ha telepítjük a setroubleshoot csomagot és megnézzük a rendszer naplót.
[admin@server ~]$ yum install setroubleshoot
[admin@server ~]$ journalctl -b -0
[admin@server ~]$ service restart auditd
Figyeljen arra, hogy az auditd szolgáltatást pontosan így kell újraindítani, nem pedig a systemctl segítségével, annak ellenére, hogy a systemd elérhető az operációs rendszerben. A rendszer naplóban jelzésre kerül nemcsak a blokkolás ténye, hanem az oka és a tilalom megkerülésének módja.

Futtatjuk ezeket a parancsokat:
[admin@server ~]$ setsebool -P httpd_can_network_connect 1
[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1
Ellenőrizzük a pgadmin4-web weboldal elérhetőségét, minden működik.
Forrás: habr.com
