Linux-beveiligingssystemen

Een van de redenen voor het enorme succes van Linux OS op ingebedde, mobiele apparaten en servers is de relatief hoge mate van veiligheid van de kernel, bijbehorende diensten en applicaties. Maar als je nauwlettend kijkt naar de architectuur van de Linux-kernel, dan kun je geen vakje vinden dat verantwoordelijk is voor beveiliging, als zodanig. Waar verstopt het Linux-beveiligingssysteem zich en waaruit bestaat het?

Achtergrond van Linux Security Modules en SELinux

Security Enhanced Linux is een set regels en toegangsmethoden, gebaseerd op mandaat- en rolgebaseerde toegangmodellen, om Linux-systemen te beschermen tegen mogelijke bedreigingen en om tekortkomingen in Discretionary Access Control (DAC) — het traditionele beveiligingssysteem van Unix, te verhelpen. Het project is ontstaan binnen de National Security Agency van de VS, en de ontwikkeling werd voornamelijk uitgevoerd door aannemers van Secure Computing Corporation en MITRE, evenals verschillende onderzoekslaboratoria.

Linux-beveiligingssystemen
Linux Security Modules

Linus Torvalds heeft commentaar geleverd op de nieuwe ontwikkelingen van de NSA, zodat ze konden worden opgenomen in de hoofdversie van de Linux-kernel. Hij beschreef een algemene omgeving, met een set van interceptoren voor het beheren van objectoperaties en een set van bepaalde beveiligingsvelden in de gegevensstructuren van de kernel voor het opslaan van de relevante attributen. Vervolgens kan deze omgeving worden gebruikt door inlaadbare kernelmodules voor het implementeren van elk gewenst beveiligingsmodel. LSM is in 2003 volledig opgenomen in de Linux-kernel v2.6.

Het LSM-framework omvat beveiligingsvelden in gegevensstructuren en oproepen naar interceptiefuncties op kritieke punten in de kernelcode om ze te beheren en toegangscontrole uit te voeren. Het voegt ook functies toe voor het registreren van beveiligingsmodules. De interface /sys/kernel/security/lsm bevat een lijst van actieve modules in het systeem. LSM-haken worden opgeslagen in lijsten die in de volgorde worden aangeroepen die is opgegeven in CONFIG_LSM. Gedetailleerde documentatie over de haken is opgenomen in de headerbestanden include/linux/lsm_hooks.h.

Het LSM-systeem heeft de volledige integratie van SELinux van dezelfde stabiele versie van de Linux-kernel v2.6 voltooid. Bijna onmiddellijk werd SELinux de de facto standaard voor een veilige Linux-omgeving en werd het opgenomen in de meest populaire distributies: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

Glossarium SELinux

  • Identiteit — De gebruiker van SELinux is niet hetzelfde als de gebruikelijke Unix/Linux-gebruikers-ID; ze kunnen op hetzelfde systeem coexistieren, maar zijn wezenlijk verschillend. Elke standaard Linux-account kan overeenkomen met een of meer accounts in SELinux. De identiteit van SELinux maakt deel uit van de algemene beveiligingscontext, die bepaalt in welke domeinen toegang is toegestaan en in welke niet.
  • Domeinen — In SELinux is een domein de uitvoeringscontext van een subject, dat wil zeggen, een proces. Het domein bepaalt rechtstreeks de toegang die het proces heeft. Een domein is in wezen een lijst van wat processen kunnen doen of welke acties een proces kan uitvoeren met verschillende typen. Enkele voorbeelden van domeinen zijn: sysadm_t voor systeembeheer, en user_t, dat het gewone niet-bevoorrechte gebruikersdomein is. Het init-systeem wordt uitgevoerd in het domein init_t, terwijl het proces named wordt uitgevoerd in het domein named_t.
  • Rollen — Wat als tussenpersoon fungeert tussen domeinen en SELinux-gebruikers. Rollen bepalen in welke domeinen een gebruiker kan zijn en tot welke types objecten hij toegang kan krijgen. Dit mechanisme voor toegangscontrole voorkomt het risico van privilege-escalatie-aanvallen. Rollen zijn ingebouwd in het beveiligingsmodel Role Based Access Control (RBAC), dat in SELinux wordt gebruikt.
  • Typen — Een attribuut van de Type Enforcement-lijst dat aan een object wordt toegewezen en bepaalt wie er toegang toe krijgt. Het lijkt op de definitie van een domein, behalve dat een domein van toepassing is op een proces, terwijl een type van toepassing is op objecten zoals mappen, bestanden, sockets, enz.
  • Subjecten en objecten — Processen zijn subjecten en worden uitgevoerd in een specifieke context, of beveiligingsdomein. De middelen van het besturingssysteem: bestanden, mappen, sockets, enz., zijn objecten die aan een bepaald type worden toegewezen, met andere woorden, een vertrouwelijkheidsniveau.
  • SELinux-beleidsregels — Voor het beschermen van het systeem maakt SELinux gebruik van verschillende beleidsregels. Het SELinux-beleid bepaalt de toegang van gebruikers tot rollen, de toegang van rollen tot domeinen en de toegang van domeinen tot types. In het begin wordt de gebruiker geautoriseerd om een rol te verkrijgen, vervolgens wordt de rol geautoriseerd om toegang te krijgen tot de domeinen. Ten slotte kan een domein alleen toegang hebben tot bepaalde typen objecten.

LSM en de architectuur van SELinux

Ondanks de naam zijn LSM's in feite geen laadbare modules van Linux. Echter, net als SELinux is het rechtstreeks geïntegreerd in de kernel. Elke wijziging van de broncode van LSM vereist een nieuwe compilatie van de kernel. De juiste optie moet zijn ingeschakeld in de kernelinstellingen, anders wordt de LSM-code niet geactiveerd na het opstarten. Maar zelfs in dat geval kan het worden ingeschakeld met een optie van de OS-bootloader.

Linux-beveiligingssystemen
LSM controlestack

LSM is uitgerust met hooks in de belangrijkste functies van de kernel die relevant kunnen zijn voor controles. Een van de belangrijkste kenmerken van LSM is dat ze zijn opgebouwd volgens een stackprincipe. Dit betekent dat standaardcontroles nog steeds worden uitgevoerd, en elke laag van LSM voegt alleen extra controles en beheersmaatregelen toe. Dit betekent dat een blokkade niet ongedaan kan worden gemaakt. Dit wordt getoond in de afbeelding; als het resultaat van routinematige DAC-controles een weigering is, komt het zelfs niet bij de LSM-hooks.

SELinux heeft de beveiligingsarchitectuur van Flask overgenomen, ontwikkeld door het onderzoek van het Fluke-besturingssysteem, met name het principe van de minste privilege. De essentie van dit concept, zoals de naam al zegt, is het bieden van alleen die rechten aan een gebruiker of proces die nodig zijn voor de veronderstelde acties. Dit principe is geïmplementeerd met behulp van afdwingende toegangstype, waardoor het toegangsbeheer in SELinux is gebaseerd op het model domein => type.

Dankzij afdwingende toegangstype heeft SELinux veel meer mogelijkheden om toegang te scheiden dan het traditionele DAC-model dat wordt gebruikt in Unix/Linux-systemen. Bijvoorbeeld, het is mogelijk om het nummer van de netwerkpoort te beperken dat door de ftp-server zal worden gebruikt, schrijfrechten en wijzigingen op bestanden in een bepaalde map toe te staan, maar niet hun verwijdering.

De belangrijkste componenten van SELinux zijn:

  • Beleidsafdwingingsserver — De belangrijkste mechanisme voor toegang controle.
  • Database van beveiligingsbeleid van het systeem.
  • Interactie met de LSM-gebeurtenisinterceptor.
  • Selinuxfs — Een pseudo-bestandssysteem, vergelijkbaar met /proc en gemonteerd in /sys/fs/selinux. Dynamisch gevuld door de Linux-kernel tijdens runtime en bevat bestanden met informatie over de status van SELinux.
  • Toegangsvectorcache — Een hulpprogramma voor prestatieverbetering.

Linux-beveiligingssystemen
Werking van SELinux

Dit werkt als volgt.

  1. Een bepaald subject, in de termen van SELinux, voert een toegestane actie uit op een object na DAC-controle, zoals weergegeven in de bovenste afbeelding. Dit verzoek om de operatie uit te voeren komt terecht bij de LSM-eventhandler.
  2. Vanaf daar wordt het verzoek samen met de beveiligingscontext van het subject en object doorgegeven aan de SELinux Abstraction and Hook Logic-module, die verantwoordelijk is voor de interactie met LSM.
  3. De instantie die beslist over de toegang van het subject tot het object is de Policy Enforcement Server, en hier komen gegevens binnen van SELinux AnHL.
  4. Om een beslissing te nemen over toegang, of het verbod daarvan, raadpleegt de Policy Enforcement Server het subsystem voor caching van de meest gebruikte regels, de Access Vector Cache (AVC).
  5. Als de beslissing voor de desbetreffende regel niet in de cache is gevonden, wordt het verzoek verder doorgegeven aan de beveiligingsbeleid database.
  6. Het resultaat van de zoekopdracht uit de database en AVC wordt teruggestuurd naar de Policy Enforcement Server.
  7. Als het gevonden beleid overeenkomt met de aangevraagde actie, wordt de operatie toegestaan. In andere gevallen wordt de operatie verboden.

Beheer van SELinux-instellingen

SELinux werkt in een van de drie modi:

  • Enforcing — Strikte handhaving van de beveiligingsbeleid.
  • Permissive — Inbreuk op beperkingen is toegestaan, met een overeenkomstige markering in het logboek.
  • Disabled — Beveiligingsbeleid is niet actief.

Je kunt zien in welke modus SELinux zich bevindt met de volgende opdracht.

[admin@server ~]$ getenforce
Permissive

Het wijzigen van de modus tot reboot, bijvoorbeeld instellen op enforcing, of 1. De permissive parameter komt overeen met de numerieke code 0.

[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #hetzelfde

De modus kan ook worden gewijzigd door het bestand te bewerken:

[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=targete

Het verschil met setenfoce is dat bij het opstarten van het besturingssysteem de SELinux-modus wordt ingesteld op basis van de waarde van de SELINUX-parameter in het configuratiebestand. Bovenal, wijzigingen van enforcing disabled worden alleen van kracht na het bewerken van het bestand /etc/selinux/config en na een heropstart.

Bekijk een kort statusrapport:

[admin@server ~]$ sestatus

SELinux-status: ingeschakeld
SELinuxfs-mount: /sys/fs/selinux
SELinux-rootdirectory: /etc/selinux
geladen beleidsnaam: gericht
Huidige modus: permissief
Modus uit configuratiebestand: handhaven
Beleid MLS-status: ingeschakeld
Beleid deny_unknown-status: toegestaan
Maximale kernel-beleidsversie: 31

Voor het bekijken van de SELinux-attributen gebruiken sommige standaardutilities de parameter -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

In vergelijking met de normale ls -l output zijn er hier een paar extra velden in het volgende formaat:

:::

Het laatste veld geeft iets aan als een vertrouwelijkheidslabel en bestaat uit een combinatie van twee elementen:

  • s0 — belangrijkheid, dat wordt ook geschreven als lowlevel-highlevel
  • c0, c1… c1023 — categorie.

Wijziging van toegang configuraties

Gebruik semodule om SELinux-modules te laden, toe te voegen of te verwijderen.

[admin@server ~]$ semodule -l |wc -l #lijst van alle modules
408
[admin@server ~]$ semodule -e abrt #enable - module activeren
[admin@server ~]$ semodule -d accountsd #disable - module uitschakelen
[admin@server ~]$ semodule -r avahi #remove - module verwijderen

Het eerste commando semanage login koppelt de SELinux-gebruiker aan de besturingssysteemgebruiker, het tweede geeft een lijst weer. Ten slotte verwijdert het laatste commando met de -r optie de koppeling tussen SELinux-gebruikers en OS-accounten. De uitleg van de syntaxis van waarden voor MLS/MCS Range is te vinden in de vorige sectie.

[admin@server ~]$ semanage login -a -s user_u karol
[admin@server ~]$ semanage login -l

Inlognaam SELinux-gebruiker MLS/MCS-bereikdienst
__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

Opdracht semanage user wordt gebruikt voor het beheren van de mappings tussen gebruikers en rollen van 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

Commando-instellingen:

  • -a voeg een gebruikersrecord toe voor rolmapping;
  • -l lijst van gebruikers- en rolmapping;
  • -d verwijder een gebruikersrecord voor rolmapping;
  • -R lijst van rollen gekoppeld aan de gebruiker;

Bestanden, poorten en boolean waarden

Elke SELinux-module biedt een set file labeling regels, maar je kunt ook je eigen regels toevoegen indien nodig. Bijvoorbeeld, we willen de webserver toegang geven tot de map /srv/www.

[admin@server ~]$ semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?
[admin@server ~]$ restorecon -R /srv/www/

Het eerste commando registreert nieuwe labeling regels, terwijl het tweede de bestands types terugzet of weer instelt volgens de huidige regels.

Evenzo zijn TCP/UDP poorten gemarkeerd zodat alleen de bijbehorende diensten deze kunnen afluisteren. Om bijvoorbeeld de webserver poort 8080 te laten beluisteren, moet je het commando uitvoeren.

[admin@server ~]$ semanage port -m -t http_port_t -p tcp 8080

Een aanzienlijk aantal SELinux-modules heeft parameters die booleaanse waarden kunnen aannemen. De volledige lijst van dergelijke parameters kan worden bekeken met getsebool -a. Booleaanse waarden kunnen worden gewijzigd met 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

Praktijk, toegang tot de Pgadmin-web interface krijgen.

Laten we een voorbeeld uit de praktijk bekijken. We hebben pgadmin4-web geïnstalleerd op RHEL 7.6 voor het beheren van de PostgreSQL database. We hebben een kleine quest met de configuratie van pg_hba.conf, postgresql.conf en config_local.py, hebben toegangspunten ingesteld, en de ontbrekende Python-modules geïnstalleerd via pip. Alles is klaar, we starten en krijgen 500 Internal Server error.

Linux-beveiligingssystemen

We beginnen met de typische verdachte, en kijken naar /var/log/httpd/error_log. Daar zijn enkele interessante vermeldingen.

[timestamp] [core:notice] [pid 23689] SELinux-beleid ingeschakeld; httpd draait als context system_u:system_r:httpd_t:s0
...
[timestamp] [wsgi:error] [pid 23690] [Errno 13] Toegang geweigerd: 'var/lib/pgadmin'
[timestamp] [wsgi:error] [pid 23690]
[timestamp] [wsgi:error] [pid 23690] HINT : U moet mogelijk handmatig de machtigingen instellen op
[timestamp] [wsgi:error] [pid 23690] /var/lib/pgadmin om apache toestemming te geven om ernaar te schrijven.

Op dit punt zullen de meeste Linux-beheerders de sterke verleiding voelen om setenforce 0 te starten en het daarbij te laten. Laat ik eerlijk zeggen, de eerste keer deed ik dat ook. Dit is natuurlijk ook een oplossing, maar verre van de beste.

Ondanks de complexiteit kan SELinux gebruiksvriendelijk zijn. Het is voldoende om het pakket setroubleshoot te installeren en het systeemlogboek te bekijken.

[admin@server ~]$ yum install setroubleshoot
[admin@server ~]$ journalctl -b -0
[admin@server ~]$ service restart auditd

Let op dat de service auditd precies op deze manier moet worden herstart, en niet met systemctl, ondanks dat systemd in het OS aanwezig is. In het systeemlogboek wordt niet alleen het feit van de blokkering aangegeven, maar ook de reden en hoe de beperking te omzeilen. Voer deze commando's uit:.

Linux-beveiligingssystemen

Controleer de toegang tot de webpagina pgadmin4-web, alles werkt.

[admin@server ~]$ setsebool -P httpd_can_network_connect 1
[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1

‘Vind alles zelf’: hoe je muziek voor werk en ontspanning kunt selecteren zonder aanbevelingssystemen.

Linux-beveiligingssystemen

Linux-beveiligingssystemen

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster