Linux-beveiligingssystemen

Een van de redenen voor het enorme succes van het Linux-besturingssysteem op embedded, mobiele apparaten en servers is de vrij hoge mate van beveiliging van de kernel, gerelateerde services en applicaties. Maar als bekijk het eens van dichterbij aan de architectuur van de Linux-kernel, dan is het onmogelijk om daarin een vierkant te vinden dat verantwoordelijk is voor de beveiliging als zodanig. Waar verbergt het Linux-beveiligingssubsysteem zich en waaruit bestaat het?

Achtergrondinformatie over Linux-beveiligingsmodules en SELinux

Security Enhanced Linux is een reeks regels en toegangsmechanismen gebaseerd op verplichte en op rollen gebaseerde toegangsmodellen om Linux-systemen te beschermen tegen potentiële bedreigingen en de tekortkomingen van Discretionary Access Control (DAC), het traditionele Unix-beveiligingssysteem, te corrigeren. Het project ontstond in de kern van de Amerikaanse National Security Agency en werd rechtstreeks ontwikkeld, voornamelijk door aannemers Secure Computing Corporation en MITRE, evenals door een aantal onderzoekslaboratoria.

Linux-beveiligingssystemen
Linux-beveiligingsmodules

Linus Torvalds maakte een aantal opmerkingen over nieuwe NSA-ontwikkelingen, zodat deze konden worden opgenomen in de hoofdlijn Linux-kernel. Hij beschreef een algemene omgeving, met een reeks interceptors om operaties met objecten te controleren en een reeks bepaalde beschermende velden in kerneldatastructuren om de overeenkomstige attributen op te slaan. Deze omgeving kan vervolgens door laadbare kernelmodules worden gebruikt om elk gewenst beveiligingsmodel te implementeren. LSM kwam in 2.6 volledig in de Linux-kernel v2003 terecht.

Het LSM-framework omvat bewakingsvelden in datastructuren en oproepen naar onderscheppingsfuncties op kritieke punten in de kernelcode om deze te manipuleren en toegangscontrole uit te voeren. Het voegt ook functionaliteit toe voor het registreren van beveiligingsmodules. De /sys/kernel/security/lsm interface bevat een lijst met actieve modules op het systeem. LSM-hooks worden opgeslagen in lijsten die worden aangeroepen in de volgorde die is opgegeven in CONFIG_LSM. Gedetailleerde documentatie over hooks is opgenomen in het headerbestand include/linux/lsm_hooks.h.

Het LSM-subsysteem maakte het mogelijk om de volledige integratie van SELinux met dezelfde versie van de stabiele Linux-kernel v2.6 te voltooien. Vrijwel onmiddellijk werd SELinux de de facto standaard voor een veilige Linux-omgeving en opgenomen in de meest populaire distributies: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

SELinux-woordenlijst

  • identiteit — De SELinux-gebruiker is niet hetzelfde als het gebruikelijke Unix/Linux-gebruikers-ID; ze kunnen naast elkaar bestaan ​​op hetzelfde systeem, maar zijn in essentie totaal verschillend. Elke standaard Linux-account kan overeenkomen met één of meer in SELinux. De SELinux-identiteit maakt deel uit van de algehele beveiligingscontext, die bepaalt bij welke domeinen je wel en niet lid kunt worden.
  • domeinen - In SELinux is een domein de uitvoeringscontext van een onderwerp, d.w.z. een proces. Het domein bepaalt direct de toegang die een proces heeft. Een domein is in feite een lijst van wat processen kunnen doen of wat een proces met verschillende typen kan doen. Enkele voorbeelden van domeinen zijn sysadm_t voor systeembeheer, en user_t, een normaal gebruikersdomein zonder privileges. Het init-systeem draait in het init_t domein, en het benoemde proces draait in het benoemde_t domein.
  • rol — Wat dient als tussenpersoon tussen domeinen en SELinux-gebruikers. Rollen bepalen tot welke domeinen een gebruiker kan behoren en tot welke typen objecten hij toegang heeft. Dit toegangscontrolemechanisme voorkomt de dreiging van escalatieaanvallen op bevoegdheden. Rollen worden geschreven in het Role Based Access Control (RBAC) beveiligingsmodel dat in SELinux wordt gebruikt.
  • Types — Een Type Enforcement-lijstattribuut dat aan een object wordt toegewezen en bepaalt wie er toegang toe heeft. Vergelijkbaar met de domeindefinitie, behalve dat domein van toepassing is op een proces en type van toepassing is op objecten zoals mappen, bestanden, sockets, enz.
  • Onderwerpen en objecten - Processen zijn onderwerpen en draaien in een specifieke context, oftewel beveiligingsdomein. Besturingssysteembronnen: bestanden, mappen, sockets, etc. zijn objecten waaraan een bepaald type is toegewezen, met andere woorden een privacyniveau.
  • SELinux-beleid — SELinux gebruikt een verscheidenheid aan beleidsmaatregelen om het systeem te beschermen. Het SELinux beleid definieert de toegang van gebruikers tot rollen, rollen tot domeinen, en domeinen tot typen. Eerst wordt de gebruiker geautoriseerd om een ​​rol te verkrijgen, daarna wordt de rol geautoriseerd om toegang te krijgen tot domeinen. Ten slotte kan een domein alleen toegang hebben tot bepaalde soorten objecten.

LSM- en SELinux-architectuur

Ondanks de naam zijn LSM's over het algemeen geen laadbare Linux-modules. Echter, net als SELinux, is het direct geïntegreerd in de kernel. Elke wijziging aan de LSM-broncode vereist een nieuwe kernelcompilatie. De overeenkomstige optie moet in de kernelinstellingen zijn ingeschakeld, anders wordt de LSM-code na het opstarten niet geactiveerd. Maar zelfs in dit geval kan het worden ingeschakeld door de OS-bootloader-optie.

Linux-beveiligingssystemen
LSM-chequestapel

LSM is uitgerust met hooks in kernkernelfuncties die relevant kunnen zijn voor controles. Een van de belangrijkste kenmerken van LSM's is dat ze gestapeld zijn. De standaardcontroles worden dus nog steeds uitgevoerd en elke laag van LSM voegt alleen maar extra controles en controles toe. Dit betekent dat het verbod niet kan worden teruggedraaid. Dit wordt weergegeven in de afbeelding; als het resultaat van routinematige DAC-controles een mislukking is, zal de zaak de LSM-hooks niet eens bereiken.

SELinux gebruikt de Flask-beveiligingsarchitectuur van het Fluke-onderzoeksbesturingssysteem, in het bijzonder het principe van de minste privileges. De essentie van dit concept is, zoals de naam al doet vermoeden, om de gebruiker of verwerking alleen die rechten te verlenen die nodig zijn om de beoogde handelingen uit te voeren. Dit principe wordt geïmplementeerd met behulp van geforceerde toegang typen, dus toegangscontrole in SELinux is gebaseerd op het domain => type model.

Dankzij het geforceerd typen van toegang heeft SELinux veel grotere mogelijkheden voor toegangscontrole dan het traditionele DAC-model dat wordt gebruikt in Unix/Linux-besturingssystemen. U kunt bijvoorbeeld het netwerkpoortnummer beperken waarmee de ftp-server verbinding zal maken, het schrijven en wijzigen van bestanden in een bepaalde map toestaan, maar deze niet verwijderen.

De belangrijkste componenten van SELinux zijn:

  • Beleidshandhavingsserver — Het belangrijkste mechanisme voor het organiseren van toegangscontrole.
  • Database voor systeembeveiligingsbeleid.
  • Interactie met de LSM-gebeurtenisinterceptor.
  • Selinuxfs - Pseudo-FS, hetzelfde als /proc en gemount in /sys/fs/selinux. Dynamisch gevuld door de Linux-kernel tijdens runtime en met bestanden die SELinux-statusinformatie bevatten.
  • Toegang tot vectorcache — Een hulpmechanisme om de productiviteit te verhogen.

Linux-beveiligingssystemen
Hoe SELinux werkt

Het werkt allemaal zo.

  1. Een bepaald onderwerp, in SELinux-termen, voert een toegestane actie uit op een object na een DAC-controle, zoals weergegeven in de bovenste afbeelding. Dit verzoek om een ​​bewerking uit te voeren gaat naar de LSM-gebeurtenisinterceptor.
  2. Van daaruit wordt het verzoek, samen met de onderwerp- en objectbeveiligingscontext, doorgegeven aan de SELinux Abstraction en Hook Logic module, die verantwoordelijk is voor de interactie met de LSM.
  3. De beslissingsautoriteit over de toegang van een subject tot een object is de Policy Enforcement Server en deze ontvangt gegevens van SELinux AnHL.
  4. Om beslissingen te nemen over toegang of weigering, wendt Policy Enforcement Server zich tot het Access Vector Cache (AVC) caching-subsysteem voor de meest gebruikte regels.
  5. Als er geen oplossing voor de overeenkomstige regel in de cache wordt gevonden, wordt het verzoek doorgegeven aan de database met beveiligingsbeleid.
  6. Het zoekresultaat uit de database en AVC wordt teruggestuurd naar de Policy Enforcement Server.
  7. Als het gevonden beleid overeenkomt met de aangevraagde actie, is de bewerking toegestaan. Anders is de handeling verboden.

SELinux-instellingen beheren

SELinux werkt in een van de drie modi:

  • Handhaving - Strikte naleving van het beveiligingsbeleid.
  • Toegeeflijk - Overtreding van beperkingen is toegestaan; er wordt een overeenkomstige aantekening gemaakt in het dagboek.
  • Uitgeschakeld: het beveiligingsbeleid is niet van kracht.

Je kunt zien in welke modus SELinux zich bevindt met het volgende commando.

[admin@server ~]$ getenforce
Permissive

De modus wijzigen voordat u opnieuw opstart, bijvoorbeeld door deze in te stellen op afdwingen of 1. De permissieve parameter komt overeen met de numerieke code 0.

[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #то же самое

U kunt de modus ook wijzigen 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=doel

Het verschil met setenfoce is dat wanneer het besturingssysteem opstart, de SELinux-modus zal worden ingesteld in overeenstemming met de waarde van de SELINUX-parameter in het configuratiebestand. Bovendien worden wijzigingen aan het afdwingen van <=> uitgeschakeld alleen van kracht door het bewerken van het bestand /etc/selinux/config en na een herstart.

Bekijk een 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

Om SELinux-attributen te bekijken, gebruiken sommige standaard hulpprogramma's 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

Vergeleken met de normale uitvoer van ls -l zijn er verschillende extra velden in het volgende formaat:

<user>:<role>:<type>:<level>

Het laatste veld duidt op zoiets als een beveiligingsclassificatie en bestaat uit een combinatie van twee elementen:

  • s0 - significantie, ook geschreven als interval op laag niveau-hoog niveau
  • c0, c1… c1023 - categorie.

Toegangsconfiguratie wijzigen

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

[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 - удалить модуль

Eerste team semanage login verbindt de SELinux-gebruiker met de besturingssysteemgebruiker, de tweede geeft een lijst weer. Ten slotte verwijdert het laatste commando met de schakeloptie -r de toewijzing van SELinux-gebruikers aan OS-accounts. Een uitleg van de syntaxis voor MLS/MCS-bereikwaarden vindt u in de vorige sectie.

[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 gebruiker gebruikt om mappings tussen SELinux gebruikers en rollen te beheren.

[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

Commandoparameters:

  • -een aangepaste invoer voor roltoewijzing toevoegen;
  • -l lijst met overeenkomende gebruikers en rollen;
  • -d verwijder de invoer van de gebruikersroltoewijzing;
  • -R lijst met rollen die aan de gebruiker zijn gekoppeld;

Bestanden, poorten en Booleaanse waarden

Elke SELinux-module biedt een set regels voor het taggen van bestanden, maar u kunt indien nodig ook uw eigen regels toevoegen. We willen bijvoorbeeld dat de webserver toegangsrechten heeft 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 markeringsregels, en het tweede reset, of beter gezegd, stelt de bestandstypen in in overeenstemming met de huidige regels.

Op dezelfde manier zijn TCP/UDP-poorten zo gemarkeerd dat alleen de juiste services erop kunnen luisteren. Om de webserver bijvoorbeeld op poort 8080 te laten luisteren, moet u de opdracht uitvoeren.

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

Een aanzienlijk aantal SELinux-modules hebben parameters die Booleaanse waarden kunnen aannemen. De volledige lijst met dergelijke parameters kan worden bekeken met behulp van getebool -a. Je kunt Booleaanse waarden wijzigen 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

Workshop, krijg toegang tot de Pgadmin-webinterface

Laten we eens naar een praktisch voorbeeld kijken: we hebben pgadmin7.6-web op RHEL 4 geïnstalleerd om de PostgreSQL-database te beheren. We liepen een beetje zoektocht met de instellingen van pg_hba.conf, postgresql.conf en config_local.py, maprechten ingesteld, de ontbrekende Python-modules van pip geïnstalleerd. Alles is klaar, we lanceren en ontvangen 500 Interne server fout.

Linux-beveiligingssystemen

We beginnen met de typische verdachten, waarbij we /var/log/httpd/error_log controleren. Er staan ​​een aantal interessante inzendingen tussen.

[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.

Op dit punt zullen de meeste Linux-beheerders sterk in de verleiding komen om setencorce 0 uit te voeren, en dat zal het einde zijn. Eerlijk gezegd deed ik dat de eerste keer ook. Dit is natuurlijk ook een uitweg, maar verre van de beste.

Ondanks de omslachtige ontwerpen kan SELinux gebruiksvriendelijk zijn. Installeer gewoon het setroubleshoot-pakket en bekijk het systeemlogboek.

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

Houd er rekening mee dat de auditd-service op deze manier opnieuw moet worden opgestart en niet met systemctl, ondanks de aanwezigheid van systemd in het besturingssysteem. In het systeemlogboek zal worden aangegeven niet alleen het feit van de blokkering, maar ook de reden en manier om het verbod te omzeilen.

Linux-beveiligingssystemen

We voeren deze commando's uit:

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

We controleren de toegang tot de pgadmin4-webpagina, alles werkt.

Linux-beveiligingssystemen

Linux-beveiligingssystemen

Bron: www.habr.com

Voeg een reactie