Funktioner tillader evaluering af nogle vigtige systemprivilegier i en separat tråd, der er forskellig fra den nuværende proces. På denne måde behøver du ikke at køre et program som root for at få adgang til visse dele af systemet.
Som en løsning, der udspringer af behov, handler afsnit 25 i POSIX.1e om dette problem. Udviklingen af de privilegier, der er defineret i dette afsnit og mere, er blevet fuldført med udgivelsen af Linux-kerneversion 2.6.26. Her er alt, hvad du behøver at vide om funktioner i Linux-kernen.
Forståelse af Capabilities API-logikken
Autorisationskontrol i Unix-baserede systemer består af to trin:
- Hvis den nuværende ejer (effektivt bruger-id, EUID) af den kørende applikation er nul, så tjekker systemet ikke for autorisation
- Hvis EUID-værdien er forskellig fra nul, udfører systemet kontrolprocessen i overensstemmelse med tilladelserne fra den effektive bruger og gruppe af den relevante applikation
Nogle applikationer skal have bredere privilegier (SUID, SGIT bits), mens de kører. Som det mest typiske eksempel kan du tænke dig
passwd-applikationen. Hermed kan brugere i et system ændre deres adgangskoder. Men at skrive til /etc/shadow fil, hvor de krypterede adgangskoder opbevares, er det nødvendigt at arbejde med root-brugerrettigheder (dvs. bruger-id = 0).For at løse dette problem har passwd-applikationen en SUID-bit. Uanset hvilken bruger der kører denne applikation, vil den aktive ejer (EUID) altid være root:
ls -l /usr/bin/passwd
# Output
-rwsr-xr-x. 1 rodrod 32552 23. juli 2021 /usr/bin/passwd
Evnen til at køre SUID-applikationer i den traditionelle Unix-godkendelsesmodel ser ud til at have løst problemet. Imidlertid åbner kritiske fejl i applikationer med SUID-bits døren til at køre uønskede koder for brugere med fuld autoritet i systemet. En ideel applikation skal kunne køre uden behov for root-brugerrettigheder, hvis det er muligt.
Problemet slutter ikke kun med SUID-bitten. Du skal også have root-brugerrettigheder, når du vil lytte på en privilegeret TCP- eller UDP-port mindre end 1024 på Unix-baserede systemer. For at kunne lytte til TCP 80-porten på en webserver, skal du for eksempel køre programmet som root-bruger.
I årenes løb er det blevet forstået, hvor ødelæggende det er at køre software, der leverer service til netværksmiljøet med en fuldt autoriseret brugerkonto. Som en midlertidig løsning blev det vedtaget, at kun en vis og mindre del af programmet lytter på den privilegerede port som root, og ændrer derefter det aktive bruger-id til en anden bruger for efterfølgende processer (f.eks. ingen-brugeren med begrænsede rettigheder).
Dette system, som har været brugt i årevis, har fungeret godt med sin enkelhed og bruges stadig effektivt. Men i dag er det muligt at få nogle ekstra funktioner, der er specifikke for applikationen, via Linux capabilities API, uden behov for root-rettigheder, bortset fra ovennævnte system.
Linux-kapacitetsmodellen, forklaret!
Du kan finde den mest omfattende implementering af kapacitets-API'en i Linux-kernen. Moderne Linux-distributioner forsøger også at bruge denne nye model i hele systemet så meget som muligt.
For at ping-applikationen for eksempel skal fungere, skal den kunne åbne RAW-sockets, som generelt kun er forbeholdt root-brugere. I gamle Linux-distributioner er problemet at give SUID-bitten til applikationen, så normale brugere kan bruge den. I disse versioner, når du fjerner SUID-bitten fra applikationen og prøver at køre applikationen som en normal bruger, får du følgende fejl:
ping 8.8.8.8
# Output
ping: icmp åben socket: Betjening ikke tilladt
Hvorimod på moderne Linux-distributioner, har ping-applikationen sandsynligvis ikke SUID-bitten:
ls -l /bin/ping
# Output
-rwxr-xr-x. 1 rodrod 95232 25. juli 2021 /bin/ping
Ikke desto mindre kan du køre programmet med succes som en normal bruger. Mekanismen, der gør dette muligt, er, at ping-applikationen har den særlige evne CAP_NET_RAW.
Du kan lære applikationens yderligere funktioner med getcap kommando som følger:
sudo getcap /bin/ping
# Output
/bin/ping cap_net_raw=ep
Hvis getcap-kommandoen returnerer et tomt svar, kan du manuelt indstille denne værdi med:
sudo setcap cap_net_raw+ep /bin/ping
Proceskapacitetsmodellen
I Linux-implementering er mulighederne for hver proces grupperet under tre overskrifter:
Evne | Udmelding |
tilladt | I denne klynge er der en liste over tilladte yderligere funktioner til den relevante proces. At give tilladelse betyder ikke, at den kan bruges aktivt på det tidspunkt. Det er muligt at inkludere autorisationerne her i det effektive kapacitetssæt med en ekstra handling. |
effektiv | Den viser den aktuelt aktive funktionsliste for den relaterede proces. Med de hjælpefunktioner, der regulerer færdighedssystemet, er det muligt at opgive eller genvinde en færdighed. Dette kan dog under alle omstændigheder kun ske blandt de allerede autoriserede i den tilladte gruppe. |
arvelig | Når en applikation starter en ny proces, viser den nystartede proces listen over funktioner, som den vil arve fra den tilladte liste. |
Listen over tilladte, effektive og arvelige funktioner til at køre processer til enhver tid vises som bitmaske på linjerne CapPrm, CapEff, og CapInh i filen /proc/
Prøv for eksempel at læse værdierne for din kørende shell-applikation fra /proc/self/status fil:
kat /proc/selv/status | grep Cap
# Output
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 000001ffffffffff
CapAmb: 0000000000000000
Filkapacitetsmodellen i Linux
Funktionen af kapabilitetssystemet for filer afhænger af forudsætningen for, at disse egenskaber kan lagres i det virtuelle filsystem (VFS) lag. I lighed med procesmodellen falder funktioner til filer under tre overskrifter:
1. Tilladt
Systemet bestemmer de tilladte muligheder for processen, når den tilsvarende eksekverbare fil kører i denne klynge.
2. Effektiv
I modsætning til proceskapacitetsmodellen gemmer denne header kun én bit: aktiv eller inaktiv. Hvis biten er aktiv, er de egenskaber, der er defineret i den tilladte liste over filen, automatisk overføres til den effektive kapacitetsliste for den relevante proces, når denne fil køres og en proces er oprettet. Hvis bit ikke er aktiv, udføres den automatiske overførsel af de tilladte funktioner på filen til den kørende proces ikke.
Men hvis koden for den relevante applikation er integreret med kapacitetssystemet, kan den aktivere tilladelserne i det tilladte sæt af filen med systemkald. Hovedformålet med denne adfærd er at sikre, at gamle applikationer, der ikke inkluderer kapacitet, er systemspecifikke kode, kan udvikling på softwarekodeniveau arbejde med kapacitetssystemet uden behov for nogen kildekode ændringer.
Du tror måske, at bedreskrevne applikationer kun vil bruge funktioner, når det er nødvendigt. Hvis biten er aktiv, bliver alle funktioner på den tilladte liste aktive, når applikationen starter.
3. Arvelig
Som i procesmodellen kører den relevante fil, og der opstår en proces. Hvis en anden applikation kører inde fra processen efter det, er den inkluderet i den tilladte liste over den nye proces. For at opsummere, angiver det en liste over muligheder, der skal arves.
Funktionernes rolle i et Linux-system
Når du kører en bestemt proces som en normal bruger, har du ingen privilegier. Som et resultat kan du kun få adgang til de partitioner, som systemet tillader for normale brugere. Hovedårsagen bag dette er at stramme systemsikkerheden og implementere sådanne foranstaltninger.
At give alle brugere adgang til alle ressourcer kan skabe en alvorlig sikkerhedssårbarhed. Det vil være meget nemt for folk, der bruger systemet til ondsindede formål, at udnytte systemets sårbarheder. Linux-funktioner er nyttige i sådanne sager. Du kan nemt styrke sikkerheden af dine applikationer med funktioner API drevet af kernen.
Linux-kapaciteter er blot et af de problemer, der skal overvejes for at udføre meget kraftfulde metoder, såsom at opdele root-brugerens tilladelser, tildele forskellige tilladelser til ikke-privilegerede brugere og tage forskellige forholdsregler vedrørende åbne porte i internettjenester med Linux-servere.
Forbedre din Linux-serversikkerhed med disse 7 hærdningstrin
Læs Næste
Relaterede emner
- Linux
- Programmering
- Linux-kerne
- Operativ system
Om forfatteren
En ingeniør og softwareudvikler, der er fan af matematik og teknologi. Han har altid godt kunne lide computere, matematik og fysik. Han har udviklet spilmotorprojekter samt maskinlæring, kunstige neurale netværk og lineære algebrabiblioteker. Arbejder desuden med maskinlæring og lineære matricer.
Abonner på vores nyhedsbrev
Tilmeld dig vores nyhedsbrev for tekniske tips, anmeldelser, gratis e-bøger og eksklusive tilbud!
Klik her for at abonnere