En af grundene til den store succes Linux Operativsystemet på indlejrede, mobile enheder og servere har et forholdsvis højt sikkerhedsniveau for kernen, tilhørende tjenester og applikationer. Men hvis til kernearkitekturen Linux, så kan du ikke finde en boks i den, der er ansvarlig for sikkerhed som sådan. Hvor gemmer sikkerhedsundersystemet sig? Linux og hvad består den af?
forhistorie Linux Sikkerhedsmoduler og SELinux
Sikkerhed forbedret Linux er et sæt regler og adgangsmekanismer baseret på obligatoriske og rollebaserede adgangsmodeller for at beskytte systemer Linux mod potentielle trusler og rettelser af fejlene i Discretionary Access Control (DAC), et traditionelt Unix-sikkerhedssystem. Projektet startede i det amerikanske National Security Agency (NSA), og udviklingen blev primært udført af entreprenørerne Secure Computing Corporation og MITRE, samt en række forskningslaboratorier.

Linux Sikkerhedsmoduler
Linus Torvalds kom med en række kommentarer til nye NSA-udviklinger, så de kunne inkluderes i hovedkernen. LinuxHan beskrev et fælles miljø med et sæt af interceptorer til styring af objektoperationer og et sæt af beskyttende felter i kernens datastrukturer til lagring af de tilsvarende attributter. Dette miljø kunne derefter bruges af indlæsbare kernemoduler til at implementere enhver ønsket sikkerhedsmodel. LSM blev fuldt integreret i kernen. Linux v2.6 i 2003.
LSM-rammen inkluderer vagtfelter i datastrukturer og opkald til aflytning af funktioner på kritiske punkter i kernekoden for at administrere dem og udføre adgangskontrol. Det tilføjer også funktionalitet til registrering af sikkerhedsmoduler. /sys/kernel/security/lsm-grænsefladen indeholder en liste over aktive moduler i systemet. LSM hooks gemmes i lister, der kaldes i den rækkefølge, der er angivet i CONFIG_LSM. Detaljeret hook-dokumentation er inkluderet i include/linux/lsm_hooks.h header-filen.
LSM-undersystemet muliggjorde fuld integration af SELinux den samme version af den stabile kerne Linux v2.6. Bogstaveligt talt øjeblikkeligt SELinux er blevet de facto standarden for sikre miljøer Linux og blev en del af de mest populære distributioner: RedHat Enterprise Linux, fedora, Debian, Ubuntu.
SE-ordlisteLinux
- identitet — SE-brugerLinux ikke det samme som den sædvanlige Unix/Linux bruger-ID, de kan eksistere side om side på det samme system, men er i bund og grund fuldstændig forskellige. Hver standardkonto Linux kan matche en eller flere i SELinuxSE-identitetLinux er en integreret del af den overordnede sikkerhedskontekst, der bestemmer, hvilke domæner der kan tilgås, og hvilke der ikke kan.
- domæner — I SydøstLinux Et domæne er udførelseskonteksten for et subjekt, dvs. en proces. Et domæne bestemmer direkte den adgang, en proces har. Et domæne er i bund og grund en liste over, hvad processer kan udføre, eller hvilke handlinger en proces kan udføre med forskellige typer. Nogle eksempler på domæner er sysadm_t til systemadministration og user_t, som er et almindeligt, ikke-privilegeret brugerdomæne. init-systemet kører i init_t-domænet, og den navngivne proces kører i named_t-domænet.
- rolle — Hvad fungerer som mellemled mellem domæner og SE-brugereLinuxRoller bestemmer, hvilke domæner en bruger kan tilhøre, og hvilke typer objekter de kan få adgang til. Denne adgangskontrolmekanisme forhindrer truslen om angreb med privilegieeskalering. Roller er integreret i sikkerhedsmodellen Role-Based Access Control (RBAC), der bruges i SE.Linux.
- typer — En Type Enforcement-listeattribut, der er tildelt til et objekt og bestemmer, hvem der kan få adgang til det. Svarende til domænedefinitionen, bortset fra at domænet gælder for en proces, og typen gælder for objekter såsom mapper, filer, sockets osv.
- Emner og objekter - Processer er emner og kører i en bestemt kontekst eller sikkerhedsdomæne. Operativsystemressourcer: filer, mapper, sockets osv. er objekter, der er tildelt en bestemt type, med andre ord et privatlivsniveau.
- SE-politikkerLinux - For at beskytte SE-systemetLinux bruger en række politikker. SE-politikLinux Definerer brugeradgang til roller, roller til domæner og domæner til typer. Først er en bruger autoriseret til en rolle, derefter er en rolle autoriseret til at få adgang til domæner. Endelig kan et domæne kun have adgang til bestemte objekttyper.
LSM- og SE-arkitekturLinux
Trods navnet er LSM'er faktisk ikke moduler, der kan indlæses. Linux. Men ligesom SELinux, er den direkte integreret i kernen. Enhver ændring af LSM-kildekoden kræver en ny kernekompilering. Den tilsvarende indstilling skal aktiveres i kerneindstillingerne, ellers aktiveres LSM-koden ikke efter opstart. Men selv i dette tilfælde kan den aktiveres via en OS-opstartsindstilling.

LSM check stak
LSM er udstyret med kroge i kerne-kernefunktioner, der kan være relevante for checks. Et af hovedtrækkene ved LSM er, at de er stakbaserede. Standardkontrollerne udføres således stadig, og hvert LSM-lag tilføjer kun yderligere kontroller og kontroller. Det betyder, at forbuddet ikke kan rulles tilbage. Dette er vist i figuren, hvis resultatet af rutinemæssige DAC-tjek er en fejl, vil det ikke engang nå LSM-krogene.
SELinux anvendte Flask-sikkerhedsarkitekturen fra Fluke Research-operativsystemet, især princippet om mindste rettigheder. Essensen af dette koncept er, som navnet antyder, at give en bruger eller proces kun de rettigheder, der er nødvendige for at udføre den tilsigtede handling. Dette princip implementeres gennem obligatorisk adgangstypning, hvilket kontrollerer adgangsrettigheder i SE.Linux baseret på domæne => typemodellen.
Takket være den tvungne indtastning af access SELinux har langt mere betydelige adgangskontrolfunktioner end den traditionelle DAC-model, der bruges i Unix OS/LinuxFor eksempel kan du begrænse det netværksportnummer, som FTP-serveren lytter på, hvilket tillader skrivning og ændring af filer i en bestemt mappe, men ikke sletning af dem.
Hovedkomponenter i SELinux disse er:
- Politikhåndhævelsesserver — Hovedmekanismen til organisering af adgangskontrol.
- Systemsikkerhedspolitikdatabase.
- Interaktion med LSM-begivenhedslytteren.
- Selinuxfs — En pseudo-FS, den samme som /proc og monteret i /sys/fs/selinux. Dynamisk udfyldt af kernen. Linux under udførelsen og indeholder filer, der indeholder oplysninger om SE-statusLinux.
- Få adgang til Vector Cache - Hjælpemekanisme til at forbedre ydeevnen.

SE-driftsplanLinux
Det hele fungerer sådan her.
- Et bestemt emne, i SE-termerLinux, udfører den tilladte handling på objektet efter DAC-verifikation, som vist på billedet ovenfor. Denne anmodning om at udføre handlingen sendes til LSM-hændelsesinterceptoren.
- Derfra sendes anmodningen sammen med sikkerhedskonteksten for subjektet og objektet til SE-modulet.Linux Abstraktion og Hook Logic, ansvarlig for interaktion med LSM.
- Beslutningsmyndigheden vedrørende en subjekts adgang til et objekt er Policy Enforcement Server, og den modtager data fra SE'en.Linux AnHL.
- For at træffe en beslutning om adgang eller forbud henviser Policy Enforcement Server til caching-undersystemet for de mest brugte Access Vector Cache (AVC)-regler.
- Hvis en løsning for den tilsvarende regel ikke findes i cachen, sendes anmodningen videre til sikkerhedspolitikdatabasen.
- Søgeresultatet fra databasen og AVC returneres til Policy Enforcement Server.
- Hvis den fundne politik er i overensstemmelse med den anmodede handling, er handlingen tilladt. Ellers er operationen forbudt.
Administration af SE-indstillingerLinux
SELinux fungerer i en af tre tilstande:
- Håndhævelse - Streng overholdelse af sikkerhedspolitikker.
- Tilladt - Overtrædelse af restriktioner er tilladt; en tilsvarende note er lavet i journalen.
- Deaktiveret – Sikkerhedspolitikker er ikke i kraft.
Se hvilken tilstand SE er iLinux Du kan bruge følgende kommando.
[admin@server ~]$ getenforce
PermissiveÆndring af tilstanden før genstart, for eksempel, indstil den til at håndhæve, eller 1. Den tilladelige parameter svarer til den numeriske kode 0.
[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #то же самое
Du kan også ændre tilstanden ved at redigere filen:
[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=mål
Forskellen med setenfoce er, at når operativsystemet starter, aktiveres SE-tilstandenLinux vil blive indstillet i henhold til værdien af SELINUX-konfigurationsfilparameteren. Desuden træder ændringer af indstillingen "håndhævelse <=> deaktiveret" kun i kraft efter redigering af /etc/selinux/config-filen og efter en genstart.
Se en kort statusrapport:
[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
Sådan får du vist SE-attributterLinux Nogle standardværktøjer bruger parameteren -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 httpdSammenlignet med det normale ls -l output, er der flere ekstra felter i følgende format:
<user>:<role>:<type>:<level>
Det sidste felt betegner noget som en sikkerhedsklassifikation og består af en kombination af to elementer:
- s0 - signifikans, også skrevet som lav-højt niveau interval
- c0, c1… c1023 er kategorien.
Ændring af adgangskonfiguration
Brug semodule til at indlæse SE-modulerLinux, tilføj og fjern dem.
[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 - удалить модульFørste hold semanage login forbinder SE-brugerenLinux Med operativsystembrugeren viser den anden listen. Endelig fjerner den sidste kommando med -r-parameteren SE-brugertilknytningen.Linux til OS-konti. Syntaksen for MLS/MCS-intervalværdier er forklaret i det foregående afsnit.
[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
Team semanage bruger bruges til at administrere mappings mellem brugere og SE-rollerLinux.
[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_uKommandoparametre:
- -a tilføje brugerdefineret rolle mapping post;
- -l liste over matchende brugere og roller;
- -d slet brugerrolletilknytningsindgang;
- -R liste over roller knyttet til brugeren;
Filer, porte og booleaner
Hvert SE-modulLinux Indeholder et sæt regler for filmarkering, men du kan også tilføje dine egne regler, hvis det er nødvendigt. For eksempel vil vi give webserveren adgangsrettigheder til mappen /srv/www.
[admin@server ~]$ semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?
[admin@server ~]$ restorecon -R /srv/www/Den første kommando registrerer nye markeringsregler, og den anden nulstiller, eller rettere eksponerer, filtyper i overensstemmelse med de nuværende regler.
Ligeledes er TCP/UDP-porte markeret på en sådan måde, at kun de relevante tjenester kan lytte på dem. For at en webserver for eksempel kan lytte på port 8080, skal du køre en kommando.
[admin@server ~]$ semanage port -m -t http_port_t -p tcp 8080Et betydeligt antal SE-modulerLinux har parametre, der kan tage boolske værdier. Den fulde liste over sådanne parametre kan ses ved hjælp af getsebool -a. Boolske værdier kan ændres ved hjælp af 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
Workshop, få adgang til Pgadmin-webgrænsefladen
Lad os se på et praktisk eksempel: vi installerede pgadmin7.6-web på RHEL 4 for at administrere PostgreSQL-databasen. Vi gik lidt med opsætning af pg_hba.conf, postgresql.conf og config_local.py, sæt rettighederne til mapperne, installerede de manglende Python-moduler fra pip. Alt er klar, løb og få 500 Intern serverfejl.

Vi starter med de typiske mistænkte og tjekker /var/log/httpd/error_log. Der er nogle interessante poster der.
[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.
Det er her, de fleste administratorer er Linux Der vil være en stærk fristelse til at køre setencorce 0, og det er slutningen på det. Helt ærligt, det var det, jeg gjorde første gang. Det er bestemt en løsning, men langt fra den bedste.
Trods SE-designets store størrelseLinux Det kan være brugervenligt. Du skal blot installere setroubleshoot-pakken og se systemloggen.
[admin@server ~]$ yum install setroubleshoot
[admin@server ~]$ journalctl -b -0
[admin@server ~]$ service restart auditd
Bemærk, at den auditd-tjeneste skal genstartes på denne måde, og ikke med systemctl, på trods af tilstedeværelsen af systemd i OS. I systemloggen vil blive angivet ikke kun det faktum at blokere, men også årsagen og måde at overvinde forbuddet på.

Vi udfører disse kommandoer:
[admin@server ~]$ setsebool -P httpd_can_network_connect 1
[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1
Vi tjekker adgangen til pgadmin4-websiden, alt virker.
Kilde: www.habr.com
