En av grunnene til den store suksessen Linux Operativsystemet på innebygde, mobile enheter og servere har et ganske høyt sikkerhetsnivå for kjernen, tilhørende tjenester og applikasjoner. Men hvis til kjernearkitekturen Linux, så finner du ikke en firkant i den som er ansvarlig for sikkerhet som sådan. Hvor gjemmer sikkerhetsundersystemet seg? Linux og hva består den av?
forhistorie Linux Sikkerhetsmoduler og SELinux
Sikkerhet forbedret Linux er et sett med regler og tilgangsmekanismer basert på obligatoriske og rollebaserte tilgangsmodeller for å beskytte systemer Linux mot potensielle trusler og rettelser for feilene i Discretionary Access Control (DAC), et tradisjonelt Unix-sikkerhetssystem. Prosjektet startet i det amerikanske National Security Agency (NSA), med utvikling primært utført av entreprenørene Secure Computing Corporation og MITRE, samt en rekke forskningslaboratorier.

Linux Sikkerhetsmoduler
Linus Torvalds kom med en rekke kommentarer om nye NSA-utviklinger slik at de kunne inkluderes i hovedkjernen. LinuxHan beskrev et felles miljø, med et sett med avskjæringspunkter for å administrere objektoperasjoner og et sett med beskyttende felt i kjernedatastrukturer for å lagre de tilsvarende attributtene. Dette miljøet kunne deretter brukes av lastbare kjernemoduler til å implementere enhver ønsket sikkerhetsmodell. LSM ble fullstendig integrert i kjernen. Linux v2.6 i 2003.
LSM-rammeverket inkluderer vaktfelt i datastrukturer og kall til avskjæringsfunksjoner på kritiske punkter i kjernekoden for å manipulere dem og utføre tilgangskontroll. Den legger også til funksjonalitet for registrering av sikkerhetsmoduler. /sys/kernel/security/lsm-grensesnittet inneholder en liste over aktive moduler på systemet. LSM-kroker lagres i lister som kalles opp i den rekkefølgen som er spesifisert i CONFIG_LSM. Detaljert dokumentasjon om kroker er inkludert i overskriftsfilen include/linux/lsm_hooks.h.
LSM-delsystemet tillot full integrering av SELinux samme versjon av den stabile kjernen Linux v2.6. Bokstavelig talt umiddelbart SELinux har blitt de facto standarden for sikre miljøer Linux og ble en del av de mest populære distribusjonene: RedHat Enterprise Linux, fedora, Debian, Ubuntu.
SE-ordlisteLinux
- identitet — SE-brukerLinux ikke det samme som den vanlige Unix/Linux bruker-ID, de kan eksistere samtidig på samme system, men er helt forskjellige i essens. Hver standardkonto Linux kan samsvare med én eller flere i SELinuxSE-identitetLinux er en integrert del av den overordnede sikkerhetskonteksten som avgjør hvilke domener som kan åpnes og hvilke som ikke kan.
- domener — I sørøstLinux Et domene er utførelseskonteksten til et subjekt, dvs. en prosess. Et domene bestemmer direkte tilgangen en prosess har. Et domene er i hovedsak en liste over hva prosesser kan gjøre eller hvilke handlinger en prosess kan utføre med forskjellige typer. Noen eksempler på domener er sysadm_t for systemadministrasjon, og user_t, som er et vanlig, uprivilegert brukerdomene. init-systemet kjører i init_t-domenet, og den navngitte prosessen kjører i named_t-domenet.
- rolle — Hva fungerer som mellomledd mellom domener og SE-brukereLinuxRoller bestemmer hvilke domener en bruker kan tilhøre og hvilke typer objekter de har tilgang til. Denne tilgangskontrollmekanismen forhindrer trusselen om angrep med privilegieeskalering. Roller er integrert i sikkerhetsmodellen Role-Based Access Control (RBAC) som brukes i SE.Linux.
- typer — Et Type Enforcement-listeattributt som er tilordnet et objekt og bestemmer hvem som har tilgang til det. Ligner på domenedefinisjonen, bortsett fra at domenet gjelder for en prosess, og typen gjelder for objekter som kataloger, filer, sockets, etc.
- Emner og objekter – Prosesser er subjekter og kjøres i en bestemt kontekst, eller sikkerhetsdomene. Operativsystemressurser: filer, kataloger, sockets, etc., er objekter som er tildelt en bestemt type, med andre ord et personvernnivå.
- SE-retningslinjerLinux - For å beskytte SE-systemetLinux bruker en rekke retningslinjer. SE-policyLinux Definerer brukertilgang til roller, roller til domener og domener til typer. Først er en bruker autorisert til en rolle, deretter er en rolle autorisert til å få tilgang til domener. Til slutt kan et domene bare ha tilgang til bestemte objekttyper.
LSM- og SE-arkitekturLinux
Til tross for navnet er LSM-er faktisk ikke lastbare moduler. Linux. Men akkurat som SELinux, den er direkte integrert i kjernen. Enhver endring i LSM-kildekoden krever en ny kjernekompilering. Det tilsvarende alternativet må aktiveres i kjerneinnstillingene, ellers vil ikke LSM-koden aktiveres etter oppstart. Men selv i dette tilfellet kan den aktiveres via et alternativ for oppstartslaster i operativsystemet.

LSM sjekkstabel
LSM er utstyrt med kroker i kjernekjernefunksjoner som kan være aktuelle for kontroller. En av hovedtrekkene til LSM-er er at de er stablet. Dermed blir standardkontrollene fortsatt utført, og hvert lag av LSM legger bare til ytterligere kontroller og kontroller. Det betyr at forbudet ikke kan rulles tilbake. Dette er vist i figuren; hvis resultatet av rutinemessige DAC-kontroller er en feil, vil saken ikke engang nå LSM-krokene.
SELinux tok i bruk Flask-sikkerhetsarkitekturen til Fluke Research-operativsystemet, spesielt prinsippet om minste rettighet. Essensen av dette konseptet, som navnet antyder, er å gi en bruker eller prosess kun de rettighetene som er nødvendige for å utføre den tiltenkte handlingen. Dette prinsippet implementeres gjennom obligatorisk tilgangstyping, og kontrollerer dermed tilgangsrettigheter i SE.Linux basert på domene => typemodellen.
Takket være den tvungne skrivingen av access SELinux har mye mer betydelige tilgangskontrollmuligheter enn den tradisjonelle DAC-modellen som brukes i Unix OS/LinuxFor eksempel kan du begrense nettverksportnummeret som FTP-serveren skal lytte på, slik at du kan skrive og endre filer i en bestemt mappe, men ikke slette dem.
Hovedkomponentene i SELinux er som følger:
- Policy Enforcement Server — Hovedmekanismen for organisering av tilgangskontroll.
- Systemsikkerhetspolicydatabase.
- Interaksjon med LSM-hendelsesavskjæreren.
- Selinuxfs — En pseudo-FS, den samme som /proc og montert i /sys/fs/selinux. Dynamisk fylt av kjernen. Linux under utførelse og inneholder filer som inneholder informasjon om SE-statusenLinux.
- Få tilgang til Vector Cache — En hjelpemekanisme for å øke produktiviteten.

SE-driftsplanLinux
Det hele fungerer slik.
- Et visst emne, i SE-termerLinux, utfører den tillatte handlingen på objektet etter DAC-verifisering, som vist på bildet ovenfor. Denne forespørselen om å utføre operasjonen sendes til LSM-hendelsesinterceptoren.
- Derfra sendes forespørselen, sammen med sikkerhetskonteksten til subjektet og objektet, til SE-modulen.Linux Abstraksjon og Hook Logic, ansvarlig for interaksjon med LSM.
- Beslutningsmyndigheten angående et subjekts tilgang til et objekt er Policy Enforcement Server, og den mottar data fra SE-en.Linux AnHL.
- For å ta avgjørelser om tilgang eller nektelse, henvender Policy Enforcement Server seg til Access Vector Cache (AVC) caching-delsystemet for de mest brukte reglene.
- Hvis en løsning for den tilsvarende regelen ikke finnes i hurtigbufferen, sendes forespørselen videre til sikkerhetspolicydatabasen.
- Søkeresultatet fra databasen og AVC returneres til Policy Enforcement Server.
- Hvis policyen som ble funnet samsvarer med den forespurte handlingen, er operasjonen tillatt. Ellers er operasjonen forbudt.
Administrere SE-innstillingerLinux
SELinux fungerer i en av tre moduser:
- Håndheve - Streng overholdelse av sikkerhetspolicyer.
- Permissive - Brudd på restriksjoner er tillatt; et tilsvarende notat gjøres i journalen.
- Deaktivert – Sikkerhetsretningslinjer er ikke i kraft.
Se hvilken modus SE er iLinux Du kan gjøre det med følgende kommando.
[admin@server ~]$ getenforce
PermissiveEndre modus før omstart, for eksempel sette den til å håndheve, eller 1. Den tillatelige parameteren tilsvarer den numeriske koden 0.
[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #то же самое
Du kan også endre modusen ved å 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
Forskjellen med setenfoce er at når operativsystemet starter opp, vil SE-modusenLinux vil bli satt i henhold til verdien til SELINUX-konfigurasjonsfilparameteren. Endringer i håndheving av <=> deaktivering trer dessuten bare i kraft etter redigering av /etc/selinux/config-filen og etter en omstart.
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
For å vise SE-attributterLinux Noen standardverktøy bruker -Z-parameteren.
[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 den normale utgangen av ls -l, er det flere tilleggsfelt i følgende format:
<user>:<role>:<type>:<level>
Det siste feltet angir noe som en sikkerhetsklassifisering og består av en kombinasjon av to elementer:
- s0 - signifikans, også skrevet som lavnivå-høynivåintervall
- c0, c1… c1023 - kategori.
Endring av tilgangskonfigurasjon
Bruk semomodule til å laste inn SE-modulerLinux, legg til 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 lag semanage pålogging kobler SE-brukerenLinux Med operativsystembrukeren viser den andre listen. Til slutt fjerner den siste kommandoen med -r-bryteren SE-brukertilordningenLinux til OS-kontoer. Syntaksen for MLS/MCS-områdeverdier er forklart i forrige avsnitt.
[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
Lag semanage bruker brukes til å administrere tilordninger mellom brukere 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_uKommandoparametere:
- -a legge til egendefinert rollekartleggingsoppføring;
- -l liste over matchende brukere og roller;
- -d slette brukerrolle kartlegging oppføring;
- -R liste over roller knyttet til brukeren;
Filer, porter og boolske verdier
Hver SE-modulLinux Gir et sett med regler for filmerking, men du kan også legge til dine egne regler om nødvendig. For eksempel ønsker vi å gi webserveren tilgangsrettigheter til /srv/www-mappen.
[admin@server ~]$ semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?
[admin@server ~]$ restorecon -R /srv/www/Den første kommandoen registrerer nye merkingsregler, og den andre tilbakestiller, eller snarere setter, filtypene i samsvar med gjeldende regler.
På samme måte er TCP/UDP-porter merket på en slik måte at bare de aktuelle tjenestene kan lytte på dem. For eksempel, for at webserveren skal lytte på port 8080, må du kjøre kommandoen.
[admin@server ~]$ semanage port -m -t http_port_t -p tcp 8080Et betydelig antall SE-modulerLinux har parametere som kan ta boolske verdier. Den fullstendige listen over slike parametere kan sees ved å bruke getsebool -a. Boolske verdier kan endres ved å bruke 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å tilgang til Pgadmin-webgrensesnittet
La oss se på et praktisk eksempel: vi installerte pgadmin7.6-web på RHEL 4 for å administrere PostgreSQL-databasen. Vi gikk litt med innstillingene til pg_hba.conf, postgresql.conf og config_local.py, angi mappetillatelser, installerte de manglende Python-modulene fra pip. Alt er klart, vi lanserer og tar imot 500 Intern serverfeil.

Vi starter med de typiske mistenkte, og sjekker /var/log/httpd/error_log. Det er noen interessante oppføringer 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 befinner seg Linux Det vil være en sterk fristelse å kjøre setencorce 0, og det er slutten på det. Helt ærlig, det var det jeg gjorde første gang. Det er absolutt en løsning, men langt fra den beste.
Til tross for SE-designenes store størrelseLinux Det kan være brukervennlig. Bare installer setroubleshoot-pakken og se systemloggen.
[admin@server ~]$ yum install setroubleshoot
[admin@server ~]$ journalctl -b -0
[admin@server ~]$ service restart auditd
Vær oppmerksom på at revisjonstjenesten må startes på nytt på denne måten, og ikke bruke systemctl, til tross for tilstedeværelsen av systemd i operativsystemet. I systemloggen vil bli indikert ikke bare blokkeringen, men også årsaken og måte å overvinne forbudet.

Vi utfører disse kommandoene:
[admin@server ~]$ setsebool -P httpd_can_network_connect 1
[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1
Vi sjekker tilgangen til pgadmin4-nettsiden, alt fungerer.
Kilde: www.habr.com
