- Leren
- Informatica & ICT
- Informatica
- Besturingssystemen: processen, geheugen, threads en bestandssystemen
- Bescherming, isolatie en virtuele machines
Bescherming, isolatie en virtuele machines
GemiddeldLes 9 van 9 in Cursus Besturingssystemen: processen, geheugen, threads en bestandssystemen
Wat je leert
- Beschrijf de processormodi, gecontroleerde toegangspunten en geheugenbescherming die voorkomen dat programma's elkaar of de kernel beschadigen, en de mechanismen die aanvallen daarop bemoeilijken.
- Scheid gebruikersmodus en kernelmodusLeg privilegeniveaus en geprivilegieerde instructies uit en beschrijf wat er gebeurt als een programma iets probeert te doen wat alleen de kernel mag.
- Ga veilig naar de kernel via systeemaanroepenVolg een systeemaanroep van de trap tot de toegangscontrole en leg uit waarom de kernel elk ontvangen argument moet wantrouwen.
- Bescherm geheugen en apparatenGebruik toegangsrechten in paginatabellen, geheugenkoppelingen uitsluitend voor kerneltoegang en de IOMMU om uit te leggen hoe de kernel elk proces binnen zijn eigen geheugen houdt.
- Bemoeilijk aanvallen op programma's en de kernelLeg uit hoe niet-uitvoerbaar geheugen, willekeurige adresindeling, systeemaanroepfilters, beveiligd opstarten en auditlogboeken exploits kostbaarder maken en vastleggen wat er is gebeurd.
- Scheid gebruikersmodus en kernelmodus
- Leg uit hoe een besturingssysteem controleert wie een gebruiker is, wachtwoorden veilig opslaat, andere authenticatiefactoren gebruikt en de resulterende identiteit aan elk proces meegeeft.
- Koppel identiteiten aan processenVolg een aanmelding van de wachtwoordvraag tot een draaiende shell en leg gebruikers-ID's, groepen, overerving en programma's die privileges wijzigen, zoals setuid-programma's en sudo, uit.
- Sla wachtwoorden veilig op en controleer ze veiligLeg hashing, het gebruik van salts en trage wachtwoordhashfuncties uit en bereken hoe ze de kosten van gokaanvallen veranderen.
- Authenticeer met wat je hebt en wat je bentVergelijk wachtwoorden, tokens en biometrie, combineer ze in multifactorauthenticatie en authenticeer services en machines zonder persoon achter het toetsenbord.
- Koppel identiteiten aan processen
- Geef rechten weer als een toegangsmatrix, implementeer ze met toegangscontrolelijsten of bevoegdheidstokens, lees en stel Unix- en Windows-rechten in en vergelijk discretionaire, verplichte en rolgebaseerde modellen.
- Vergelijk toegangscontrolelijsten en bevoegdheidstokensSla dezelfde rechten per object of per subject op en weeg de twee benaderingen af voor het controleren, beoordelen, delegeren en intrekken van toegang.
- Lees en stel toegangsrechten in voor Unix en WindowsInterpreteer toegangsrechtenbits en octale rechtennotaties, pas de Unix-controleregels toe op bestanden en directory's en lees POSIX-ACL's en Windows-toegangscontrolevermeldingen.
- Vergelijk discretionaire, verplichte en rolgebaseerde toegangscontroleOnderscheid modellen waarin eigenaren beslissen van modellen waarin een systeembreed beleid beslist, en gebruik rollen om de rechten van veel gebruikers te beheren.
- Vergelijk toegangscontrolelijsten en bevoegdheidstokens
- Leg uit hoe een hypervisor de processor, het geheugen en de apparaten van één computer over meerdere volledige besturingssystemen verdeelt en die tegelijk van elkaar isoleert.
- Beschrijf virtuele machines en hypervisorsDefinieer virtuele machines en hypervisors, onderscheid ontwerpen van type 1 en type 2 en leg uit waarvoor virtualisatie wordt gebruikt en waar de isolatie ophoudt.
- Virtualiseer de processorLeg onderscheppen en emuleren uit, waarom klassiek x86 dat niet rechtstreeks kon gebruiken en hoe binaire vertaling, paravirtualisatie en hardwareondersteuning het probleem oplosten.
- Virtualiseer geheugenVertaal een virtueel adres van een gastbesturingssysteem naar een echt machineadres en vergelijk schaduwpaginatabellen met geneste paginering door hardware.
- Virtualiseer apparaten en isoleer virtuele machines van elkaarVergelijk geëmuleerde, paravirtuele en rechtstreeks toegewezen apparaten en leg de sterke punten en grenzen van isolatie tussen virtuele machines uit.
- Beschrijf virtuele machines en hypervisors
- Bouw een container met kernelfuncties (naamruimten voor wat een proces kan zien, controlegroepen voor wat het kan gebruiken en privilegebeperkingen voor wat het kan doen) en bepaal wanneer je een container of een virtuele machine gebruikt.
- Beperk met naamruimten wat een proces kan zienLeg de typen Linux-naamruimten uit, maak naamruimten aan en sluit je erbij aan, en interpreteer PID-, koppel-, netwerk- en gebruikersnaamruimten.
- Beperk met controlegroepen hoeveel bronnen een proces kan gebruikenOrden processen in controlegroepen en stel grenzen in voor CPU, geheugen, het aantal processen en I/O, en interpreteer de grenswaarden.
- Beperk de bevoegdheden van containers en kies tussen containers en virtuele machinesVerminder wat een proces in een container mag doen, leg het risico van een gedeelde kernel uit en kies voor een bepaalde werklast containers, virtuele machines of beide.
- Beperk met naamruimten wat een proces kan zien
Bescherming, isolatie en virtuele machines: uitleg
1Leg uit hoe hardware en de kernel het systeem beschermen
Programma's draaien snel omdat gewone instructies rechtstreeks op de processor worden uitgevoerd. Hardwarerechten en gecontroleerde toegangspunten tot de kernel maken die vrijheid veilig genoeg om een machine te delen. Volg de grens van CPU-privileges via controles bij systeemaanroepen tot toegang tot geheugen en apparaten, en bekijk daarna hoe uitvoeringsbeperkingen, willekeurige indeling, opstartverificatie en logboeken aanvallen op programma's en de kernel beperken.
1.1 Scheid gebruikersmodus en kernelmodus
Een programma heeft genoeg vrijheid nodig om snel te rekenen zonder de controle over de hele computer te krijgen. In gebruikersmodus kan het gewone instructies rechtstreeks uitvoeren. Kernelmodus, ook supervisormodus genoemd, geeft het besturingssysteem toegang tot de instructies die de machine besturen.
Laat de hardware privileges afdwingen
De CPU heeft een actueel privilegeniveau. Optellen, laden, opslaan en springen worden normaal op volle snelheid uitgevoerd, binnen de geldende geheugentoegangsrechten. De kernel controleert niet elke instructie met software. Dit is beperkte directe uitvoering: rechtstreeks uitvoeren totdat een beschermde bewerking of een interrupt de kernel nodig maakt.
Een geprivilegieerde instructie veroorzaakt een trap als gebruikerscode die probeert uit te voeren. Op x86-64 zijn kernelprivileges nodig voor HLT, het beschrijven van het paginatabelbasisregister CR3 en het installeren van een interrupttabel met LIDT. Anders zou een toepassing de CPU kunnen stoppen, haar eigen geheugengrenzen kunnen vervangen of de interruptafhandeling kunnen omleiden.
Stel dat een toepassing HLT uitvoert. De CPU veroorzaakt een algemene beschermingsfout in plaats van te stoppen. Hij gaat naar de door de kernel geregistreerde afhandelaar. Linux stuurt het proces normaal SIGSEGV, waardoor dat proces eindigt terwijl andere programma's doorgaan. De toepassing kan niet zomaar een gunstig adres binnen de kernel kiezen en daar beginnen met uitvoeren.
Passeer de grens via een gecontroleerd toegangspunt
Traps, excepties en interrupts komen binnen via adressen die door de kernel zijn geregistreerd. Hardware verandert het privilegeniveau en draagt de besturing over aan de afhandelaar; de kerneltoegangscode bewaart de toestand die nodig is om terug te keren. Een speciale retourinstructie herstelt de uitvoering in gebruikersmodus op de opgeslagen programmateller. Op x86-64 kan de terugkeer SYSRET of IRETQ gebruiken.
De timer maakt deze besturing ook nuttig wanneer een programma nooit om een dienst vraagt. Voordat de kernel het programma uitvoert, programmeert hij een timer. Wanneer de interrupt arriveert, kan de scheduler een ander proces kiezen. Gebruikerscode kan interrupts niet uitschakelen of die timer opnieuw programmeren, zodat een oneindige lus een processorkern niet voor altijd kan bezetten.
Lees privilegendiagrammen correct
| Architectuur | Toepassing | Kernel | Andere niveaus |
|---|---|---|---|
| x86 | Ring 3 | Ring 0 | Ring 1 en 2 bestaan, maar gewone Linux- en Windows-kernels laten ze ongebruikt |
| ARMv8-A | EL0 | EL1 | EL2 ondersteunt een hypervisor; EL3 ondersteunt de beveiligde firmwaremonitor |
| RISC-V | U-modus | S-modus | M-modus heeft machineprivileges |
De nummeringsconventies verschillen: een lager x86-ringnummer betekent meer privileges, terwijl een hoger ARM-exceptieniveau meer privileges betekent. Intel-virtualisatie voegt ook VMX-root- en niet-rootuitvoering toe; die staan los van het ringnummer.
Houd identiteit en CPU-modus gescheiden
Root is een gebruikersidentiteit, UID 0, die kernelsoftware herkent. De gewone code van een roottoepassing draait nog steeds in gebruikersmodus en gaat via systeemaanroepen naar de kernel. Een apparaatstuurprogramma dat in kernelmodus draait, heeft veel meer directe macht: een geheugenfout daarin kan de kerneltoestand beschadigen zonder een controle van bestandsrechten te passeren.
De laag die een grens afdwingt, moet de laag daarbinnen beheersen. De kernel dwingt procesgrenzen af met CPU-modi en geheugentabellen. Een hypervisor beheerst op vergelijkbare wijze gastbesturingssystemen met hardwareondersteuning voor virtualisatie.
Belangrijkste punten
- Gebruikersinstructies worden rechtstreeks uitgevoerd totdat de hardware toegang tot de kernel vereist.
- Geprivilegieerde bewerkingen beschermen paginatabellen, interrupts, timers en apparaatbesturing.
- Dankzij de timer kan de scheduler een processorkern terugnemen van een oneindige lus.
- Een rootidentiteit plaatst een toepassing niet in kernelmodus.
- De nummering van privileges hangt af van de architectuur.
1.2 Ga veilig naar de kernel via systeemaanroepen
Een systeemaanroep is een gecontroleerd verzoek om een dienst van de kernel. Bestanden openen, processen aanmaken en netwerkgegevens verzenden vereisen allemaal beslissingen die een toepassing niet veilig zelf kan nemen. Toegang tot de kernel geeft de afhandelaar bevoegdheden; het geeft de aanroeper geen toestemming om alles te doen wat die heeft gevraagd.
Volg het verzoek
Een wrapperfunctie in de C-bibliotheek zoals open() plaatst het aanroepnummer en de argumenten in registers. Die gebruikt SYSCALL op x86-64, SVC op ARM64 of ECALL op RISC-V. De kernel doet vervolgens het volgende:
- Hij komt binnen via zijn geregistreerde toegangspunt en slaat de gebruikersregisters op.
- Hij kiest de afhandelaar uit de systeemaanroeptabel en wijst een onbekend nummer af.
- Hij leest de identiteit en identificatiegegevens van de aanroeper uit het huidige proces.
- Hij controleert argumenten, toegangsrechten en de betrokken objecten.
- Hij voert de bewerking uit of retourneert een fout.
- Hij herstelt de opgeslagen toestand en keert terug naar gebruikersmodus.
De identiteit komt uit de identificatiegegevens van het proces, niet uit een door de gebruiker opgegeven naam. Een aanroeper kan geen rechten van een andere gebruiker krijgen door diens naam aan een verzoek toe te voegen.
Behandel argumenten als niet-vertrouwd
Een pointer is slechts een getal dat de aanroeper opgeeft. De kernel moet het volledige aangevraagde bereik in gebruikersgeheugen controleren, inclusief de lengte en de toegangsrichting. Linux gebruikt gecontroleerde routines zoals copy_from_user en copy_to_user om de grens veilig over te steken.
Bij read(fd, buf, 4096) mag een buf die naar kernelgeheugen wijst geen bestemming voor bestandsgegevens worden. Linux meldt EFAULT voor die ongeldige gebruikersbuffer. Een andere fout heeft een andere oorzaak: write() via een descriptor die met O_RDONLY is geopend, mislukt met EBADF, omdat aan de descriptor nooit schrijftoegang is verleend. Een gewoon geweigerd verzoek retourneert een fout; het beëindigt het proces niet automatisch. In C retourneert de wrapperfunctie meestal −1 en stelt die errno in.
Controleer het object dat daadwerkelijk wordt gebruikt
Een TOCTTOU-raceconditie scheidt een beslissing van het object dat die moest beschermen. Een geprivilegieerd hulpprogramma controleert access("/tmp/report", W_OK) en opent daarna het pad. Een aanvaller vervangt het pad tussen die bewerkingen door een symbolische koppeling naar /etc/passwd. De naam is ongewijzigd, maar het geopende object is anders.
De oplossing is om de toegang met de bedoelde identificatiegegevens uit te voeren op het daadwerkelijk geopende object. Doe afstand van privileges vóór het openen en gebruik vlaggen zoals O_NOFOLLOW wanneer symbolische koppelingen ongewenst zijn. Argumenten één keer naar kernelgeheugen kopiëren voorkomt ook dat veranderlijke gebruikersgegevens steeds opnieuw worden vertrouwd; de gekopieerde structuur moet nog steeds worden gecontroleerd.
Bepaal wat je moet vertrouwen
Een referentiemonitor regelt de toegang. Die moet worden aangeroepen telkens wanneer toegang wordt verkregen, tegen wijzigingen zijn beschermd en klein genoeg zijn om zorgvuldig te onderzoeken. Nadat de kernel een geheugenkoppeling heeft verleend, verlopen afzonderlijke laad- en opslagbewerkingen via de toegangscontroles van de MMU; ze doen niet elk een systeemaanroep.
De vertrouwde computerbasis (TCB) bestaat uit de hardware, firmware en geprivilegieerde software waarvan de bescherming afhankelijk is voor een correcte werking. Daartoe behoren de CPU, de opstartketen, de kernel en vertrouwde aanmeldcomponenten. Door stuurprogramma's of bestandssystemen naar servers in gebruikersmodus te verplaatsen, kan het kernelgedeelte van deze basis kleiner worden, zoals bij microkernelontwerpen. Een gecompromitteerde gewone toepassing misbruikt de rechten die eraan zijn verleend; een gecompromitteerde vertrouwde component kan de controles zelf ondermijnen.
Belangrijkste punten
- Toegang tot de kernel en toestemming om een bewerking uit te voeren zijn afzonderlijke zaken.
- Controleer pointerbereiken en toegangsrechten voordat je gebruikersargumenten gebruikt.
- Door een TOCTTOU-raceconditie kan een gecontroleerde naam naar een ander object verwijzen.
- Een referentiemonitor moet bestand zijn tegen omzeiling en wijzigingen.
- De TCB omvat meer dan de kernel.
- Een geweigerde systeemaanroep retourneert meestal een fout die het programma kan afhandelen.
1.3 Bescherm geheugen en apparaten
Virtueel geheugen vertaalt adressen en beschermt ook programma's. Een proces kan de fysieke paginaframes bereiken die in zijn actieve paginatabel staan, met de rechten die de kernel heeft ingesteld. De privéframes van een ander proces ontbreken; bewust gemaakte koppelingen voor gedeeld geheugen zijn een expliciete uitzondering.
Controleer elke geheugentoegang
De geheugenbeheereenheid (MMU) controleert paginatabelvermeldingen bij toegang. Belangrijke rechten en kenmerken zijn aanwezig of geldig, beschrijfbaar, toegankelijk voor gebruikers en uitvoerbaar. Op x86 onderscheidt U/S voor gebruikers toegankelijke pagina's van pagina's die alleen voor de supervisor toegankelijk zijn; NX of XD schakelt uitvoering uit. ARM noemt zijn uitvoeringsbeperking XN.
Een schending veroorzaakt een paginafout. De fout meldt een mislukte hardwarecontrole; de kernel bepaalt of die mislukking verwacht en herstelbaar is. Bekijk twee opslagbewerkingen naar alleen-lezenpagina's:
- Een proces overschrijft een codepagina die niet bij schrijven wordt gekopieerd. De kernel behandelt dit als een ongeldige schrijfbewerking en stuurt normaal
SIGSEGV. - Na
fork()schrijft een proces naar gedeelde gegevens die zijn gemarkeerd om bij schrijven te worden gekopieerd. De kernel wijst een privékopie toe, maakt de koppeling beschrijfbaar en probeert de instructie opnieuw.
Beide fouten beginnen bij een beschermingsbit. De administratie van de kernel verklaart waarom de koppelingen alleen-lezen waren en bepaalt de reactie. Een paginafout is dus niet automatisch een crash of een verzoek om gegevens van schijf op te halen.
Bescherm kernelkoppelingen in beide richtingen
Traditionele indelingen koppelen kernelgeheugen aan procesadresruimten als alleen toegankelijk voor de supervisor. Dat maakt toegang tot de kernel eenvoudig en blokkeert tegelijk lezen en schrijven vanuit gebruikersmodus. De Meltdown-aanval uit 2018 liet zien dat sommige processors zulke gegevens via speculatieve uitvoering konden lekken. Isolatie van kernelpaginatabellen (KPTI) verwijdert de meeste kernelkoppelingen terwijl gebruikerscode op getroffen systemen draait.
Kernelcode moet ook worden beschermd tegen omleiding naar geheugen dat door de gebruiker wordt beheerd. x86-SMEP voorkomt uitvoering in kernelmodus vanaf gebruikerspagina's. SMAP blokkeert gegevenstoegang vanuit kernelmodus tot gebruikerspagina's, behalve tijdens bewust toegestane kopieerbewerkingen. ARM biedt verwante bescherming via PXN en PAN. Deze controles beperken de mogelijkheden voor een aanvaller om een kernelfout te gebruiken om code uit te voeren of vervalste kernelgegevens aan te bieden.
Alleen-lezentoegang beschermt de integriteit, niet de geheimhouding. Als een proces een gekoppelde pagina kan lezen, kan het de inhoud ervan te weten komen, ook wanneer schrijfbewerkingen mislukken. Vertrouwelijke gegevens moeten ontoegankelijk zijn voor dat proces: laat ze niet gekoppeld of dwing een passende grens af waarbij ze alleen voor de supervisor toegankelijk zijn.
Geef apparaten een eigen grens
Toepassingen vragen werk van een apparaat meestal aan via een stuurprogramma. Apparaatregisters zijn normaal alleen voor de kernel toegankelijk, al kan een bevoegd proces geselecteerde koppelingen krijgen, zoals bij grafische stuurprogramma's of Linux-I/O in gebruikersruimte.
Een apparaat dat directe geheugentoegang (DMA) uitvoert, leest of beschrijft RAM zonder die toegangen via de MMU van de CPU te laten verlopen. Paginarechten van de CPU alleen kunnen niet voorkomen dat een defect apparaat paginaframes van een ander proces overschrijft. Een IOMMU vertaalt en beperkt apparaatadressen met koppelingen per apparaat. Intel VT-d en AMD-Vi bieden dit mechanisme.
Voor een apparaat dat aan een VM is toegewezen, beperkt de IOMMU DMA tot het aan die VM toegewezen geheugen. Aan de CPU-kant is een vergelijkbare grens nodig: een tweede fase van paginavertaling koppelt fysieke gastadressen alleen aan paginaframes die de hypervisor toestaat. Om een werklast te beschermen moet je zowel CPU-toegang als apparaattoegang afdekken.
Belangrijkste punten
- De MMU dwingt de koppelingen en toegangsrechtenbits af die de kernel instelt.
- Een paginafout kan herstel, kopiëren bij schrijven of een fataal signaal veroorzaken.
- Alleen-lezentoegang maakt gegevens niet vertrouwelijk.
- KPTI verwijdert de meeste kernelkoppelingen tijdens de uitvoering van gebruikerscode.
- SMEP en SMAP beperken het gebruik van gebruikerspagina's door de kernel.
- De IOMMU begrenst DMA die de CPU-MMU omzeilt.
1.4 Bemoeilijk aanvallen op programma's en de kernel
Een fout in de geheugenveiligheid kan een aanval mogelijk maken wanneer beschadigde gegevens de besturingsstroom van het programma veranderen. Een bufferoverloop op de stack kan bijvoorbeeld een opgeslagen retouradres overschrijven. Verdedigingsmechanismen van het besturingssysteem beperken wat een aanvaller met die fout kan doen; ze herstellen de foutieve schrijfbewerking niet.
Scheid gegevens van uitvoerbare code
De NX-bit markeert gegevenspagina's als niet-uitvoerbaar. Windows noemt dit Data Execution Prevention (DEP). Instructies in een stackbuffer injecteren is minder nuttig als ernaartoe springen een fout veroorzaakt.
W^X, schrijven xor uitvoeren, is strenger: geen enkele pagina is tegelijk beschrijfbaar en uitvoerbaar. DEP alleen verbiedt een programma niet om expliciet zo'n koppeling aan te vragen. Onder W^X schrijft een just-in-timecompiler gegenereerde code naar beschrijfbaar geheugen en wijzigt daarna de rechten voordat hij de code uitvoert.
Een aanvaller kan in plaats daarvan bestaande uitvoerbare instructies hergebruiken. Retourgeoriënteerd programmeren (ROP) rijgt korte instructiereeksen, gadgets genoemd, aaneen. Willekeurige indeling van de adresruimte (ASLR) verandert de locaties van stacks, heaps, bibliotheken en positieonafhankelijke programma's, waardoor adressen van gadgets moeilijk te voorspellen zijn.
Als de basis van een bibliotheek met gelijke kans uit posities wordt gekozen, slaagt één blinde gok met een kans van 1 op 268.435.456. Met slechts posities en een indeling die na crashes van werkprocessen behouden blijft, zijn bij het proberen van verschillende posities maximaal 256 pogingen nodig en gemiddeld 128,5. Een uitgelekt adres binnen een bekende bibliotheek onthult de basis en de offsets van gadgets in die bibliotheek. Een afzonderlijk gerandomiseerde stack kan nog steeds onbekend blijven.
Beperk de diensten die een aanvaller kan aanvragen
seccomp-filters van Linux beperken de systeemaanroepen die een proces mag doen. Een proces dat voor een browser pagina's weergeeft, kan bijvoorbeeld aanroepen worden geweigerd om programma's te starten of rechtstreeks bestanden te openen. Filters worden door kindprocessen geërfd en kunnen niet worden verwijderd; latere filters kunnen beperkingen aanscherpen. Een overgenomen weergaveproces beschikt nog steeds over de toegestane bewerkingen, dus een filter vormt een grens rond diensten en is geen bewijs dat het programma foutvrij is. pledge van OpenBSD en de App Sandbox van macOS bieden verwante beperkingen.
Controleer het opstarten en bewaar bewijsmateriaal
Beveiligd opstarten controleert handtekeningen in de opstartketen. Firmware controleert een vertrouwde opstartlader; de lader controleert de kernel; de kernel kan ondertekende modules vereisen. Een gewijzigde component zonder vertrouwde handtekening wordt geweigerd. Dit helpt blijvende wijzigingen aan opstartsoftware tegen te houden, maar een geldige handtekening bewijst niet dat de software geen kwetsbaarheden heeft.
Opstarten met integriteitsmetingen legt hashes van geladen componenten vast, meestal met een Trusted Platform Module (TPM). Deze metingen ondersteunen attestatie: een andere partij kan wat is gestart vergelijken met een verwachte toestand. Meten en weigeren te starten zijn verschillende bewerkingen.
Registratie in een auditlogboek legt aanmeldingen, mislukte authenticatie, geweigerde toegangsverzoeken, accountwijzigingen en geprivilegieerde handelingen zoals sudo vast. Logboeken ondersteunen detectie en reconstructie. Een aanvaller die een host beheerst, kan lokale registraties wissen. Beschermde registratie of registratie op afstand bewaart daarom bewijsmateriaal buiten die host.
Aanvallers kunnen een adreslek, een geheugenbeschadigingsfout en een ontsnapping uit een sandbox combineren. Updates verwijderen de onderliggende kwetsbaarheden die deze verdedigingsmechanismen laten bestaan.
Belangrijkste punten
- NX blokkeert uitvoering vanaf gemarkeerde gegevenspagina's; W^X verbiedt ook gelijktijdig schrijf- en uitvoerrecht.
- ASLR maakt adressen voor codehergebruik moeilijker te voorspellen.
- Een uitgelekt bibliotheekadres hoeft afzonderlijk gerandomiseerde gebieden niet te onthullen.
- Systeemaanroepfilters beperken de diensten die voor een overgenomen proces beschikbaar zijn.
- Beveiligd opstarten controleert het vertrouwen in opstartcomponenten; opstarten met integriteitsmetingen legt vast wat is geladen.
- Auditlogboeken ondersteunen detectie en reconstructie, dus bescherm ze tegen verwijdering.
2Authenticeer gebruikers en geef processen een identiteit
Een gebruikersnaam wordt pas bruikbaar voor de kernel wanneer die is gekoppeld aan betrouwbare identificatiegegevens van een proces. Volg een aanmelding tot een draaiende shell, inclusief de zorgvuldige omgang met hulpprogramma's met verhoogde privileges. Onderzoek daarna hoe wachtwoordhashes met salts gestolen verificatiegegevens moeilijker aan te vallen maken en hoe sleutels, tijdgebonden codes en biometrie het identiteitsbewijs veranderen voordat de normale toegangscontroles beginnen.
2.1 Koppel identiteiten aan processen
Een geslaagde aanmelding koppelt de identiteit van een persoon aan procesidentificatiegegevens die de kernel bewaart. Authenticatie controleert de opgegeven identiteit; autorisatie bepaalt wat die identiteit mag doen. Een beveiligingssubject kan een persoon of een serviceaccount zijn, en processen handelen namens dat subject.
Geef identiteit mee aan draaiende programma's
Unix-achtige systemen identificeren gebruikers met numerieke UID's en groepen met GID's. /etc/passwd koppelt namen aan UID's, persoonlijke directory's en shells. De kernel vergelijkt de nummers: twee accountnamen met één UID zijn voor toegangscontroles één identiteit. UID 0 is root en omzeilt de meeste gewone toegangscontroles.
Windows gebruikt beveiligingsidentificaties (SID's) voor gebruikers en groepen. Het toegangstoken van een proces legt de gebruikers-SID, groeps-SID's en privileges vast. Op beide platforms leveren de identificatiegegevens van het draaiende programma de identiteit voor latere beslissingen.
Een typische aanmelding met een wachtwoord onder Linux verloopt als volgt:
- Een geprivilegieerde aanmeldservice, zoals
login,sshdof een grafische aanmeldbeheerder, ontvangt de identificatiegegevens. - PAM, Pluggable Authentication Modules, controleert die via geconfigureerde authenticatiemodules.
- De service stelt de aanvullende groepen en GID van de gebruiker in en wijzigt daarna de UID om afstand te doen van rootrechten.
- De service start de shell. Kindprocessen erven deze identificatiegegevens via
fork()en behouden ze normaal naexecve().
De volgorde is van belang. Als het proces afstand doet van rootrechten voordat de groepen zijn ingesteld, kan het de geërfde lijst met geprivilegieerde groepen mogelijk niet meer vervangen. Ook worden bij het wijzigen van de groepslidmaatschappen van een account de identificatiegegevens van al draaiende processen niet herschreven; een nieuwe aanmeldsessie krijgt de nieuwe lijst.
Begrijp een gecontroleerde privilegewijziging
Een proces heeft een werkelijke UID, die normaal aangeeft wie het heeft gestart; een effectieve UID, die voor de meeste toegangscontroles wordt gebruikt; en een opgeslagen set-user-ID, die gecontroleerde terugkeer na een tijdelijke verlaging ondersteunt. Bij gewone programma's zijn alle drie gelijk.
Het aan root toebehorende /usr/bin/passwd illustreert setuid. De rechtennotatie 4755, weergegeven als -rwsr-xr-x, maakt de effectieve UID root wanneer een gewone gebruiker het uitvoert. Als alice UID 1000 heeft, blijft haar werkelijke UID 1000 terwijl de effectieve UID 0 wordt. Het programma kan /etc/shadow bijwerken en gebruikt de werkelijke identiteit van de aanroeper om te beperken van wie het wachtwoord mag worden gewijzigd. Een uitvoerbaar setgid-bestand verandert op vergelijkbare wijze de effectieve groep.
Dat kleine vertrouwde programma bezit gevaarlijke bevoegdheden. Een fout kan rootrechten blootstellen, dus beperken systemen het aantal setuid-programma's en doen ze vroeg afstand van privileges. Voor een service die alleen een poort met een laag nummer nodig heeft, verleent CAP_NET_BIND_SERVICE een beperkter Linux-privilege dan volledige rootrechten.
Beheer zonder één identiteit te delen
sudo authenticeert de aanroepende gebruiker, controleert welke commando's die gebruiker als welke doelidentiteit mag uitvoeren en legt het gebruik vast. Het beleid staat meestal in /etc/sudoers. Afzonderlijke identiteiten zorgen voor individuele verantwoording, die bij het delen van een rootwachtwoord verloren gaat. Onder Windows start UAC de programma's van een beheerder normaal met een gefilterd token en vraagt het om toestemming voor verhoging van privileges.
Dagelijkse toepassingen moeten met gewone rechten draaien en services moeten eigen accounts hebben zoals www-data. Een overgenomen documentviewer erft dan die beperkte identificatiegegevens in plaats van de volledige bevoegdheden van een beheerder.
Belangrijkste punten
- Authenticatie stelt de identiteit vast; autorisatie controleert rechten.
- Unix controleert numerieke UID's en GID's; Windows gebruikt SID's en tokens.
- Stel groepen in voordat je definitief afstand doet van het privilege om ze te wijzigen.
- De effectieve UID wordt gebruikt voor de meeste Unix-toegangscontroles.
- Setuid-hulpprogramma's moeten zorgvuldig controleren omdat ze verhoogde bevoegdheden hebben.
- Bestaande processen behouden hun oude groepslijst na een wijziging van het account.
2.2 Sla wachtwoorden veilig op en controleer ze veilig
Een wachtwoordverificatiesysteem moet een correct wachtwoord herkennen zonder een terug te halen kopie op te slaan. Het slaat een wachtwoordhash op met de informatie die nodig is om de controle te herhalen. Bij het aanmelden berekent het de hash opnieuw uit het ingevoerde wachtwoord en vergelijkt het de resultaten; het ontsleutelt de opgeslagen hash nooit.
Bescherm de opgeslagen verificatiegegevens
Onder Linux bevat /etc/shadow beschermde wachtwoordhashes. Het breed leesbare /etc/passwd bevat accountinformatie en een x op de plaats van het wachtwoord. Een wachtwoordveld in shadow vermeldt een algoritme-identificatie, kostenparameters, een salt en de resulterende hash. $y$ staat voor yescrypt, dat standaard wordt gebruikt in Debian 11, Ubuntu 22.04, Fedora 35 en latere versies; $6$ staat voor SHA-512-crypt.
Een gestolen hashbestand maakt een offlineaanval mogelijk. De aanvaller hasht gokpogingen op afzonderlijke hardware zonder de vertragingen van de aanmeldservice. Een bruteforceaanval probeert tekenreeksen systematisch; een woordenboekaanval begint met waarschijnlijke woorden, uitgelekte wachtwoorden en varianten zoals “Wachtwoord1!”.
Voor precies acht kleine letters zijn tekenreeksen mogelijk. Bij pogingen per seconde duurt het ongeveer 21 seconden om alle mogelijkheden te doorzoeken. Bij pogingen per seconde duurt het ongeveer seconden, ongeveer 242 dagen. Dit zijn tijden voor een volledige doorzoeking, geen garanties voor een afzonderlijk wachtwoord. Twaalf kleine letters geven ongeveer tekenreeksen, zelfs bij de hogere snelheid ongeveer 110 dagen.
Maak elk account kostbaar om aan te vallen
Een salt is een nieuwe willekeurige waarde die naast elke wachtwoordhash wordt opgeslagen. Die zorgt dat gelijke wachtwoorden verschillende hashes opleveren en maakt herbruikbare vooraf berekende tabellen onbruikbaar. De salt is openbaar; zijn taak is afzonderlijk werk voor verschillende accounts af te dwingen.
Neem 1.000 accounts en een lijst met gokpogingen, gecontroleerd met hashes per seconde. Zonder salts duurt het 100 seconden om de lijst één keer te berekenen en kan die voor alle accounts worden gebruikt. Unieke salts vereisen berekeningen, ongeveer seconden of 27,8 uur. Een veelvoorkomend wachtwoord kan nog steeds aan het begin van de lijst worden gevonden.
Wachtwoordhashmethoden zoals bcrypt, scrypt, yescrypt, Argon2 en PBKDF2 hebben instelbare rekenkosten. Scrypt, yescrypt en Argon2 brengen ook geheugenkosten met zich mee. Bij een praktische aanmelding is een fractie van een seconde aanvaardbaar; een grote gokaanval herhaalt die kosten miljoenen keren. Eén snelle SHA-256-berekening mist deze bewuste kostenfactor.
Richt het aanmeldbeleid in op gokaanvallen
NIST SP 800-63B-4 (2025) vereist salts van ten minste 32 bits en een wachtwoordhashkostenfactor die zo hoog is als praktisch haalbaar. De wachtwoordrichtlijn vereist ten minste 15 tekens voor authenticatie met alleen een wachtwoord, of ten minste acht wanneer het wachtwoord deel uitmaakt van MFA, en beveelt aan ten minste 64 tekens te accepteren.
De richtlijn wijst verplichte combinaties zoals één cijfer en één symbool en routinematige verplichte wachtwoordwijzigingen af. Ze vereist dat veelvoorkomende of gecompromitteerde keuzes worden geblokkeerd, online gokpogingen worden beperkt en een wijziging wordt afgedwongen wanneer compromittering duidelijk is. Snelheidslimieten voor online pogingen beschermen de actieve service; trage hashing met salts beschermt gestolen verificatiegegevens. Een langer wachtwoord dat voorspelbaar uit een veelgebruikte lijst wordt gekozen, kan nog steeds zwak zijn.
Belangrijkste punten
- Bij het aanmelden wordt een wachtwoordhash opnieuw berekend; er wordt geen wachtwoord ontsleuteld.
- Offline gokken omzeilt de snelheidslimieten van de actieve aanmeldservice.
- Een unieke openbare salt voorkomt hergebruik van hashwerk tussen accounts.
- Een instelbare kostenfactor maakt elke gok kostbaar.
- Wachtwoordlengte en blokkeerlijsten helpen meer dan voorspelbare samenstellingsregels.
2.3 Authenticeer met wat je hebt en wat je bent
Wachtwoorden bewijzen kennis. Andere authenticatiemiddelen bewijzen bezit van een voorwerp of een lichamelijk kenmerk. Het besturingssysteem koppelt uiteindelijk de geauthenticeerde identiteit aan processen, maar de weg naar die identiteit bepaalt mede hoe gemakkelijk een aanvaller zich als de gebruiker kan voordoen.
Combineer verschillende factortypen
De drie factortypen zijn iets wat je weet, zoals een wachtwoord of pincode; iets wat je hebt, zoals een telefoon, smartcard of beveiligingssleutel; en iets wat je bent, zoals een vingerafdruk. Multifactorauthenticatie (MFA) combineert verschillende typen. Een wachtwoord plus een beveiligingsvraag herhaalt de kennisfactor.
Tijdgebonden eenmalige wachtwoorden (TOTP) gebruiken een gedeeld geheim en een tijdstap, meestal 30 seconden, om overeenkomende codes te maken op een authenticatiemiddel en een server. RFC 6238 definieert de methode. Een code verloopt snel, maar een valse aanmeldpagina kan een verse code doorgeven voordat die verloopt. Appcodes voorkomen simkaartfraude; sms-codes zijn afhankelijk van de controle over het telefoonnummer en kunnen worden omgeleid als dat wordt overgenomen.
Bewijs bezit zonder de sleutel te versturen
Een authenticatiemiddel met een publieke sleutel ondertekent een nieuwe uitdaging met een privésleutel. De server verifieert die met een opgeslagen publieke sleutel, die zelf niet opnieuw kan worden gebruikt om een aanmelding te ondertekenen. FIDO2-beveiligingssleutels en passkeys koppelen de authenticatie ook aan de identiteit van de site, zodat een antwoord voor een valse site niet kan authenticeren bij de echte site. Een gewone SSH-sleutel bewijst ook bezit, maar je mag er niet van uitgaan dat die hetzelfde mechanisme voor binding aan een website heeft.
De opslag verandert het risico. Apparaatgebonden sleutels in een hardwarebeveiligingssleutel, TPM of beveiligde enclave ondertekenen binnen de hardware zonder de privésleutel prijs te geven. Gesynchroniseerde passkeys kopiëren versleuteld sleutelmateriaal tussen apparaten via een platformaccount. Dat maakt herstel eenvoudiger, maar brengt dat account binnen de vertrouwensgrens. Een gewone SSH-privésleutel is een bestand dat wordt beschermd door toegangsrechten en eventueel een wachtwoordzin.
Interpreteer biometrische fouten
Een biometrisch systeem vergelijkt gemeten kenmerken met een opgeslagen sjabloon. Het accepteert wanneer een overeenkomstscore een drempel bereikt; het vereist niet elke keer een identieke afbeelding.
| Percentage | Populatie die als noemer wordt gebruikt | Getelde fout |
|---|---|---|
| Foutacceptatiepercentage (FAR) | Pogingen van onbevoegden | Geaccepteerde onbevoegden |
| Foutafwijzingspercentage (FRR) | Pogingen van bevoegde gebruikers | Afgewezen bevoegde gebruikers |
Twee geaccepteerde onbevoegden op 10.000 geven een FAR van 0,02%. Dertig afwijzingen op 1.000 pogingen van bevoegde gebruikers geven een FRR van 3%. Een hogere overeenkomstsdrempel verlaagt FAR en verhoogt FRR. Een strengere overeenkomst vermindert het aantal geslaagde pogingen om zich als iemand anders voor te doen, maar maakt herhaalde pogingen van bevoegde gebruikers gebruikelijker.
Een uitgelekt biometrisch kenmerk kan niet zoals een wachtwoord worden gewijzigd, en sensoren hebben bescherming nodig tegen foto's of gekopieerde vingerafdrukken. Een nuttig ontwerp gebruikt biometrie lokaal om een beschermde sleutel te ontgrendelen en stuurt alleen een handtekening naar de server.
Authenticeer ook processen
Voor een lokale Unix-domeinverbinding haalt Linux met SO_PEERCRED identificatiegegevens van de andere partij bij de kernel op in plaats van een naam te vertrouwen die de client stuurt. Tussen machines gebruiken services sleutels, certificaten of tokens die zijn opgeslagen met beperkte toegang voor het serviceaccount. Na het aanmelden gebruiken gewone toegangscontroles van het besturingssysteem de UID of het toegangstoken; ze vragen niet of de gebruiker een wachtwoord heeft getypt of een sleutel heeft aangeraakt.
Belangrijkste punten
- MFA combineert verschillende factortypen, niet alleen twee vragen.
- TOTP-codes kunnen worden doorgestuurd zolang ze geldig zijn.
- Aanmelden met een publieke sleutel bewijst bezit zonder de privésleutel te versturen.
- FIDO2 koppelt authenticatie aan de bedoelde site.
- FAR en FRR gebruiken verschillende populaties van pogingen.
- Een strengere biometrische drempel levert minder acceptaties van onbevoegden op, maar meer afwijzingen van bevoegde gebruikers.
- Identificatiegegevens van een lokale andere partij moeten van de kernel komen.
3Regel de toegang tot bestanden en andere bronnen
Voor een geauthenticeerde identiteit is nog steeds een beslissing nodig over elke bron die ze aanvraagt. Geef rechten weer in een toegangsmatrix en vergelijk daarna lijsten bij objecten met tokens die processen bezitten. Werk bestands- en directoryrechten door voordat je verplicht beleid en functierollen toevoegt. Bij hetzelfde verzoek kunnen een geopende handle, gewone rechtenbits en een centraal afgedwongen grens voor een service betrokken zijn.
3.1 Vergelijk toegangscontrolelijsten en bevoegdheidstokens
Een toegangsbeslissing heeft drie onderdelen: een subject vraagt om een bewerking op een object uit te voeren. Het subject is meestal een proces dat namens een beveiligingssubject handelt; objecten zijn onder meer bestanden, apparaten en andere processen. Een toegangsmatrix geeft de rechten weer in cellen, met subjecten als rijen en objecten als kolommen.
Sla dezelfde rechten op twee manieren op
Stel dat alice report.txt kan lezen en beschrijven, bob het alleen kan lezen en de back-upservice zowel report.txt als payroll.db kan lezen. Bob kan ook payroll.db lezen en beschrijven. Alice en bob mogen de printer gebruiken; de back-upservice niet. De meeste cellen in de veel grotere matrix van een werkelijk systeem zijn leeg.
Een toegangscontrolelijst (ACL) slaat een kolom op bij het bijbehorende object. De lijst bij report.txt vermeldt alice, bob en backup met hun respectieve rechten. Een lijst met bevoegdheidstokens slaat een rij op bij het subject. Bob bezit tokens om het rapport te lezen, de salarisadministratie te lezen en te beschrijven en de printer te gebruiken.
| Vraag | ACL | Lijst met bevoegdheidstokens |
|---|---|---|
| Wie mag dit object gebruiken? | Bekijk de lijst ervan | Zoek alle houders |
| Wat mag dit subject gebruiken? | Bekijk veel objecten | Bekijk de tokens ervan |
| Hoe worden beperkte rechten gedelegeerd? | Voeg vermeldingen toe of wijzig ze | Geef geselecteerde tokens door zonder extra rechten |
| Wat maakt intrekking moeilijk? | Eerder verleende handles kunnen blijven bestaan | Kopieën van tokens kunnen zijn verspreid |
Een bevoegdheidstoken vermeldt zowel een object als toegestane bewerkingen en kan niet door de houder worden vervalst of uitgebreid. Toegestaan kopiëren en delegeren zijn mogelijk. De kernel kan het echte token bewaren terwijl gebruikerscode een index bezit; een ander ontwerp beschermt een token cryptografisch.
Volg een descriptor na het openen
Unix combineert beide benaderingen. open() controleert de aanroeper aan de hand van de toegangsrechten van het bestand en retourneert daarna een bestandsdescriptor die de verleende toegang vastlegt. Latere lees- en schrijfbewerkingen controleren die geopende handle. Een kindproces kan die erven via fork(), of een proces kan die via een Unix-domeinsocket ontvangen.
Alice opent app.log om te schrijven. De eigenaar wijzigt de rechtennotatie in 444. De al geopende descriptor van alice kan nog steeds schrijven; een nieuwe poging om het bestand voor schrijven te openen krijgt met de nieuwe rechten te maken. De ACL bijwerken die toekomstige openingen regelt, trekt niet elk al uitgegeven bevoegdheidstoken in. Windows-handles volgen hetzelfde algemene patroon.
Capsicum van FreeBSD maakt dit bruikbaar voor afscherming. Na cap_enter() kan een proces geen willekeurig absoluut pad openen. Het kan werken via bestaande descriptoren, descriptoren ontvangen en openat() gebruiken onder een directorydescriptor die het bezit. Een ouderproces kan een werkproces daardoor precies de bestanden geven die het nodig heeft. Kernels gebaseerd op bevoegdheidstokens, zoals seL4 en Fuchsia, breiden het idee uit naar kernelobjecten in het algemeen.
Onderscheid de andere betekenis van capability in Linux
Afzonderlijke Linux-privileges verdelen de privileges van root in categorieën. CAP_NET_BIND_SERVICE staat het binden van poorten met lage nummers toe; CAP_DAC_OVERRIDE omzeilt gewone toegangscontroles voor bestanden. Deze privileges wijzen niet één specifiek object aan en verschillen daarom van een bevoegdheidstoken in een toegangsmatrix. Eén Linux-privilege kan een klasse van bewerkingen op veel objecten toestaan.
Belangrijkste punten
- ACL's ordenen rechten per object; lijsten met bevoegdheidstokens ordenen ze per subject.
- Een bevoegdheidstoken kan niet door de houder worden vervalst of uitgebreid.
- Descriptoren behouden de toegang die is verleend toen een object werd geopend.
- De rechtennotatie van een bestand wijzigen trekt bestaande descriptoren normaal niet in.
- Afzonderlijke Linux-privileges verdelen rootprivileges en wijzen geen afzonderlijke objecten aan.
3.2 Lees en stel toegangsrechten in voor Unix en Windows
Unix-rechten koppelen rechten aan de eigenaar, de groep van de eigenaar en alle anderen. Om over toegang te beslissen, bepaal je eerst de bewerking en het relevante object. Bestandsinhoud lezen, een directory doorzoeken en een naam verwijderen vereisen verschillende rechten.
Ontcijfer en selecteer de bits
Lezen is 4, schrijven 2 en uitvoeren 1. Tel deze waarden voor elke klasse op: 754 betekent rwxr-xr--; 640 betekent rw-r-----. chmod 640 notes.txt stelt de rechtennotatie in, terwijl chmod g+w,o-r notes.txt geselecteerde bits wijzigt. De eigenaar of root mag de rechtennotatie wijzigen; de eigenaar wijzigen vereist rootbevoegdheid, onder Linux vertegenwoordigd door CAP_CHOWN.
De kernel kiest de eerste overeenkomende klasse: eigenaar als de effectieve UID overeenkomt, anders groep als een groep van het proces overeenkomt, anders anderen. Hij combineert geen klassen en probeert geen ruimere klasse. Alice bezit een bestand met rechtennotatie 077: de eigenaarbits zijn leeg, dus kan zij het niet lezen, ook al hebben groep en anderen volledige rechten. Als eigenaar kan zij de rechtennotatie nog steeds wijzigen.
Root omzeilt normaal lees- en schrijfcontroles. Om een gewoon bestand onder de gebruikelijke discretionaire controles van Linux uit te voeren, moet ten minste één uitvoerbit zijn ingesteld. Verplicht beleid kan verdere beperkingen opleggen.
Interpreteer directorybits en speciale bits
Leesrecht op een directory laat namen zien; uitvoerrecht staat doorzoeken en opzoeken toe; schrijfrecht samen met uitvoerrecht staat aanmaken, verwijderen en hernoemen van vermeldingen toe. Een naam verwijderen wijzigt de directory ervan, zodat een bestand met rechtennotatie 000 kan worden verwijderd door iemand met de benodigde directoryrechten.
Setuid voegt octaal 4000 toe aan de rechtennotatie van een uitvoerbaar bestand en wijzigt de effectieve gebruikersidentiteit bij uitvoering. Setgid voegt 2000 toe en wijzigt op vergelijkbare wijze de groep; op een directory zorgt het dat nieuwe bestanden de groep van de directory erven. De stickybit voegt 1000 toe. Een directory zoals /tmp, met rechtennotatie 1777, staat verwijderen of hernoemen alleen toe aan de bestandseigenaar, de directoryeigenaar of een geprivilegieerd proces, waarbij de gewone directoryrechten nog steeds vereist zijn.
Verwijder bits bij het aanmaken van bestanden
Een umask wist bits uit de rechtennotatie die een programma aanvraagt. Het is een bitbewerking, geen octale aftrekking. Bij de gebruikelijke aanvragen van 666 voor bestanden en 777 voor directory's:
| Umask | Nieuw bestand | Nieuwe directory |
|---|---|---|
| 022 | 644 | 755 |
| 027 | 640 | 750 |
| 000 | 666 | 777 |
Een umask kan geen uitvoerrechten toevoegen die in de bestandsaanvraag ontbraken.
Lees uitgebreidere toegangslijsten
POSIX-ACL's voegen genoemde gebruikers en groepen toe. setfacl -m u:bob:r report.txt geeft bob een leesvermelding op naam; getfacl toont die en ls -l markeert de uitgebreide ACL met +. Het ACL-masker beperkt genoemde gebruikers, genoemde groepen en de groep van de eigenaar, zodat een vermelding op naam meer rechten kan tonen dan effectief zijn.
Windows NTFS gebruikt een beveiligingsdescriptor met een eigenaar-SID en een DACL van geordende ACE's die rechten toestaan of weigeren. De beoordeling stopt wanneer een gevraagd recht wordt geweigerd of alle gevraagde rechten zijn verleend; rechten die niet zijn verleend, worden geweigerd. De voorkeursvolgorde plaatst expliciete vermeldingen vóór geërfde vermeldingen, met weigeringen vóór toestemmingen binnen elke groep. Een expliciete toestemming kan daardoor een verzoek afhandelen voordat een geërfde weigering wordt bereikt. Een afzonderlijke SACL selecteert toegangsgebeurtenissen voor registratie in het auditlogboek.
Belangrijkste punten
- Kies de overeenkomende Unix-rechtenklasse voordat je de bits ervan controleert.
- Directoryrechten regelen namen; bestandsrechten regelen bestandsinhoud.
- De stickybit voegt een eigenaarscontrole toe voor verwijderen en hernoemen.
- Een umask wist aangevraagde bits en voegt ze nooit toe.
- Het POSIX-ACL-masker begrenst de groepsklasse en vermeldingen op naam.
- De beoordeling van een Windows-DACL hangt af van de volgorde van ACE's.
- Een SACL selecteert wat wordt vastgelegd in plaats van toegang te verlenen.
3.3 Vergelijk discretionaire, verplichte en rolgebaseerde toegangscontrole
Verschillende modellen voor toegangscontrole beantwoorden verschillende beheervragen. Wie mag toegang verlenen? Kan een gecompromitteerd programma gegevens van een gebruiker delen? Hoe kan een beheerder de rechten van veel medewerkers wijzigen zonder elk bestand te bewerken? Eén besturingssysteem kan meerdere modellen op hetzelfde verzoek toepassen.
Onderscheid de keuze van de eigenaar van systeembeleid
Bij discretionaire toegangscontrole (DAC) beslist de eigenaar van een object wie het mag gebruiken. Unix-rechtennotaties en ACL's zijn bekende mechanismen. Het zwakke punt is dat een kwaadaardig programma dat als de gebruiker handelt, de rechten van die gebruiker kan uitoefenen, inclusief het elders naartoe kopiëren van leesbare gegevens.
Bij verplichte toegangscontrole (MAC) beperkt het systeembrede beleid van een beheerder de toegang onafhankelijk van de wensen van de eigenaar. De kernel past MAC toe naast DAC. Beide controles moeten toegang toestaan, dus een ruime bestandsrechtennotatie gaat niet boven een verplichte weigering.
Het Bell–LaPadula-model beschermt vertrouwelijkheid met geordende niveaus en twee regels: niet omhoog lezen en niet omlaag schrijven. Een proces op niveau Geheim kan vertrouwelijke gegevens lezen en naar een zeer geheime bestemming schrijven. Het kan geen zeer geheime gegevens lezen of vertrouwelijke gegevens schrijven. Een programma kan informatie niet van Geheim naar Vertrouwelijk verplaatsen door die simpelweg te lezen en opnieuw te schrijven. Biba keert de lees- en schrijfrichtingen om om integriteit te beschermen.
Beperk een service ook wanneer die root is
SELinux geeft bestanden een label met een type en voert processen uit in domeinen. Het beleid vermeldt welk domein welke bewerkingen op elk type mag uitvoeren; niet-vermelde toegang wordt geweigerd. Een webserver in httpd_t mag pagina's met het label httpd_sys_content_t lezen, terwijl toegang tot user_home_t wordt geblokkeerd, zelfs als gewone Unix-rechten het lezen toestaan. ls -Z toont labels.
In afdwingende modus blokkeert SELinux schendingen en legt die vast. In toelatende modus legt het schendingen vast zonder ze te blokkeren. Root in een beperkt domein moet nog steeds aan het afdwingende beleid voldoen. UID 0 en onbeperkte toegang zijn daarom verschillende beweringen.
AppArmor beperkt programma's met profielen op basis van bestandspaden en toegestane afzonderlijke Linux-privileges. Het wordt vaak gebruikt op Ubuntu en SUSE. SELinux en AppArmor werken via aanknopingspunten van Linux-beveiligingsmodules (LSM) bij beveiligingsbeslissingen. Android combineert appspecifieke UID's met SELinux; systemen van Apple gebruiken ook sandboxprofielen voor toepassingen.
Wijs functies toe in plaats van afzonderlijke rechten
Bij rolgebaseerde toegangscontrole (RBAC) worden rechten aan rollen gekoppeld en krijgen gebruikers rollen toegewezen. Als iemand van functie verandert, wijzigen de roltoewijzingen in plaats van veel afzonderlijke objectrechten.
Stel dat 50 medewerkers elk 20 rechten nodig hebben. Directe toewijzing vereist 1.000 koppelingen tussen gebruikers en rechten. Als vijf rollen elk 20 rechten hebben en elke medewerker één rol heeft, vereist het beheer 50 koppelingen tussen gebruikers en rollen en 100 koppelingen tussen rollen en rechten: 150 in totaal. De besparing komt door gedeelde functiepatronen, niet door vereiste rechten te verwijderen.
Windows-groepen die als rollen worden gebruikt en groepsgebaseerd sudo-beleid passen dit patroon toe. DAC is geschikt voor bestanden die door eigenaren worden beheerd, MAC beperkt services met centraal afgedwongen regels en RBAC ordent administratieve toewijzingen. Een service kan zijn functierechten via een rol krijgen terwijl DAC en MAC beide de daadwerkelijke bestandstoegang controleren.
Belangrijkste punten
- Met DAC kiezen eigenaren de toegang; MAC dwingt een systeembreed beleid af.
- Een verzoek moet zowel de DAC-controle als de afdwingende MAC-controle doorstaan.
- Bell–LaPadula blokkeert omhoog lezen en omlaag schrijven.
- SELinux-domeinen en -typen kunnen rootprocessen beperken.
- RBAC beheert rechten via functierollen.
4Voer besturingssystemen uit in virtuele machines
Meerdere kernels op één computer uitvoeren voegt een beschermingslaag onder het besturingssysteem toe. Een hypervisor moet de eigen omgeving van elk gastbesturingssysteem behouden en tegelijk de controle over fysieke CPU-tijd, geheugen en apparaten houden. Volg de mechanismen van onderschepte instructies tot adresvertaling in twee fasen en vergelijk daarna apparaatinterfaces en de resterende manieren waarop een gastbesturingssysteem zijn host kan beïnvloeden.
4.1 Beschrijf virtuele machines en hypervisors
Een virtuele machine (VM) geeft een volledig besturingssysteem een schijnbaar eigen computer. Dat besturingssysteem is het gastbesturingssysteem. De fysieke computer is de host en de hypervisor, of monitor voor virtuele machines (VMM), wijst echte processortijd, geheugen en apparaten toe aan de gastbesturingssystemen.
Behoud het gedrag en houd de controle
Het model van Popek en Goldberg uit 1974 onderscheidt drie eigenschappen. Equivalentie betekent dat programma's zich gedragen zoals op een echte machine, afgezien van timing en beschikbare bronnen. Bronbeheer betekent dat de hypervisor de hardware blijft besturen. Efficiëntie betekent dat de meeste instructies van het gastbesturingssysteem rechtstreeks op de processor worden uitgevoerd.
De hypervisor plant virtuele CPU's (vCPU's) op fysieke processorkernen. Een machinewisseling slaat de volledige uitvoeringstoestand van één VM op, inclusief geprivilegieerde registers en interruptinstellingen, en herstelt vervolgens die van een andere VM. Een gastbesturingssysteem ziet zijn eigen toestand, ook wanneer het een fysieke processorkern met andere gastbesturingssystemen deelt.
| Ontwerp | Waar de hypervisor draait | Voorbeelden |
|---|---|---|
| Type 1, rechtstreeks op hardware | Beheert de hardware rechtstreeks | ESXi, Xen, Hyper-V |
| Type 2, op een host | Draait als toepassing op een hostbesturingssysteem | VirtualBox, VMware Workstation, Parallels Desktop |
KVM maakt van de Linux-kernel zelf een hypervisor en wordt meestal als type 1 ingedeeld. Een volledige Linux-host blijft beschikbaar, waardoor het eenvoudige onderscheid tussen twee typen minder duidelijk is. Bepaal om de bescherming te begrijpen welke component de CPU- en geheugenvirtualisatie daadwerkelijk beheert.
Gebruik de machineabstractie
Serverconsolidatie brengt licht gebruikte systemen samen. Twaalf servers die elk gemiddeld 5% van een computer met acht processorkernen gebruiken, hebben samen 60% van één zo'n computer nodig. Dat gemiddelde suggereert dat consolidatie mogelijk is, maar voor gelijktijdige pieken en de vraag naar RAM en apparaten blijft reservecapaciteit nodig.
Een momentopname slaat de toestand van een VM op om die later te herstellen. Alleen een schijfimage kopiëren legt een draaiende CPU en het geheugen daarvan niet vast. Livemigratie verplaatst een draaiende VM naar een andere host door geheugen te kopiëren en de uitvoering na een korte pauze over te schakelen. Deze bewerkingen zijn mogelijk omdat de machinetoestand van het gastbesturingssysteem wordt weergegeven als gegevens die de hypervisor beheert.
VM's ondersteunen ook het testen van oude systemen, het scheiden van conflicterende software en het uitvoeren van verschillende besturingssystemen op compatibele hardware. Een VM met een Windows-gastbesturingssysteem kan naast een Linux-gastbesturingssysteem draaien, elk met een eigen kernel. Cloudserverinstanties gebruiken vaak deze grens.
Onderscheid virtualisatie van volledige emulatie
Een emulator kan een instructieset voor een andere processor interpreteren of vertalen, zoals ARM-code op x86. Hardwarevirtualisatie voert gastinstructies normaal rechtstreeks op een compatibele processor uit en grijpt in bij gevoelige gebeurtenissen. Dat verklaart zowel de snelheid als de noodzaak van CPU-ondersteuning.
Afzonderlijke gastkernels vormen een bruikbare grens: de overname van één gastkernel geeft niet rechtstreeks controle over de hostkernel. De grens hangt nog steeds af van correcte code in de hypervisor en het apparaatmodel. Een ontsnapping uit een virtuele machine maakt misbruik van die laag, terwijl een zijkanaal gegevens via gedeelde hardware kan lekken zonder gewone geheugentoegang te verlenen. Een VM kiezen vermindert de interfaces die aan een niet-vertrouwd gastbesturingssysteem worden blootgesteld; gedeelde hardware wordt er niet onfeilbaar door.
Belangrijkste punten
- Een VM presenteert een volledige machine aan zijn gastbesturingssysteem.
- Equivalentie, bronbeheer en efficiëntie beschrijven de taak van een VMM.
- Een vCPU wordt op een fysieke CPU ingepland.
- Momentopnamen en migratie zijn afhankelijk van het opslaan en overdragen van de machinetoestand.
- Consolidatie vereist reservecapaciteit voor piekbelasting, niet alleen een laag gemiddelde.
- VM-isolatie hangt af van de correcte werking van de hypervisor, het apparaatmodel en de hardware.
4.2 Virtualiseer de processor
Een gastkernel verwacht zijn machine te besturen. De hypervisor moet die schijn ophouden zonder de echte computer over te dragen. CPU-virtualisatie laat gewone gastinstructies rechtstreeks uitvoeren en onderschept bewerkingen die een wijziging van de toestand van de virtuele machine vereisen.
Onderschep en emuleer de virtuele toestand
Bij klassiek onderscheppen en emuleren draait de gastkernel met verlaagde privileges. Een poging om een paginatabelregister te laden of een traptabel te installeren veroorzaakt een trap naar de hypervisor. De hypervisor werkt het virtuele register of de virtuele tabel van het gastbesturingssysteem bij en hervat de uitvoering. Hij laat het gastbesturingssysteem de echte besturingsstructuren van de hypervisor niet vervangen.
Een gast-systeemaanroep kan in dit ontwerp meerdere overgangen vereisen. De gasttoepassing veroorzaakt een trap naar de echte afhandelaar van de hypervisor. De hypervisor draagt de uitvoering met verlaagde privileges over aan de geregistreerde afhandelaar van de gastkernel. Wanneer de gastkernel terugkeert, veroorzaakt die geprivilegieerde terugkeer opnieuw een trap; de hypervisor voltooit de echte terugkeer naar de gasttoepassing.
De voorwaarde van Popek en Goldberg voor deze techniek is dat elke gevoelige instructie geprivilegieerd moet zijn. Gevoelig betekent dat de instructie de machineconfiguratie wijzigt of zich anders gedraagt afhankelijk van het privilegeniveau. Geprivilegieerd betekent dat de instructie buiten de modus met de meeste privileges een trap veroorzaakt. Stilzwijgende verschillen kunnen niet worden geëmuleerd als de hypervisor nooit merkt dat ze zijn opgetreden.
Begrijp het klassieke x86-probleem
De analyse van Robin en Irvine uit 2000 vond 17 gevoelige, niet-geprivilegieerde x86-instructies. Zo kan POPF met voldoende privileges de vlag herstellen die interrupts inschakelt, maar die bij verlaagde privileges stilzwijgend ongewijzigd laten. Een gastbesturingssysteem met verlaagde privileges kan denken dat het interrupts heeft uitgeschakeld, terwijl geen trap de hypervisor heeft verteld de virtuele interrupttoestand bij te werken.
Drie benaderingen lossen dit probleem op:
| Benadering | Hoe de bewerking wordt onderschept | Wijziging van het gastbesturingssysteem |
|---|---|---|
| Binaire vertaling | Herschrijft problematische gastkernelinstructies vóór uitvoering en bewaart vertaalde code in een cache | Geen broncodewijziging |
| Paravirtualisatie | Vervangt geprivilegieerde bewerkingen door expliciete hypercalls | Aangepaste gastkernel |
| Hardwareondersteuning | Biedt afzonderlijke gastuitvoering en gecontroleerde overgangen naar de hypervisor | Een ongewijzigd gastbesturingssysteem kan draaien |
VMware gebruikte binaire vertaling in 1999; Xen gebruikte paravirtualisatie in 2003. Intel VT-x kwam in 2005 en AMD-V in 2006. Gewone gasttoepassingen kunnen nog steeds rechtstreeks draaien wanneer kernelcode vertaling of hypercalls nodig heeft.
Houd ringnummer en virtualisatiemodus gescheiden
Met Intel VT-x draait de hypervisor in VMX-rootmodus en een gastbesturingssysteem in niet-rootmodus. De gastkernel kan daar ring 0 gebruiken. Ring 0 in een gastbesturingssysteem betekent geen controle over de fysieke host.
Geconfigureerde gebeurtenissen veroorzaken een VM exit, waarbij de vCPU-toestand wordt opgeslagen in een besturingsstructuur zoals de VMCS. De hypervisor handelt de gebeurtenis af en hervat via een VM entry. Veel systeemaanroepen kunnen volledig binnen het gastbesturingssysteem blijven. ARM gebruikt EL2 voor de hypervisor; RISC-V biedt een hypervisoruitbreiding.
Als een gastbesturingssysteem HLT uitvoert en die gebeurtenis is geconfigureerd om naar de hypervisor over te gaan, markeert de hypervisor zijn vCPU als wachtend en plant ander werk totdat een virtuele interrupt arriveert. De fysieke processorkern hoeft niet ongebruikt te blijven. Overgangen heen en terug kosten nog steeds tijd, doorgaans honderden tot duizenden cycli, dus blijven bundeling en paravirtuele interfaces waardevol.
Belangrijkste punten
- Bij onderscheppen en emuleren worden gevoelige bewerkingen op de toestand van de virtuele machine toegepast.
- Klassiek onderscheppen en emuleren vereist dat gevoelige instructies een trap veroorzaken.
- Binaire vertaling herschrijft code; paravirtualisatie verandert de interface van het gastbesturingssysteem.
- Ring 0 van een gastbesturingssysteem onder VT-x blijft gescheiden van VMX-rootmodus.
- VM exits zijn gecontroleerde gebeurtenissen met werkelijke prestatiekosten.
4.3 Virtualiseer geheugen
Een gasttoepassing gebruikt een virtueel gastadres. De kernel daarvan vertaalt dat naar een fysiek gastadres, de kijk van het gastbesturingssysteem op RAM. De hypervisor koppelt dat adres vervolgens aan een fysiek hostadres, of machineadres. Elk gastbesturingssysteem kan denken dat zijn RAM bij nul begint terwijl het andere echte paginaframes gebruikt.
Behoud de paginaoffset
Gebruik pagina's van 4 KiB. Het gastbesturingssysteem koppelt virtuele pagina 2 aan gastpaginaframe 7; de hypervisor koppelt gastpaginaframe 7 aan machinepaginaframe 42. Voor adres 0x2ABC:
- Splits het in pagina 2 en offset
0xABC. - Vervang pagina 2 door gastpaginaframe 7, wat
0x7ABCoplevert. - Vervang gastpaginaframe 7 door machinepaginaframe 42, hexadecimaal
0x2A. - Behoud de offset, wat machineadres
0x2AABCoplevert, of 174.780 bytes vanaf adres nul.
Alleen het paginanummer verandert. Als je het fysieke gastadres als een echt RAM-adres behandelt, omzeil je de toewijzings- en isolatiebeslissing van de hypervisor.
Vergelijk vertaling door software en hardware
Schaduwpaginatabellen koppelen virtuele gastpagina's rechtstreeks aan machinepaginaframes. De echte MMU gebruikt deze door de hypervisor gebouwde tabellen. De hypervisor beveiligt pagina's met gastpaginatabellen tegen schrijven en onderschept wijzigingen en wisselingen van gasttabellen, zodat de schaduwtabellen consistent blijven. Frequente wijzigingen van gastadresruimten veroorzaken daardoor extra traps.
Geneste paginering, Intel EPT of AMD NPT, geeft de MMU beide fasen. De hardware doorloopt de gasttabellen en de tabellen van fysiek gastadres naar machineadres. Wijzigingen in gastpaginatabellen hoeven niet langer allemaal door software te worden onderschept. De TLB bewaart de gecombineerde uiteindelijke vertaling.
Een cachemisser kan nog steeds duur zijn. Met vier niveaus in elke fase heeft elk van de vier gasttabelvermeldingen vier verwijzingen naar geneste tabellen plus de vermelding zelf nodig: 20 verwijzingen. Voor de vertaling van het uiteindelijke fysieke gastadres van de gegevens komen er nog vier bij, wat vóór de gegevenstoegang 24 vertaalverwijzingen oplevert. Grote pagina's en caches voor het doorlopen van paginatabellen verminderen dit werk in het slechtste geval zonder cache.
Win geheugen terug met beperkte kennis van het gastbesturingssysteem
Bij geheugenoverboeking wordt aan gastbesturingssystemen samen meer geheugen toegezegd dan de host heeft. Vier VM's van 16 GiB komen samen op 64 GiB op een host met 48 GiB. Dit werkt alleen zolang hun actieve behoeften binnen de capaciteit passen; als ze allemaal druk worden, is terugwinning of uitwisseling nodig.
Een balloonstuurprogramma binnen een gastbesturingssysteem wijst op verzoek van de hypervisor pagina's toe. Het gastbesturingssysteem kiest wat het vrijgeeft, terwijl de hypervisor de machinepaginaframes achter de balloonpagina's terugneemt. Dit verkleint de informatiekloof: het gastbesturingssysteem weet welke gegevens belangrijk zijn, terwijl de hypervisor toewijzingen ziet zonder hun volledige betekenis te kennen.
Delen van pagina's, zoals Linux KSM, voegt identieke pagina's samen tot één alleen-lezenkopie en splitst die bij een schrijfbewerking. Uitwisseling door de hypervisor is een andere terugvaloptie, maar kan een slechte keuze maken omdat de kennis van het gastbesturingssysteem ontbreekt. Een apparaat dat rechtstreeks aan de VM is toegewezen, heeft ook een IOMMU nodig om zijn DMA-adressen te vertalen en te beperken.
Identieke pagina's delen tussen klanten heeft gevolgen voor de privacy: de tijd die kopiëren bij schrijven kost, kan onthullen of een ander gastbesturingssysteem dezelfde gegevens bezit. Cloudaanbieders schakelen die vorm van delen tussen klanten vaak uit, ook al bespaart die geheugen.
Belangrijkste punten
- Virtuele gastadressen, fysieke gastadressen en machineadressen zijn verschillende lagen.
- Een paginaoffset blijft bij beide vertalingen ongewijzigd.
- Bij schaduwpaginatabellen moet de hypervisor wijzigingen in gasttabellen bijhouden.
- Geneste paginering voert beide fasen uit in hardware en bewaart het gecombineerde resultaat in een cache.
- Geheugenoverboeking hangt ervan af dat de vraag onder de beschikbare capaciteit blijft.
- Ballooning gebruikt kennis van het gastbesturingssysteem; het delen van pagina's kan informatie via tijdverschillen blootstellen.
4.4 Virtualiseer apparaten en isoleer virtuele machines van elkaar
Een VM heeft naast CPU-tijd en RAM ook opslag, netwerken en andere apparaten nodig. De apparaatinterface beïnvloedt compatibiliteit, prestaties en de code die een niet-vertrouwd gastbesturingssysteem kan bereiken. Een snelle interface en een kleine vertrouwde interface zijn verwante ontwerpkeuzes, maar niet dezelfde eigenschap.
Kies hoe het gastbesturingssysteem een apparaat bereikt
| Benadering | Interface voor het gastbesturingssysteem | Belangrijkste afweging |
|---|---|---|
| Emulatie | Een model van een bekend fysiek apparaat | Bestaande stuurprogramma's werken, maar registerbewerkingen vereisen softwarewerk |
| Paravirtueel apparaat | Een stuurprogramma dat rekening houdt met virtualisatie en gedeelde wachtrijen | Efficiënte bundeling, maar het gastbesturingssysteem heeft het stuurprogramma nodig |
| Rechtstreekse toewijzing | Een toegewezen fysiek apparaat of virtuele functie | Toegang met bijna dezelfde snelheid als rechtstreeks op de hardware, maar delen en migreren zijn moeilijker |
Een hulpprogramma zoals QEMU kan een Intel e1000-netwerkkaart emuleren. Het gewone gaststuurprogramma schrijft naar bekende registers; het hulpprogramma voert het effect uit. Frequente registertoegang kan veel overgangen naar de hypervisor en softwarebewerkingen veroorzaken.
Een virtio-stuurprogramma wisselt daarentegen verzoeken uit via wachtrijen in gedeeld geheugen. Het kan meerdere bewerkingen in de wachtrij plaatsen en de achterliggende component één keer informeren. De vmxnet3 van VMware en VMBus-apparaten van Hyper-V volgen verwante ontwerpen die rekening houden met virtualisatie. Een paravirtueel apparaatstuurprogramma betekent niet dat de hele gastkernel paravirtuele CPU-bewerkingen moet gebruiken.
Bij rechtstreekse apparaattoewijzing beschikt het gastbesturingssysteem over een fysiek apparaat of een virtuele SR-IOV-functie. De IOMMU beperkt DMA tot het geheugen van de VM. Rechtstreekse toewijzing vermindert tussenkomst van software, maar het overdragen van de apparaattoestand naar een andere host kan livemigratie moeilijk maken.
Behandel virtuele schijven als beheerde toestand
Een virtuele schijf is meestal een bestand op de host, zoals qcow2, VMDK of VHDX, of een opslagvolume. Images met kopiëren bij schrijven laten veel gastbesturingssystemen een basis delen terwijl afzonderlijke wijzigingen worden vastgelegd. Momentopnamen kunnen de schijftoestand goedkoop bewaren, en een volledige momentopname van een draaiende VM heeft ook de uitvoerings- en geheugentoestand nodig. Klonen en migratie steunen op het vermogen van de hypervisor om deze representaties te beheren.
Zoek de grens die een aanvaller moet oversteken
Een gecompromitteerde gastkernel beheerst die VM al, maar om de host te bereiken is een ontsnapping uit een virtuele machine of een andere doorbroken grens nodig. De VENOM-kwetsbaarheid uit 2015 trof de geëmuleerde diskettestationcontroller van QEMU en kon gastcode laten uitvoeren in het QEMU-proces van de host. Door apparaatemulatie in een afzonderlijk proces met een sandbox te houden, worden de bevoegdheden beperkt die via zo'n fout worden blootgesteld.
Gedeelde CPU-caches, vertakkingsvoorspellers en geheugenbussen creëren ook zijkanalen. Spectre en L1TF lieten zien dat isolatie niet alleen op basis van paginakoppelingen kan worden beoordeeld. Maatregelen omvatten processor- en microcode-updates, het wissen van relevante toestand tussen gastbesturingssystemen en het vermijden dat verschillende klanten tegelijk op verwante hardwarethreads van één processorkern worden geplaatst.
Vertrouwelijke gegevensverwerking, waaronder AMD SEV-SNP en Intel TDX, beschermt gastgeheugen tegen de hypervisor met versleutelingssleutels die de hardware bewaart en ondersteunt attestatie van de gestarte omgeving. Dit breidt de vertrouwensgrens uit tegen een gecompromitteerde host of beheerder. Het verwijdert niet elk zijkanaal of elke manier waarop een host de dienstverlening kan onderbreken. VM-beveiliging blijft afhankelijk van de hypervisor, apparaatinterfaces, hardware en de configuratie daarvan.
Belangrijkste punten
- Emulatie bevordert compatibiliteit; paravirtuele wachtrijen verminderen herhaalde overgangen naar de hypervisor.
- Rechtstreekse apparaattoewijzing vereist dat de IOMMU de DMA van het apparaat begrenst.
- Virtuele schijven en opgeslagen machinetoestand ondersteunen momentopnamen en migratie.
- Fouten in apparaatmodellen kunnen een ontsnapping uit een virtuele machine mogelijk maken.
- Gedeelde hardware kan informatie lekken zonder een gewone schending van geheugentoegangsrechten.
- Vertrouwelijke gegevensverwerking beschermt gastgeheugen tegen de host binnen de garanties van de hardware.
5Isoleer toepassingen met containers
Containers bouwen een geïsoleerde omgeving rond gewone processen op de hostkernel. Hun eigen weergaven, bronbudgetten en bevoegdheden komen van verschillende kernelfuncties en vereisen daarom elk afzonderlijke aandacht. Lees naamruimtekoppelingen en instellingen van controlegroepen en verbind die daarna met privilegebeperkingen. Gebruik de grens van de gedeelde kernel om te bepalen waar containers, VM's of een combinatie bij een werklast passen.
5.1 Beperk met naamruimten wat een proces kan zien
Een Linux-container is een verzameling processen die de hostkernel gebruikt met beperkte weergaven en privileges. Een container heeft geen afzonderlijke kernel of geëmuleerde computer. Naamruimten geven processen eigen instanties van bronnen die anders globaal zouden zijn.
Koppel elke naamruimte aan zijn weergave
| Naamruimte | Wat die scheidt |
|---|---|
| Koppeling | Gekoppelde bestandssystemen en de zichtbare bestandsboom |
| PID | Procesnummers en zichtbaarheid van processen |
| Netwerk | Interfaces, adressen, routes, poorten en firewallregels |
| UTS | Hostnaam en NIS-domeinnaam |
| IPC | System V IPC-objecten en POSIX-berichtenwachtrijen |
| Gebruiker | Koppelingen van gebruikers- en groeps-ID's en afgebakende privileges |
| Cgroup | Het zichtbare deel van de cgroup-hiërarchie |
| Tijd | Offsets voor de monotoon oplopende klok en de opstartklok |
clone() met naamruimtevlaggen maakt een kindproces in geselecteerde nieuwe naamruimten. unshare() scheidt de naamruimtecontext en setns() sluit zich aan bij een bestaande naamruimte via een descriptor, zoals een descriptor die is geopend vanuit /proc/1234/ns/net. Opnieuw koppelen aan een PID-naamruimte beïnvloedt latere kindprocessen zonder de aanroeper te verplaatsen. Voor tijdnaamruimten bereidt unshare(CLONE_NEWTIME) ook een naamruimte voor latere kindprocessen voor; setns() kan de aanroeper naar een bestaande tijdnaamruimte verplaatsen. Tijdnaamruimten worden met unshare() aangemaakt.
Zo gebruikt unshare --pid --fork --mount-proc bash --fork om de shell binnen de nieuwe PID-naamruimte aan te maken. Die shell is daar PID 1, ook als de host-PID 48213 is. PID 1 adopteert weesprocessen; als het eindigt, beëindigt de kernel de overige processen van de naamruimte. Processen in een bovenliggende naamruimte kunnen onderliggende processen zien, terwijl processen binnen de naamruimte niet naar buiten kunnen kijken in bovenliggende PID-naamruimten.
Scheid bestanden en netwerken
Een naamruimte voor bestandssysteemkoppelingen geeft een eigen koppellijst. Een uitvoeringsomgeving stelt een bestandsboom samen en maakt die met pivot_root tot root. Een container kan /etc en /usr van een andere Linux-distributie gebruiken terwijl hij nog steeds de hostkernel aanroept. chroot alleen verandert slechts het startpunt voor het opzoeken van paden; het is geen veilige grens tegen een geprivilegieerd proces.
Een nieuwe netwerknaamruimte heeft een loopbackinterface. Een uitvoeringsomgeving kan die verbinden via een veth-paar, met één eindpunt binnen de container en een ander verbonden met een brug op de host. Door afzonderlijke stacks kunnen twee containers allebei op poort 80 luisteren zonder om de poort van één naamruimte te concurreren.
Vertaal identiteiten over een gebruikersnaamruimte heen
Een regel in /proc/<pid>/uid_map vermeldt de eerste interne ID, de eerste externe ID en de lengte van het bereik. De regel 0 100000 65536 koppelt interne ID's 0–65535 aan host-ID's 100000–165535. Interne UID 1000 wordt dus extern aan 101000 gekoppeld. ID's zonder bruikbare koppeling worden normaal weergegeven als de overloop-UID 65534.
Root binnen die naamruimte heeft privileges voor bronnen die door die naamruimte worden beheerd, geen bevoegdheid op de hele host. Een kernelmodule laden of de echte systeemklok wijzigen vereist nog steeds privileges in de oorspronkelijke gebruikersnaamruimte. Een UID-koppeling beschermt een geprivilegieerde besturingssocket van de uitvoeringsomgeving niet als die aan de container wordt gegeven.
Een eigen weergave beperkt ook het verbruik niet. Een proces met eigen PID- en koppelnaamruimten kan nog steeds CPU en RAM verbruiken. Cgroups beperken hoeveelheden, terwijl privilegebeperkingen en seccomp bewerkingen beperken.
Belangrijkste punten
- Containers gebruiken hostkernelprocessen met eigen weergaven van bronnen.
- De acht typen naamruimten scheiden verschillende soorten globale toestand.
- Opnieuw koppelen aan een PID-naamruimte en unshare van tijdnaamruimten beïnvloeden latere kindprocessen; met setns kun je rechtstreeks een tijdnaamruimte binnengaan.
- PID 1 heeft speciale taken rond de levenscyclus binnen zijn naamruimte.
- Gebruikersnaamruimten vertalen ID's en bakenen bevoegdheden af.
- Eigen weergaven vereisen afzonderlijke beperkingen van bronnen en privileges.
5.2 Beperk met controlegroepen hoeveel bronnen een proces kan gebruiken
Een controlegroep, of cgroup, groepeert processen om brongebruik te registreren en te beheersen. Naamruimten bepalen hun weergave; cgroups beheren hoeveelheden zoals CPU-tijd, geheugen en het aantal taken. Kindprocessen erven de groep van hun ouderproces en de hiërarchie voorkomt dat een onderliggende groep aan de grenzen van een bovenliggende groep ontsnapt.
Lees de bestanden van cgroup v2
Cgroup v2 gebruikt één gemeenschappelijke hiërarchie, normaal op /sys/fs/cgroup. Een bovenliggende groep schakelt controllers voor onderliggende groepen in via cgroup.subtree_control, bijvoorbeeld +cpu +memory +pids. Afzonderlijke bestanden in elke onderliggende groep bevatten grenzen en tellers.
Controllers omvatten cpu, cpuset, memory, io, pids, hugetlb en rdma. Ze beheren CPU-tijd, plaatsing op CPU's en geheugenknooppunten, gewoon geheugen, blok-I/O, het aantal taken, grote pagina's en RDMA-bronnen. Prestatiegebeurtenissen die rekening houden met cgroups ondersteunen metingen, en cgroup.freeze pauzeert de uitvoering van een groep.
Onderscheid een CPU-bovengrens van een aandeel
cpu.max bevat quotum en periode in microseconden. 50000 100000 staat per 100 ms 50 ms CPU-uitvoering toe, gelijk aan de helft van één CPU. 200000 100000 staat de hoeveelheid tijd van twee CPU's toe, eventueel verdeeld over processorkernen. max 100000 betekent geen quotumbovengrens. Zodra het quotum is verbruikt, wacht de groep op de volgende periode, ook als een CPU niets doet.
cpu.weight stelt bij concurrentie een relatief aandeel in, van 1 tot 10.000 met standaardwaarde 100. Voor op gelijke wijze geplaatste groepen die kunnen draaien op vier CPU's, verdelen de gewichten 100 en 300 de beschikbare tijd als 1:3: ongeveer één CPU en drie CPU's. Als de zwaardere groep niets meer doet, kan de andere alle vier gebruiken, tenzij een andere beperking ingrijpt. Een gewicht is geen reservering of harde bovengrens.
Beperk uitputting van geheugen en taken
memory.high oefent boven zijn drempel druk uit om geheugen terug te winnen en vertraagt taken. memory.max stelt een harde grens. De kernel probeert eerst geheugen terug te winnen, waaronder cache en beschikbare wisselruimte. Als hij niet genoeg kan terugwinnen, beëindigt de OOM-afhandeling van de cgroup een daarvoor in aanmerking komend proces binnen de getroffen groep.
Bij een memory.max van 512M is de grens 536.870.912 bytes, of 512 MiB. Een proces met een geheugenlek kan terugwinning en uiteindelijk beëindiging door de OOM-killer veroorzaken, maar het slachtoffer wordt door de kernel gekozen en is niet gegarandeerd dat proces. De groepsgrens houdt de gebeurtenis binnen de groep in plaats van een niet-gerelateerd hostproces te kiezen.
pids.max telt processen en threads. Bij een grens van 100 mislukt verdere aanmaak met EAGAIN, waardoor de groei van het aantal taken door een forkbom wordt ingeperkt. Een I/O-grens zoals 8:0 rbps=10485760 in io.max begrenst lezen van blokapparaat 8:0 tot 10 MiB/s.
Deze bestanden verbergen geen hostprocessen of bestandsnamen. Ook kunnen /proc/meminfo en hulpmiddelen die dat bestand lezen het host-RAM tonen in plaats van memory.max; het weergegeven totaal alleen bewijst niet dat een cgroup geen grens heeft. Bronmetingen moet je lezen op de laag die de grens afdwingt.
Belangrijkste punten
- Cgroup v2 past bronbeperkingen toe via één gemeenschappelijke hiërarchie.
- Een onderliggende groep blijft beperkt door de grenzen van bovenliggende groepen.
- cpu.max is een hard quotum; cpu.weight is een relatief aandeel bij concurrentie.
- memory.high oefent druk uit; memory.max kan leiden tot lokale beëindiging door de OOM-killer.
- pids.max telt zowel threads als processen.
- Cgroup-grenzen creëren geen eigen weergaven van hostbronnen.
5.3 Beperk de bevoegdheden van containers en kies tussen containers en virtuele machines
Een bruikbare containergrens combineert weergaven, bronbeperkingen en beperkte bevoegdheden. Een eigen bestandsboom alleen houdt gevaarlijke systeemaanroepen niet tegen, en een CPU-quotum houdt toegang tot een blootgesteld hostbestand niet tegen. De hostkernel dwingt elk van deze controles af.
Verminder de bevoegdheden van het proces
Een uitvoeringsomgeving combineert naamruimten, cgroups en een bestandssysteemimage met programma's en bibliotheken. Ze kan de grens versterken door:
- De werklast niet als root uit te voeren of container-ID's via een gebruikersnaamruimte te koppelen.
- Afzonderlijke Linux-privileges te laten vervallen, vooral ruime bevoegdheden zoals
CAP_SYS_ADMINenCAP_SYS_MODULE. - Seccomp toe te passen om onnodige aanroepen te beperken.
- Een SELinux- of AppArmor-beleid toe te passen.
- Het rootbestandssysteem waar praktisch mogelijk alleen-lezen te maken.
no_new_privsin te stellen zodat setuid-uitvoering privileges niet kan verhogen.
Elke controle dekt een andere route af. Een alleen-lezenrootbestandssysteem staat nog steeds toegestane netwerkbewerkingen toe; een seccomp-filter staat nog steeds de aanroepen op zijn lijst toe. Het ontwerp moet passen bij de bewerkingen die de toepassing daadwerkelijk nodig heeft.
Herken het risico van een gedeelde kernel
Alle gewone containers delen de hostkernel. Een bereikbare kernelfout kan daardoor de host en andere containers compromitteren. In een VM geeft misbruik van de gastkernel controle over dat gastbesturingssysteem; om de host te bereiken moet ook de grens van de hypervisor of een apparaat worden doorbroken.
Root binnen een container is bijzonder gevoelig. Zonder gebruikersnaamruimte is die voor de hostkernel UID 0, beperkt door afzonderlijke privileges, filters en verplicht beleid. Geprivilegieerde modus of toegang tot het rootbestandssysteem van de host kan die beperkingen wegnemen. Een besturingssocket van de uitvoeringsomgeving die eigendom is van root is ook gevaarlijk: de client ervan kan de uitvoeringsomgeving vragen geprivilegieerde handelingen uit te voeren. Root in de container koppelen aan een ongeprivilegieerde host-ID maakt die socket niet veilig en verwijdert geen kernelkwetsbaarheden.
Kies een grens voor de werklast
| Behoefte | Geschikte grens | Reden |
|---|---|---|
| Vaak uitgerolde Linux-services van één team | Beperkte containers | Snel starten en weinig overhead op één kernel |
| Code van klanten die elkaar niet vertrouwen | VM's of micro-VM's | Afzonderlijke gastkernels verminderen blootstelling via een gedeelde kernel |
| Een toepassing die alleen op Windows werkt op Linux-hosts | VM | De werklast heeft een andere kernel nodig |
Een Linux-container heeft een Linux-kernel nodig. Platforms op Windows en macOS bieden daarom vaak een Linux-VM onder Linux-containers. VM's starten een besturingssysteem op en wijzen voor elke kernel geheugen toe; containers starten gewone processen en kunnen werklasten dichter op elkaar plaatsen.
Herken tussenliggende ontwerpen
gVisor handelt veel containersysteemaanroepen af in een kernel in gebruikersruimte, waardoor minder direct contact met de hostkernel nodig is. Kata Containers geeft elke sandbox, meestal een Kubernetes-pod, een lichtgewicht VM; containers in die sandbox delen de gastkernel ervan. Firecracker levert micro-VM's met een minimaal apparaatmodel voor platforms die functies of containerwerklasten uitvoeren, waaronder AWS Lambda.
Cloudsystemen plaatsen containers vaak binnen VM's: een VM scheidt klanten, terwijl containers de toepassingen van één klant ordenen. De gastkernels en de hostkernel blijven gescheiden, dus een ontsnapping uit een container binnen een VM bewijst op zichzelf geen ontsnapping uit de hypervisor.
Belangrijkste punten
- Containerisolatie vereist weergaven, bronbeperkingen en privilegebeperkingen.
- Alle gewone containers op een host delen de kernel ervan.
- Een UID-koppeling zonder rootrechten op de host vermindert bevoegdheden maar kan kernelfouten niet verhelpen.
- Toegang tot een geprivilegieerde besturingssocket van de uitvoeringsomgeving kan controle over de host geven.
- VM's kunnen een andere kernel meebrengen; containers gebruiken de kernel onder hen.
- gVisor, Kata en Firecracker voegen verschillende grenzen rond werklasten toe.
- Containers binnen VM's combineren een hoge dichtheid aan toepassingen met afzonderlijke gastkernels.
Bescherming, isolatie en virtuele machines: voorbeelden
1Volg een verzoek over de kernelgrens
16 stappen
- 1IntroductieBegin met een draaiende toepassing
Een rapportageservice besteedt het grootste deel van zijn tijd aan berekeningen in gebruikersmodus. De service heeft de kernel alleen nodig voor beschermd werk, zoals een bestand openen of een koppeling regelen.
Volg wat verandert wanneer de uitvoering die grens passeert: het CPU-privilegeniveau verandert, maar de identiteit van de aanroeper en de geldigheid van het verzoek moeten nog steeds worden gecontroleerd. Volg daarna de afzonderlijke bescherming voor geheugen, apparaten en uitvoerbare code.
- 2UitlegVoer gewone code rechtstreeks uit
De CPU voert optellingen, laadbewerkingen en sprongen van de service rechtstreeks uit. De hardware controleert tijdens de uitvoering privileges en geheugentoegangsrechten; de kernel keurt niet elke instructie met software goed.
Een poging om een paginatabel te vervangen of interrupts uit te schakelen moet een trap veroorzaken. Anders zou het programma dezelfde beperkingen kunnen verwijderen die het moeten begrenzen. Deze combinatie is beperkte directe uitvoering.
- 3UitdagingEen service stopt met verzoeken doen
De service raakt vast in een eindeloze lus in gebruikersmodus. Er volgt geen enkele systeemaanroep meer. Kan de scheduler nog steeds een ander gereed proces uitvoeren?
---reveal---
Ja. Een hardwaretimerinterrupt gaat naar de kernel zonder dat de service hoeft mee te werken. De scheduler kan een ander proces kiezen. De timer programmeren en interrupts uitschakelen vereisen privileges, dus kan de vastgelopen service de processorkern niet behouden door systeemaanroepen te vermijden.
- 4UitlegVraag om een beschermde dienst
Om een bestand te lezen plaatst de wrapperfunctie in de bibliotheek een aanroepnummer, descriptor, bufferadres en lengte in registers en voert daarna de systeemaanroepinstructie van de architectuur uit.
De kernel slaat de gebruikerstoestand op, kiest de afhandelaar en haalt de identificatiegegevens van de aanroeper uit het huidige proces. Binnenkomen met kernelprivileges is slechts het begin: de afhandelaar moet nog steeds beslissen of deze aanroeper en deze argumenten zijn toegestaan.
- 5VoorbeeldControleer de volledige bestemming
Stel dat de service
read(fd, buf, 8192)vraagt om bytes naar zijn buffer te kopiëren. Het is niet voldoende dat de eerste byte geldig is: de kopieerbewerking kan een paginagrens overschrijden en in een verboden bereik terechtkomen.De kernel moet de volledige bestemming die voor de overdracht nodig is controleren en veilig benaderen. Gecontroleerde Linux-routines voor kopiëren van en naar gebruikersgeheugen handelen ongeldige gebruikersadressen af zonder toe te staan dat de gevraagde kopieerbewerking kernelgeheugen overschrijft.
- 6UitdagingEen verzoek gebruikt de verkeerde soort toegang
De buffer is geldig, maar de service probeert
write()met een descriptor die metO_RDONLYis geopend. Wat moet de kernel controleren en moet het proces eindigen?---reveal---
Hij controleert de aan de descriptor verleende toegang en wijst de schrijfbewerking onder Linux af met
EBADF. Dit is een foutresultaat dat het programma kan afhandelen. De aanroep is correct de kernel binnengegaan, maar de descriptor bevat het gevraagde recht niet. - 7KernpuntHoud een gecontroleerd pad gekoppeld aan zijn object
Een hulpprogramma controleert de rechten op een pad en opent het later met hogere privileges. Tussen de twee bewerkingen kan een ander proces de directoryvermelding vervangen. Een gekopieerde padstring voorkomt die vervanging niet.
Dit is een TOCTTOU-raceconditie. Open met de bedoelde identificatiegegevens en gebruik een methode om het object te verkrijgen die controleert wat daadwerkelijk wordt geopend; gebruik
O_NOFOLLOWwanneer symbolische koppelingen ongewenst zijn. - 8UitlegLaat koppelingen latere toegang bepalen
Zodra een koppeling is verleend, verlopen laad- en opslagbewerkingen via de MMU zonder een systeemaanroep per byte. De MMU controleert de schrijf-, gebruikers-/supervisor- en uitvoerrechten van de actieve paginatabel.
Een alleen-lezengebruikerspagina beschermt de inhoud tegen wijzigingen, maar laat het proces die nog steeds lezen. Om gegevens voor dat proces geheim te houden, moet de koppeling ook lezen weigeren, bijvoorbeeld doordat ze ontbreekt of alleen voor de supervisor toegankelijk is.
- 9VoorbeeldInterpreteer twee schrijffouten op alleen-lezenpagina's
De service schrijft eerst naar zijn codepagina en daarna naar gegevens die na
fork()worden gedeeld. Beide pagina's zijn alleen-lezen, dus veroorzaken beide opslagbewerkingen aanvankelijk een fout.De administratie van de kernel onderscheidt de uitkomsten. Een ongeoorloofde schrijfbewerking naar code leidt normaal tot
SIGSEGV. Een geldige gegevensfout door kopiëren bij schrijven leidt tot een privékopie en een opnieuw gestarte instructie. De hardware meldt de schending; de administratie van de kernel bepaalt of die kan worden hersteld. - 10UitdagingEen apparaat passeert de geheugengrens
De service wordt begrensd door CPU-paginatabellen, maar een defect apparaat schrijft rechtstreeks naar RAM dat daar niets mee te maken heeft. Waarom hielden die CPU-koppelingen het niet tegen?
---reveal---
DMA verloopt niet via de MMU van de CPU. Het apparaat heeft een IOMMU-koppeling nodig die zijn eigen adressen beperkt. Laad- en opslagbewerkingen van de CPU beschermen vormt één grens; overdrachten vanuit apparaten begrenzen vereist de bijbehorende apparaatgrens.
- 11UitlegBlokkeer uitvoering van geïnjecteerde bytes
Een bufferoverloop kan een opgeslagen retouradres overschrijven. Door de stack als NX te markeren worden geïnjecteerde stackinstructies niet-uitvoerbaar, zodat een sprong daarheen een fout veroorzaakt.
W^X voegt de regel toe dat geen pagina tegelijk beschrijfbaar en uitvoerbaar mag zijn. Een just-in-timecompiler moet gegenereerde code schrijven en daarna de rechten omschakelen voordat hij de code uitvoert. Deze controles beperken misbruik, terwijl de oorspronkelijke schrijfbewerking buiten de grenzen nog moet worden verholpen.
- 12VerbandMaak bestaande code moeilijk te vinden
Een aanvaller kan instructies hergebruiken die al in uitvoerbare bibliotheken staan, in plaats van nieuwe instructies te injecteren. ROP verbindt deze korte gadgets tot een nieuwe berekening.
ASLR maakt hun adressen moeilijker te voorspellen. Een uitgelekt adres van een bekende bibliotheek onthult de basis en bekende offsets van die bibliotheek, maar onthult geen onafhankelijk gerandomiseerde stack. Willekeurige indeling werkt het best wanneer fouten de gekozen adressen niet kunnen onthullen.
- 13UitdagingBeperk een gecompromitteerd weergaveproces
Een weergaveproces is overgenomen. De stack is NX en de adressen van de bibliotheken zijn nu bekend bij de aanvaller. Een seccomp-beleid blokkeert nog steeds aanroepen om programma's te starten. Kan codehergebruik die beperking eenvoudig verwijderen?
---reveal---
Nee. Uitvoerbare instructies hergebruiken verwijdert een geïnstalleerd seccomp-filter niet. Het proces blijft beperkt tot toegestane aanroepen, dus om een ander programma te starten is een verdere manier nodig om het filter te omzeilen of een andere grens te doorbreken.
- 14UitlegScheid opstartcontroles van gebeurtenisregistraties
Beveiligd opstarten verifieert handtekeningen voordat het de controle overdraagt aan de volgende vertrouwde opstartcomponent. Opstarten met integriteitsmetingen legt hashes van componenten vast, vaak met een TPM, zodat een externe controleur kan beoordelen wat is geladen.
Registratie in een auditlogboek dient een later doel: ze legt gebeurtenissen vast zoals mislukte aanmeldingen en commando's met verhoogde privileges. Kopieën buiten de host beschermen helpt dat bewijsmateriaal te bewaren als een indringer bevoegdheid krijgt om lokale logboeken te wissen.
- 15UitdagingKies de ontbrekende beschermingslaag
Een rootservice koppelt gevoelige gegevens als alleen-lezen aan een niet-vertrouwd werkproces en beperkt de systeemaanroepen van dat werkproces. Het werkproces leest vervolgens de gegevens. Welke beslissing stelde ze bloot?
---reveal---
De voor gebruikers leesbare koppeling stelde de inhoud bloot. Alleen-lezen beschermt tegen wijzigingen en een systeemaanroepfilter blokkeert geen gewone laadbewerkingen vanaf een toegestane pagina. De kernel moet het werkproces die koppeling of het leesrecht erop weigeren om de vertrouwelijkheid te bewaren.
- 16SamenvattingZoek de controle die de handeling bepaalt
Volg bij een onbekende fout de bewerking: CPU-instructie, kernelverzoek, toegang tot gekoppeld geheugen of apparaat-DMA. Elk bereikt een ander afdwingingspunt.
Vraag daarna wat de aanvaller al beheerst. Een rootidentiteit, uitvoerbare gadgets en een geldige descriptor geven verschillende bevoegdheden. Een nuttige diagnose noemt precies de ontbrekende controle in plaats van aan te nemen dat één geslaagde verdediging elk pad beschermt.
2Volg een aanmelding tot procesidentificatiegegevens
14 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieMaak van een aanmelding een identiteit voor uitvoering
- 2UitlegStel groepen in voordat je afstand doet van rootrechten
- 3VoorbeeldVolg een setuid-hulpprogramma voor wachtwoorden
- 4UitdagingWerk een account bij tijdens een sessie
- 5UitlegBereken verificatiegegevens opnieuw zonder een wachtwoord terug te halen
- 6VoorbeeldMeet het gokwerk voor één account
- 7VoorbeeldHerhaal het werk voor verschillende salts
- 8UitdagingEen blokkering bereikt het gestolen bestand niet
- 9UitlegOnderscheid een code van een sitegebonden handtekening
- 10VoorbeeldKies de noemer voordat je rekent
- 11UitdagingTwee geheimen zijn nog steeds één factortype
- 12VerbandLaat de kernel een lokale andere partij identificeren
- 13UitdagingZoek waar de sterkte van de aanmelding niet meer meetelt
- 14SamenvattingHoud het bewijs en de resulterende rechten gescheiden
3Werk een toegangsbeslissing door
15 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieNoem de bewerking en het bijbehorende object
- 2UitlegOrden rechten per object of per subject
- 3VoorbeeldGeef een beperkte bevoegdheid door aan een werkproces
- 4UitdagingWijzig rechten na het verlenen van een handle
- 5UitlegKies een klasse voordat je de bits optelt
- 6VoorbeeldMaak een bestand aan onder een masker
- 7VoorbeeldTest toegang met de resulterende rechtennotatie
- 8UitdagingVerwijder een naam zonder de gegevens te lezen
- 9TipLees zowel de ACL-grens als de vermelding
- 10UitlegVoeg beleid toe waarvan de eigenaar niet kan afwijken
- 11VoorbeeldVolg vertrouwelijke informatie tussen niveaus
- 12UitdagingVerklaar geweigerde leestoegang voor een rootservice
- 13VerbandWijzig een functie via rollen
- 14UitdagingVolg een bevoegdheid door meerdere controles
- 15SamenvattingVolg de beslissing in een bruikbare volgorde
4Voer een gastbesturingssysteem uit zonder de host uit handen te geven
17 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieGeef een kernel een schijnbaar eigen computer
- 2UitlegPlan een virtuele processor in
- 3UitdagingBeoordeel een bewering over consolidatie
- 4UitlegEmuleer alleen de besturingstoestand van het gastbesturingssysteem
- 5VoorbeeldVerhelp een instructie die geen trap veroorzaakt
- 6UitdagingHoud ring 0 van het gastbesturingssysteem onder controle
- 7UitlegHoud de drie adresnamen uit elkaar
- 8VoorbeeldPas eerst de koppeling van het gastbesturingssysteem toe
- 9VoorbeeldPas daarna de koppeling van de hypervisor toe
- 10UitdagingVertaal een andere byte in de pagina
- 11VerbandKies waar de gecombineerde koppeling wordt bijgehouden
- 12KernpuntWin geheugen terug met hulp van het gastbesturingssysteem
- 13UitlegWeeg apparaatcompatibiliteit af tegen minder overgangen
- 14UitdagingVerminder frequente apparaatovergangen naar de hypervisor
- 15UitlegBescherm een grens die groter is dan paginakoppelingen
- 16UitdagingBereid een draaiende machine voor op een andere host
- 17SamenvattingHoud controle bij elke virtuele interface
5Bouw en beoordeel een containergrens
16 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieOnderscheid drie taken binnen een container
- 2UitlegGeef processen eigen weergaven van bronnen
- 3VoorbeeldStart het eerste kindproces in een PID-naamruimte
- 4VoorbeeldKoppel een interne identiteit aan de host
- 5UitdagingKies de weergave die een conflict oplost
- 6UitlegLees een hard CPU-budget
- 7VoorbeeldVerdeel een bovenliggend budget tussen onderliggende groepen
- 8UitdagingLaat een concurrerende groep niets meer doen
- 9UitlegBeperk de groei van geheugen en taken
- 10UitdagingLees de grens op de laag die die afdwingt
- 11UitlegBeperk wat het proces mag aanvragen
- 12UitdagingEen gekoppelde UID bereikt nog steeds een geprivilegieerde service
- 13VerbandKies waar een afzonderlijke kernel nodig is
- 14UitlegHerken toegevoegde sandboxlagen
- 15UitdagingPlaats niet-vertrouwde taken met bronbeperkingen
- 16SamenvattingKoppel elke behoefte aan het bijbehorende mechanisme
Bescherming, isolatie en virtuele machines: oefenvragen
Set 1: Volg identiteiten en authenticatie10 Oefenvragen
Vraag 1 van 10
Toon antwoordVerberg antwoord
Vraag 2 van 10
Toon antwoordVerberg antwoord
Vraag 3 van 10
Toon antwoordVerberg antwoord
Vraag 4 van 10
Toon antwoordVerberg antwoord
Vraag 5 van 10
Toon antwoordVerberg antwoord
Vraag 6 van 10
Toon antwoordVerberg antwoord
Vraag 7 van 10
Toon antwoordVerberg antwoord
Vraag 8 van 10
Toon antwoordVerberg antwoord
Vraag 9 van 10
Toon antwoordVerberg antwoord
Vraag 10 van 10
Toon antwoordVerberg antwoord
Set 2: Volg hardware- en kernelgrenzen10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
LIDT een vervangende interrupttabel te installeren. Wat voorkomt dat het de interruptafhandeling overneemt?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
write() aan via die descriptor. Welke Linux-fout past bij de ontbrekende toegang van de descriptor?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
fork() een fout. De administratie van de kernel markeert de pagina om bij schrijven te worden gekopieerd. Welke reactie behoudt het normale programmagedrag?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
fork() wordt gedeeld en bij schrijven wordt gekopieerd. Opslagbewerkingen naar beide veroorzaken een fout. Een stuurprogramma heeft ook DMA naar een afzonderlijke buffer nodig. Welke reactie bewaart de bedoelde grenzen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 3: Bepaal wie een bron mag gebruiken10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
metrics.bin. De eigenaar verwijdert daarna het schrijfrecht uit de rechtennotatie van het bestand. Wat gebeurt er met gewone schrijfbewerkingen via die descriptor?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 4: Volg een gastbesturingssysteem via virtuele hardware10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
0x53D0?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 5: Interpreteer containerweergaven en -grenzen10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
0 220000 8000. Welke host-UID hoort bij interne UID 1750?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
unshare(CLONE_NEWPID) aan, maakt daar zijn eerste kindproces aan en blijft daarbuiten actief. Dat kindproces maakt een logproces aan en eindigt vervolgens. Wat gebeurt er met het logproces en het toezichthoudende proces?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
cpu.max met de waarde 120000 100000. Welke CPU-ruimte legt dit vast?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
pids.max van 30. Onderliggende groep A heeft vier processen met elk in totaal zeven threads en een lokale grens van 40; nevenliggende groep B bevat twee processen met elk één thread. Kan A nog een thread aanmaken terwijl alle bestaande taken actief blijven?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 6: Diagnosticeer fouten over isolatielagen heen10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
access() en opent dat pad daarna met volledige privileges. Een aanvaller kan de genoemde vermelding vervangen. Welke fout blijft bestaan?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
0x9B20 en valt het resulterende paginaframe binnen de apparaatkoppeling?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Kom je niet uit je eigen opgave? Huiswerkhulp
Kernbegrippen
A
afzonderlijk Linux-privilege
CAP_NET_BIND_SERVICE staat het binden van poorten met lage nummers toe zonder alle rootbevoegdheden te verlenen.apparaatemulatie
AppArmor-profiel
ASLR
auditlogboek
authenticatie
authenticatiemiddel met een publieke sleutel
autorisatie
B
ballooning
Bell–LaPadula-model
beperkte directe uitvoering
beschermingsring
bestandsdescriptor
besturingssocket van de containeruitvoeringsomgeving
beveiligd opstarten
beveiligingssubject
binaire vertaling
biometrisch sjabloon
bruteforceaanval
bufferoverloop
C
cgroup-controller
container
container zonder rootrechten op de host
controlegroep
cpu.max
cpu.max-waarde van 75000 100000 staat per periode maximaal drie kwart van de tijd van één CPU toe.cpu.weight
cpu.weight bevoordeelt een actieve groep boven concurrerende groepen op hetzelfde niveau, maar kan het afzonderlijke quotum niet opheffen.D
DACL
delen van pagina's
directe geheugentoegang
directory met setgid
discretionaire toegangscontrole
doorzoeken van een directory
E
EFAULT
read()-aanroep met een bestemming in kernelgeheugen kan EFAULT retourneren in plaats van de kernel te overschrijven.effectieve UID
exceptieniveau
F
foutacceptatiepercentage
foutafwijzingspercentage
fysiek gastadres
G
gastbesturingssysteem
gebruikersmodus
gebruikersnaamruimte
geheugenbeheereenheid
geheugenoverboeking
geneste paginering
geprivilegieerde instructie
HLT uit te voeren veroorzaakt een beschermingsfout.gevoelige instructie
gVisor
H
hypercall
hypervisor
I
intrekking van bevoegdheidstokens
IOMMU
isolatie van kernelpaginatabellen
K
Kata Containers
kernelmodus
kostenfactor voor wachtwoordhashing
L
livemigratie
M
memory.high
memory.high overschrijden terwijl de druk om geheugen terug te winnen toeneemt, anders dan bij een eenvoudige vaste toewijzingsgrens.memory.max
memory.max afdwingen dat een daarvoor in aanmerking komende taak in de groep wordt beëindigd.micro-VM
momentopname
multifactorauthenticatie
N
naamruimte
naamruimte voor bestandssysteemkoppelingen
netwerknaamruimte
no_new_privs
no_new_privs is ingesteld, kan een containerproces niet eenvoudig bevoegdheden krijgen door een uitvoerbaar setuid-bestand te starten.O
objectgebonden bevoegdheidstoken
octale rechtennotatie
offlineaanval
onderscheppen en emuleren
ontsnapping uit een virtuele machine
opstarten met integriteitsmetingen
overgang naar gastuitvoering
overgang van gastuitvoering naar de hypervisor
HLT van het gastbesturingssysteem laat de hypervisor stoppen met het inplannen van de wachtende vCPU en een andere werklast uitvoeren.P
paginafout
PAM
paravirtualisatie
passkey
PID-naamruimte
pids.max
pids.max bereiken, zelfs wanneer het aantal afzonderlijke processen klein lijkt.POSIX-ACL-masker
R
rechtstreekse apparaattoewijzing
referentiemonitor
retourgeoriënteerd programmeren
rolgebaseerde toegangscontrole
S
salt
schaduwpaginatabel
seccomp
SELinux-domein
setuid
SMAP
SMEP
stickybit
systeemaanroep
open() doet een systeemaanroep zodat de kernel de toegang kan controleren voordat hij een bestandsdescriptor retourneert.T
timerinterrupt
TOCTTOU-raceconditie
toegangscontrolelijst
toegangscontrolevermelding
toegangsmatrix
toegangstoken
TOTP
U
UID-koppeling
uitvoerverbodsbit
umask
V
verplichte toegangscontrole
vertrouwde computerbasis
vertrouwelijke gegevensverwerking
veth-paar
virtio
virtuele CPU
virtuele machine
W
W^X
wachtwoordhash
woordenboekaanval
Over deze les
Door StudeliFout melden
Maak je eigen Studiemateriaal
Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.