Una de les raons del gran èxit Linux El sistema operatiu en dispositius mòbils integrats i servidors té un nivell de seguretat força alt per al nucli, els serveis associats i les aplicacions. Però si a l'arquitectura del nucli Linux, aleshores no hi pots trobar cap caixa que sigui responsable de la seguretat com a tal. On s'amaga el subsistema de seguretat? Linux i en què consisteix?
prehistòria Linux Mòduls de seguretat i SELinux
Seguretat millorada Linux és un conjunt de regles i mecanismes d'accés basats en models d'accés obligatoris i basats en rols per protegir els sistemes Linux contra possibles amenaces i solucions per als defectes del Control d'Accés Discrecional (DAC), un sistema de seguretat tradicional d'Unix. El projecte es va originar dins de l'Agència de Seguretat Nacional dels Estats Units, i el desenvolupament va ser dut a terme principalment pels contractistes Secure Computing Corporation i MITRE, així com per diversos laboratoris de recerca.

Linux Mòduls de seguretat
Linus Torvalds va fer diversos comentaris sobre els nous desenvolupaments de la NSA per tal que es poguessin incloure al nucli principal. LinuxVa descriure un entorn comú, amb un conjunt d'interceptors per gestionar les operacions amb objectes i un conjunt de camps de protecció en estructures de dades del nucli per emmagatzemar els atributs corresponents. Aquest entorn podia ser utilitzat per mòduls del nucli carregables per implementar qualsevol model de seguretat desitjat. LSM es va integrar completament al nucli. Linux versió 2.6 del 2003.
El marc LSM inclou camps de guàrdia en estructures de dades i crides a funcions d'intercepció en punts crítics del codi del nucli per manipular-los i realitzar control d'accés. També afegeix una funcionalitat per registrar mòduls de seguretat. La interfície /sys/kernel/security/lsm conté una llista de mòduls actius al sistema. Els ganxos LSM s'emmagatzemen en llistes que es criden en l'ordre especificat a CONFIG_LSM. La documentació detallada sobre els ganxos s'inclou al fitxer de capçalera include/linux/lsm_hooks.h.
El subsistema LSM va permetre la integració completa de SELinux la mateixa versió del nucli estable Linux v2.6. Literalment immediatament SELinux s'ha convertit en l'estàndard de facto per a entorns segurs Linux i va passar a formar part de les distribucions més populars: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.
Glossari SELinux
- Identitat — Usuari de SELinux no és el mateix que l'Unix habitual/Linux ID d'usuari, poden coexistir al mateix sistema, però són completament diferents en essència. Cada compte estàndard Linux pot coincidir amb un o més a SELinuxIdentitat SELinux és una part integral del context de seguretat general que determina a quins dominis es pot accedir i a quins no.
- Dominis — Al SELinux Un domini és el context d'execució d'un subjecte, és a dir, un procés. Un domini determina directament l'accés que té un procés. Un domini és essencialment una llista del que poden fer els processos o de quines accions pot realitzar un procés amb diferents tipus. Alguns exemples de dominis són sysadm_t per a l'administració del sistema i user_t, que és un domini d'usuari normal sense privilegis. El sistema init s'executa al domini init_t i el procés anomenat s'executa al domini named_t.
- Funcions — Què serveix d'intermediari entre els dominis i els usuaris de SELinuxEls rols determinen a quins dominis pot pertànyer un usuari i a quins tipus d'objectes pot accedir. Aquest mecanisme de control d'accés evita l'amenaça d'atacs d'escalada de privilegis. Els rols estan integrats en el model de seguretat de control d'accés basat en rols (RBAC) que s'utilitza a SE.Linux.
- Tipus — Un atribut de llista d'aplicació de tipus que s'assigna a un objecte i determina qui hi pot accedir. Similar a la definició de domini, excepte que el domini s'aplica a un procés i el tipus s'aplica a objectes com ara directoris, fitxers, sòcols, etc.
- Subjectes i objectes - Els processos són subjectes i s'executen en un context concret, o domini de seguretat. Els recursos del sistema operatiu: fitxers, directoris, sòcols, etc., són objectes als quals se'ls assigna un determinat tipus, és a dir, un nivell de privadesa.
- Polítiques de SELinux - Per protegir el sistema SELinux utilitza diverses polítiques. Política SELinux Defineix l'accés dels usuaris als rols, els rols als dominis i els dominis als tipus. Primer, un usuari està autoritzat a un rol, després un rol està autoritzat a accedir als dominis. Finalment, un domini només pot tenir accés a certs tipus d'objectes.
Arquitectura LSM i SELinux
Malgrat el nom, els LSM no són realment mòduls carregables. LinuxNo obstant això, igual que SELinux, està integrat directament al nucli. Qualsevol canvi al codi font de l'LSM requereix una nova compilació del nucli. L'opció corresponent ha d'estar habilitada a la configuració del nucli; en cas contrari, el codi LSM no s'activarà després de l'arrencada. Tanmateix, fins i tot en aquest cas, es pot habilitar mitjançant una opció del carregador d'arrencada del sistema operatiu.

Pila de comprovació LSM
LSM està equipat amb ganxos a les funcions bàsiques del nucli que poden ser rellevants per a les comprovacions. Una de les característiques principals dels LSM és que estan apilats. Així, les comprovacions estàndard encara es realitzen i cada capa de LSM només afegeix controls i controls addicionals. Això vol dir que la prohibició no es pot revocar. Això es mostra a la figura; si el resultat de les comprovacions rutinàries de DAC és un error, la qüestió ni tan sols arribarà als ganxos LSM.
SELinux va adoptar l'arquitectura de seguretat Flask del sistema operatiu de recerca Fluke, en particular el principi del mínim privilegi. L'essència d'aquest concepte, com el seu nom indica, és atorgar a un usuari o procés només els drets necessaris per dur a terme l'acció prevista. Aquest principi s'implementa mitjançant la tipificació d'accés obligatòria, controlant així els drets d'accés a SE.Linux basat en el model domini => tipus.
Gràcies a la tipificació forçada de l'accés SELinux té unes capacitats de control d'accés molt més significatives que el model DAC tradicional utilitzat en el sistema operatiu Unix/LinuxPer exemple, podeu restringir el número de port de xarxa que escoltarà el servidor FTP, permetent escriure i modificar fitxers en una carpeta específica, però no suprimir-los.
Components principals de SELinux són els següents:
- Servidor d'aplicació de polítiques — El mecanisme principal per organitzar el control d'accés.
- Base de dades de polítiques de seguretat del sistema.
- Interacció amb l'interceptor d'esdeveniments LSM.
- Selinuxfs — Un pseudo-FS, igual que /proc i muntat a /sys/fs/selinux. Poblat dinàmicament pel nucli. Linux durant l'execució i conté fitxers que contenen informació sobre l'estat de l'SELinux.
- Accediu a la memòria cau de vectors — Un mecanisme auxiliar per augmentar la productivitat.

Esquema d'operació SELinux
Tot funciona així.
- Un tema determinat, en termes SELinux, realitza l'acció permesa sobre l'objecte després de la verificació del DAC, tal com es mostra a la imatge superior. Aquesta sol·licitud per realitzar l'operació es passa a l'interceptor d'esdeveniments LSM.
- A partir d'aquí, la sol·licitud, juntament amb el context de seguretat del subjecte i l'objecte, es passa al mòdul SE.Linux Abstracció i lògica de ganxo, responsables de la interacció amb LSM.
- L'autoritat de presa de decisions pel que fa a l'accés d'un subjecte a un objecte és el servidor d'aplicació de polítiques, i rep dades de l'SE.Linux AnHL.
- Per prendre decisions sobre l'accés o la denegació, Policy Enforcement Server recorre al subsistema de memòria cau Access Vector Cache (AVC) per obtenir les regles més utilitzades.
- Si no es troba una solució per a la regla corresponent a la memòria cau, la sol·licitud es passa a la base de dades de polítiques de seguretat.
- El resultat de la cerca de la base de dades i l'AVC es retorna al servidor d'aplicació de polítiques.
- Si la política trobada coincideix amb l'acció sol·licitada, l'operació està permesa. En cas contrari, l'operació està prohibida.
Gestió de la configuració de SELinux
SELinux funciona en un dels tres modes següents:
- Compliment - Adhesió estricta a les polítiques de seguretat.
- Permisiu: es permet la violació de les restriccions; es fa una nota corresponent al diari.
- Desactivat: les polítiques de seguretat no estan vigents.
Veure en quin mode està SELinux Ho podeu fer amb la següent comanda.
[admin@server ~]$ getenforce
Permissive
Canviar el mode abans de reiniciar, per exemple, establir-lo a l'aplicació, o 1. El paràmetre permissiu correspon al codi numèric 0.
[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #то же самое
També podeu canviar el mode editant el fitxer:
[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=enforcing
# 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=objectiu
La diferència amb setenfoce és que quan s'inicia el sistema operatiu, el mode SELinux s'establirà segons el valor del paràmetre del fitxer de configuració SELINUX. A més, els canvis per aplicar la desactivació de <=> només tenen efecte després d'editar el fitxer /etc/selinux/config i després de reiniciar.
Consulteu un breu informe d'estat:
[admin@server ~]$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31
Per veure els atributs de SELinux Algunes utilitats estàndard utilitzen el paràmetre -Z.
[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 httpd
En comparació amb la sortida normal de ls -l, hi ha diversos camps addicionals amb el format següent:
<user>:<role>:<type>:<level>
L'últim camp denota alguna cosa així com una classificació de seguretat i consta d'una combinació de dos elements:
- s0 - significació, també escrit com a interval de nivell baix-nivell alt
- c0, c1... c1023 - categoria.
Canvi de configuració d'accés
Utilitzeu semodule per carregar mòduls SELinux, afegir-les i eliminar-les.
[admin@server ~]$ semodule -l |wc -l #список всех модулей
408
[admin@server ~]$ semodule -e abrt #enable - активировать модуль
[admin@server ~]$ semodule -d accountsd #disable - отключить модуль
[admin@server ~]$ semodule -r avahi #remove - удалить модуль
Primer equip sessió setmanal connecta l'usuari de SELinux amb l'usuari del sistema operatiu, el segon mostra la llista. Finalment, l'última ordre amb l'opció -r elimina el mapatge d'usuari SELinux als comptes del sistema operatiu. La sintaxi dels valors del rang MLS/MCS s'explica a la secció anterior.
[admin@server ~]$ semanage login -a -s user_u karol
[admin@server ~]$ semanage login -l
Login Name SELinux User MLS/MCS Range Service
__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
Equip usuari de setmana utilitzat per gestionar les correspondències entre usuaris i rols de SELinux.
[admin@server ~]$ semanage user -l
Labeling MLS/ MLS/
SELinux User Prefix MCS Level MCS Range SELinux Roles
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_u
Paràmetres de comanda:
- -afegiu una entrada de mapatge de rol personalitzada;
- -l llista d'usuaris i rols coincidents;
- -d suprimeix l'entrada de mapatge de rols d'usuari;
- -R llista de rols adjunts a l'usuari;
Fitxers, ports i valors booleans
Cada mòdul SELinux Proporciona un conjunt de regles de marcatge de fitxers, però també podeu afegir les vostres pròpies regles si cal. Per exemple, volem donar al servidor web drets d'accés a la carpeta /srv/www.
[admin@server ~]$ semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?
[admin@server ~]$ restorecon -R /srv/www/
La primera ordre registra noves regles de marcatge, i la segona restableix, o més aviat estableix, els tipus de fitxer d'acord amb les regles actuals.
Així mateix, els ports TCP/UDP estan marcats de manera que només els puguin escoltar els serveis adequats. Per exemple, perquè el servidor web escolti al port 8080, heu d'executar l'ordre.
[admin@server ~]$ semanage port -m -t http_port_t -p tcp 8080
Un nombre significatiu de mòduls SELinux tenen paràmetres que poden prendre valors booleans. La llista completa d'aquests paràmetres es pot veure mitjançant getsebool -a. Els valors booleans es poden canviar mitjançant setsebool.
[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
Taller, accedeix a la interfície web de Pgadmin
Vegem un exemple pràctic: vam instal·lar pgadmin7.6-web a RHEL 4 per administrar la base de dades PostgreSQL. Vam caminar una mica amb la configuració de pg_hba.conf, postgresql.conf i config_local.py, establiu els permisos de la carpeta, instal·leu els mòduls Python que falten de pip. Tot a punt, llancem i rebem 500 Error intern del servidor.

Comencem amb els típics sospitosos, comprovant /var/log/httpd/error_log. Hi ha algunes entrades interessants.
[timestamp] [core:notice] [pid 23689] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
...
[timestamp] [wsgi:error] [pid 23690] [Errno 13] Permission denied: '/var/lib/pgadmin'
[timestamp] [wsgi:error] [pid 23690]
[timestamp] [wsgi:error] [pid 23690] HINT : You may need to manually set the permissions on
[timestamp] [wsgi:error] [pid 23690] /var/lib/pgadmin to allow apache to write to it.
Aquí és on són la majoria d'administradors Linux Hi haurà una forta temptació d'executar setencorce 0, i això és tot. Francament, això és el que vaig fer la primera vegada. Sens dubte és una solució, però lluny de ser la millor.
Malgrat el volum dels dissenys SELinux Pot ser fàcil d'usar. Simplement instal·leu el paquet setroubleshoot i mireu el registre del sistema.
[admin@server ~]$ yum install setroubleshoot
[admin@server ~]$ journalctl -b -0
[admin@server ~]$ service restart auditd
Tingueu en compte que el servei auditd s'ha de reiniciar d'aquesta manera i no utilitzant systemctl, malgrat la presència de systemd al sistema operatiu. Al registre del sistema s'indicarà no només el fet de bloquejar, sinó també el motiu i manera de superar la prohibició.

Executem aquestes ordres:
[admin@server ~]$ setsebool -P httpd_can_network_connect 1
[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1
Comprovem l'accés a la pàgina web pgadmin4-web, tot funciona.
Font: www.habr.com
