Mogelijkheden maken de evaluatie van enkele belangrijke systeemrechten mogelijk in een aparte thread die verschilt van het huidige proces. Op deze manier hoeft u geen programma als root uit te voeren om toegang te krijgen tot bepaalde delen van het systeem.

Als een oplossing die voortvloeit uit behoeften, gaat sectie 25 van POSIX.1e over dit probleem. De ontwikkeling van de privileges die in die sectie en meer zijn gedefinieerd, is voltooid met de release van Linux-kernelversie 2.6.26. Hier is alles wat u moet weten over mogelijkheden in de Linux-kernel.

Inzicht in de mogelijkheden API-logica

Autorisatiecontrole in Unix-gebaseerde systemen bestaat uit twee stappen:

  • Als de huidige eigenaar (effectieve gebruikers-ID, EUID) van de actieve toepassing nul is, controleert het systeem niet op autorisatie
  • Als de EUID-waarde verschilt van nul, voert het systeem het controleproces uit in overeenstemming met de autorisaties van de effectieve gebruiker en groep van de relevante applicatie

Sommige applicaties moeten tijdens het draaien over ruimere privileges beschikken (SUID, SGIT-bits). Als meest typische voorbeeld kun je denken aan:

instagram viewer
de passwd-toepassing. Hiermee kunnen gebruikers in een systeem hun wachtwoord wijzigen. Echter, om te schrijven naar de /etc/shadow bestand, waar de gecodeerde wachtwoorden worden bewaard, is het noodzakelijk om met root-gebruikersrechten te werken (d.w.z. gebruikers-ID = 0).

Om dit probleem op te lossen, heeft de passwd-toepassing een SUID-bit. Welke gebruiker deze applicatie ook gebruikt, de actieve eigenaar (EUID) zal altijd root zijn:

ls -l /usr/bin/passwd

# Uitgang
-rwsr-xr-x. 1 root root 32552 23 juli 2021 /usr/bin/passwd

De mogelijkheid om SUID-applicaties uit te voeren in het traditionele Unix-authenticatiemodel lijkt het probleem te hebben opgelost. Kritieke fouten in toepassingen met SUID-bits openen echter de deur naar het uitvoeren van ongewenste codes voor gebruikers met volledige autoriteit in het systeem. Een ideale applicatie zou, indien mogelijk, moeten kunnen draaien zonder root-gebruikersrechten.

Het probleem houdt niet op bij alleen het SUID-bit. U moet ook root-gebruikersrechten hebben als u wilt luisteren op een geprivilegieerde TCP- of UDP-poort minder dan 1024 op Unix-gebaseerde systemen. Om bijvoorbeeld naar de TCP 80-poort van een webserver te kunnen luisteren, moet u de toepassing als rootgebruiker uitvoeren.

In de loop der jaren is het duidelijk geworden hoe verwoestend het is om software te gebruiken die service verleent aan de netwerkomgeving met een volledig geautoriseerde gebruikersaccount. Als tussenoplossing werd aangenomen dat slechts een bepaald en kleiner deel van het programma op de geprivilegieerde poort als root luistert, en wijzigt vervolgens de actieve gebruikers-ID in een andere gebruiker voor volgende processen (bijvoorbeeld de niemand-gebruiker met beperkte rechten).

Dit systeem, dat al jaren in gebruik is, heeft door zijn eenvoud goed gewerkt en wordt nog steeds efficiënt gebruikt. Tegenwoordig is het echter mogelijk om enkele extra mogelijkheden te krijgen, specifiek voor de toepassing, via de Linux-capaciteiten-API, zonder de noodzaak van rootrechten, afgezien van de bovengenoemde systeem.

Het Linux-capaciteitsmodel, uitgelegd!

U kunt de meest uitgebreide implementatie van de API met mogelijkheden vinden in de Linux-kernel. Moderne Linux-distributies proberen dit nieuwe model ook zoveel mogelijk systeembreed te gebruiken.

Om de ping-toepassing bijvoorbeeld te laten werken, moet deze in staat zijn om RAW-sockets te openen, die over het algemeen alleen voor rootgebruikers zijn gereserveerd. In oude Linux-distributies is het probleem om het SUID-bit aan de applicatie te geven zodat normale gebruikers het kunnen gebruiken. Wanneer u in deze versies het SUID-bit uit de toepassing verwijdert en de toepassing probeert uit te voeren als een normale gebruiker, krijgt u de volgende foutmelding:

ping 8.8.8.8

# Uitgang
ping: icmp open socket: bediening niet toegestaan

Terwijl op moderne Linux-distributies de ping-toepassing waarschijnlijk niet de SUID-bit heeft:

ls -l /bin/ping 

# Uitgang
-rwxr-xr-x. 1 root root 95232 25 juli 2021 /bin/ping

Desalniettemin kunt u de toepassing als een normale gebruiker met succes uitvoeren. Het mechanisme dat dit mogelijk maakt, is dat de ping-toepassing de speciale mogelijkheid heeft CAP_NET_RAW.

U kunt de extra mogelijkheden van de applicatie leren met de getcap commando als volgt:

sudo getcap /bin/ping

# Uitgang
/bin/ping cap_net_raw=ep

Als het getcap-commando een leeg antwoord retourneert, kunt u deze waarde handmatig instellen met:

sudo setcap cap_net_raw+ep /bin/ping

Het procescapaciteitsmodel

Bij Linux-implementatie zijn de mogelijkheden van elk proces gegroepeerd onder drie kopjes:

Vermogen Uitspraak
toegestaan In dit cluster is er een lijst met toegestane extra mogelijkheden voor het relevante proces. Toestemming geven betekent niet dat er op dat moment actief gebruik van kan worden gemaakt. Het is mogelijk om de autorisaties hier op te nemen in de effectieve capaciteitenset met een extra actie.
effectief Het toont de momenteel actieve capaciteitenlijst van het gerelateerde proces. Met de hulpfuncties die het vaardigheidssysteem regelen, is het mogelijk om een ​​vaardigheid op te geven of terug te krijgen. Dit kan in ieder geval alleen onder degenen die al geautoriseerd zijn in de toegestane groep.
erfelijk Wanneer een toepassing een nieuw proces start, toont het nieuw gestarte proces de lijst met mogelijkheden die het zal erven van de toegestane lijst.

De lijst met toegestane, effectieve en overerfbare mogelijkheden voor het uitvoeren van processen op elk moment wordt weergegeven als bitmasker op de regels CapPrm, CapEff, en CapInh in het bestand /proc//status. tevens de CapBnd regel bevat het bitmasker dat wordt gebruikt in de capaciteitsgrenscontrolebewerking.

Probeer bijvoorbeeld de waarden van uw actieve shell-toepassing te lezen van de /proc/self/status het dossier:

kat /proc/zelf/status | grep Cap

# Uitgang
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 000000000000000000
CapBnd: 000001ffffffffff
CapAmb: 0000000000000000

Het bestandscapaciteitsmodel in Linux

De werking van het capaciteitssysteem voor bestanden hangt af van de voorwaarde dat deze eigenschappen kunnen worden opgeslagen in de virtuele bestandssysteemlaag (VFS). Net als bij het procesmodel vallen de mogelijkheden voor bestanden onder drie kopjes:

1. Toegestaan

Het systeem bepaalt de toegestane mogelijkheden van het proces wanneer het bijbehorende uitvoerbare bestand in dit cluster wordt uitgevoerd.

2. effectief

In tegenstelling tot het procescapaciteitsmodel, slaat deze header slechts één bit op: actief of inactief. Als de bit actief is, worden de mogelijkheden die zijn gedefinieerd in de toegestane lijst van het bestand automatisch overgebracht naar de effectieve capaciteitenlijst van het relevante proces wanneer dit bestand wordt uitgevoerd en een proces is gemaakt. Als de bit niet actief is, wordt de automatische overdracht van de toegestane mogelijkheden van het bestand naar het lopende proces niet uitgevoerd.

Als de code van de relevante applicatie echter is geïntegreerd met het capaciteitssysteem, kan het de machtigingen in de toegestane set van het bestand activeren met systeemaanroepen. Het belangrijkste doel van dit gedrag is ervoor te zorgen dat oude toepassingen die geen systeemspecifieke mogelijkheden hebben code, kan ontwikkeling op softwarecodeniveau werken met het capaciteitssysteem zonder dat er broncode nodig is veranderingen.

Je zou kunnen denken dat beter geschreven applicaties alleen capaciteiten zullen gebruiken als dat nodig is. Als de bit actief is, worden alle mogelijkheden in de toegestane lijst actief wanneer de toepassing wordt gestart.

3. erfelijk

Net als in het procesmodel loopt het betreffende bestand en vindt er een proces plaats. Als daarna een andere applicatie vanuit het proces draait, wordt deze opgenomen in de toegestane lijst van het nieuwe proces. Samenvattend geeft het een lijst aan van over te nemen mogelijkheden.

De rol van mogelijkheden in een Linux-systeem

Wanneer u een bepaald proces als een normale gebruiker uitvoert, heeft u geen privileges. Als gevolg hiervan hebt u alleen toegang tot de partities die het systeem toestaat voor normale gebruikers. De belangrijkste reden hiervoor is het aanscherpen van de systeembeveiliging en het doorvoeren van dergelijke maatregelen.

Door alle gebruikers toegang te geven tot alle bronnen, kan een ernstig beveiligingsprobleem ontstaan. Het zal heel gemakkelijk zijn voor mensen die het systeem gebruiken voor kwaadaardige doeleinden om systeemkwetsbaarheden te misbruiken. Linux-mogelijkheden komen in dergelijke zaken goed van pas. U kunt de beveiliging van uw toepassingen eenvoudig versterken met API-mogelijkheden die worden aangedreven door de kernel.

Linux-mogelijkheden zijn slechts een van de zaken waarover moet worden nagedacht om zeer krachtige methoden uit te voeren, zoals het verdelen van de machtigingen, het toewijzen van verschillende machtigingen aan niet-bevoorrechte gebruikers en het nemen van verschillende voorzorgsmaatregelen over open poorten in internetdiensten met Linux-servers.

Verbeter de beveiliging van uw Linux-server met deze 7 verhardende stappen

Lees volgende

DelenTweetenDelenE-mail

Gerelateerde onderwerpen

  • Linux
  • Programmeren
  • Linux-kernel
  • Besturingssysteem

Over de auteur

Fatih Küçükkarakurt (8 artikelen gepubliceerd)

Een ingenieur en softwareontwikkelaar die een fan is van wiskunde en technologie. Hij heeft altijd van computers, wiskunde en natuurkunde gehouden. Hij heeft zowel game-engine-projecten als machine learning, kunstmatige neurale netwerken en lineaire algebra-bibliotheken ontwikkeld. Bovendien blijft men werken aan machine learning en lineaire matrices.

Meer van Fatih Küçükkarakurt

Abonneer op onze nieuwsbrief

Word lid van onze nieuwsbrief voor technische tips, recensies, gratis e-boeken en exclusieve deals!

Klik hier om je te abonneren