Elk van de drie grote aanbieders heeft een schakelaar boven het niveau van de individuele bucket die alles overschrijft wat iemand daaronder heeft ingesteld. Uw middag bestaat uit twee taken: eerst vinden wat al openstaat, en daarna die schakelaars aanzetten zodat het volgende onzorgvuldige beleid niets meer uitricht. Doe dit in die volgorde, want de schakelaars breken alles wat ervan afhankelijk is dat het openbaar is.
Wat "openbaar" betekent per platform
De definities verschillen, en de audit moet naar elk van de drie zoeken.
| Platform | Wat het openbaar maakt | Guardrail die dit overschrijft |
|---|---|---|
| AWS S3 | ACL's die toegang geven aan de groepen AllUsers of AuthenticatedUsers, of een bucket policy die niet aantoonbaar niet-openbaar is | Block Public Access, op account- of organisatieniveau |
| Azure Blob | Het account staat anonieme toegang toe en het containerniveau staat op Container of Blob | AllowBlobPublicAccess op False in het storage account |
| Google Cloud Storage | allUsers of allAuthenticatedUsers in een IAM-policy van een bucket of in een object-ACL | Public access prevention, per bucket of via de constraint storage.publicAccessPrevention |
S3 beschouwt een bucket policy als openbaar zolang het tegendeel niet is bewezen. Een policy telt alleen als niet-openbaar als zij toegang verleent aan vaste waarden, zonder wildcards of policy-variabelen, zoals een specifieke principal of een set CIDR-blokken via aws:SourceIp. Een wildcard-principal faalt dus de test.
Bij Azure moeten beide voorwaarden gelden. Als het account anonieme toegang niet toestaat, is de containerinstelling irrelevant. Staat het account anonieme toegang wel toe, dan blijft een container nog steeds privé totdat iemand het niveau op Container of Blob zet.
Stap 1: vind wat openstaat
S3. De AWS-handleiding verwijst voor het beoordelen van openbare buckets naar IAM Access Analyzer for S3, dus begin daar. Controleer vervolgens per account de vier instellingen van Block Public Access: BlockPublicAcls, IgnorePublicAcls, BlockPublicPolicy en RestrictPublicBuckets. Let op: GetBucketAcl geeft de effectieve rechten terug. Een bucket met een openbare ACL en IgnorePublicAcls ingeschakeld toont een ACL die de echte verbergt.
Azure. In de portal ziet u eerst het aantal anonieme requests. Open in het storage account Monitoring en vervolgens Metrics. Gebruik de Blob-namespace, de metric Transactions, de aggregatie Sum, en voeg een filter toe met Authentication gelijk aan Anonymous.
Om te zien welke containers erbij betrokken zijn, maakt u een diagnostic setting die logs naar een Log Analytics workspace stuurt. Voer daarna deze query uit, die de afgelopen zeven dagen beslaat:
StorageBlobLogs
| where TimeGenerated > ago(7d) and AuthenticationType == "Anonymous"
| project TimeGenerated, AccountName, AuthenticationType, Uri
De kolom Uri toont de containers en blobs die gelezen worden. Metrics en logs laten alleen zien wie anoniem leest, niet wat blootligt, dus een open container waar niemand om heeft gevraagd blijft onzichtbaar. Controleer daarom ook de toegangsniveaus van de containers.
Google Cloud. Inspecteer de IAM-policies van buckets op rollen die zijn toegekend aan allUsers of allAuthenticatedUsers. Cloud Asset Inventory toont de policies van alle buckets in een project, map of organisatie, zodat u niet bucket voor bucket hoeft te werken. Object-ACL's vragen om een aparte controle en managed folders hebben hun eigen IAM-policies. Zet usage logs aan om te zien welke workloads openbare data benaderen. Cloud Audit Logs registreert geen toegang tot openbare objecten en helpt hier dus niet.
Stap 2: zet de guardrails aan
S3. AWS adviseert alle vier de instellingen op accountniveau in te schakelen. Ook adviseert AWS alle vier op elke bucket aan te zetten om te voldoen aan Security Hub-control S3.8. Gebruik bij meerdere accounts een policy op organisatieniveau. Die policy is alles-of-niets, zonder keuze per instelling, en overschrijft de instellingen op accountniveau in de geselecteerde member accounts. S3 past de meest restrictieve combinatie over de niveaus heen toe, zodat een bucket niet kan verzwakken wat het account afdwingt.
Pas BlockPublicPolicy met name op accountniveau toe. Anders kan iedereen die een bucket policy mag bewerken een policy invoegen die de instelling op bucketniveau uitschakelt. Wijzigingen op accountniveau gelden voor alle Regions, maar komen mogelijk niet overal tegelijk door. Instellingen voor access points kunnen alleen bij het aanmaken worden gezet, dus controleer die apart.
Azure. Zet AllowBlobPublicAccess op False voor elk storage account. Dit overschrijft elke containerinstelling, dus u hoeft de containers zelf niet aan te raken. Hiervoor is versie 2019-04-01 of nieuwer van de Azure Storage resource provider nodig. De gebruiker heeft Microsoft.Storage/storageAccounts/write nodig, dat in de rollen Owner, Contributor en Storage Account Contributor zit. Houd die toewijzingen beperkt.
Google Cloud. Dwing public access prevention af op buckets, of stel de organization policy constraint storage.publicAccessPrevention in op project-, map- of organisatieniveau. Google adviseert af te dwingen op het hoogste niveau dat u kunt. De status van een bucket is of enforced of inherited. Een bucket met een afgedwongen instelling blijft enforced, ook als u de constraint erboven later uitschakelt.
Wat er stukgaat en wat niet
Houd rekening met storingen, want dat is precies de bedoeling van de oefening.
- S3: De instellingen wijzigen bestaande policies of ACL's niet. Als u een instelling verwijdert, wordt alles met een openbare policy of ACL weer openbaar, dus ruim ook de onderliggende grants op. Beoordeel daarnaast identity-based policies en resource policies zoals KMS-key policies, die Block Public Access niet afdekt.
- Azure: Anonieme leesverzoeken gaan falen. De foutcode hangt af van de serviceversie: 401 voor versie 2019-12-12 en nieuwer, anders 409 wanneer het account anonieme toegang niet toestaat en 404 wanneer het die wel toestaat.
- Google Cloud: Requests met
allUsersfalen met HTTP 401 of 403. Bestaande bindings blijven staan maar worden overschreven. Pogingen om ze toe te voegen mislukken met412 Precondition Failed. Signed URL's worden niet beïnvloed. Het afdwingen kan tot 10 minuten duren, en gecachete objecten kunnen openbaar blijven gedurende deCache-Control-levensduur, die standaard 3600 seconden is.
Echt openbare content, zoals een statische website, vraagt om een uitzondering. Azure adviseert die te verplaatsen naar een apart storage account dat gereserveerd is voor anonieme toegang. Schakel op Google Cloud prevention uit voor het specifieke project waarin de bucket staat. Pas in S3 de afzonderlijke instellingen aan voor de buckets die dat nodig hebben.
Waar u begint
- Maak een lijst van elk AWS-account, elk Azure-abonnement en elk Google Cloud-project waarin opslag staat, ook de omgevingen waarvan niemand zich herinnert dat ze zijn aangemaakt.
- Voer de bovenstaande discovery uit: Access Analyzer for S3, de Azure-metric en logquery voor anonieme requests, en Cloud Asset Inventory voor IAM-policies van buckets.
- Bepaal bij elke openbare bevinding of die bewust is. Verplaats legitieme openbare content naar speciale accounts of projecten.
- Schakel de controls op account- of organisatieniveau in: alle vier de S3-instellingen,
AllowBlobPublicAccessop False en de constraintstorage.publicAccessPrevention. - Voer de queries enkele dagen later opnieuw uit om te bevestigen dat het aantal anonieme requests naar nul is gedaald, en stel een alert in op de Azure-metric voor anonieme requests.
- Wilt u een externe controle van wat nog bereikbaar is, dan dekt onze pentestdienst blootstelling in de cloud en kan ons consultingteam uw accountstructuur beoordelen.
