Best practices voor het bouwen van veilige API's

door Rakesh Talanki en Vidheer Gadikota

Ontwerpers en ontwikkelaars van API (applicatie-programmeerinterface) begrijpen in het algemeen het belang van het naleven van ontwerpprincipes bij het implementeren van een interface. Niemand wil een slechte API ontwerpen of implementeren!

Toch is het soms verleidelijk om te zoeken naar snelkoppelingen om die agressieve sprinttijdlijnen te bereiken, de finish te halen en een API te implementeren. Deze snelkoppelingen kunnen een serieuze risico vormen - onbeveiligde API's.

Ontwikkelaars moeten niet vergeten de hoed van een API-hacker te dragen voordat ze worden geïmplementeerd. Als een ontwikkelaar nalaat de kwetsbaarheden in een API te identificeren, kan de API een open gateway worden voor schadelijke activiteiten.

Identificeren en oplossen van API-kwetsbaarheden

Een API kan voor of tegen zijn provider werken, afhankelijk van hoe goed de provider de vereisten van zijn API-gebruikers heeft begrepen en geïmplementeerd. Als een bedrijf een ongelooflijk veilige API bouwt, kan het heel moeilijk zijn om te gebruiken. Er moet een goed evenwicht worden gevonden tussen het doel van een API en het gebruiksgemak. In dit artikel zullen we enkele van de API-kwetsbaarheden onderzoeken die we tijdens ons werk als onderdeel van het Apigee-team van Google zijn tegengekomen, waaronder hoe deze kwetsbaarheden mogelijk zijn voorkomen.

injecties

API's zijn de toegangspoorten voor ondernemingen om digitaal verbinding te maken met de wereld. Helaas zijn er kwaadwillende gebruikers die toegang proberen te krijgen tot de backend-systemen van bedrijven door onbedoelde opdrachten of uitdrukkingen te injecteren voor het verwijderen, verwijderen, bijwerken en zelfs creëren van willekeurige gegevens die beschikbaar zijn voor API's.

In oktober 2014 heeft Drupal bijvoorbeeld een kwetsbaarheid voor SQL-injectie aangekondigd die aanvallers toegang gaf tot databases, code en bestandsmappen. De aanval was zo ernstig dat aanvallers mogelijk alle gegevens van de sites van klanten hebben gekopieerd. Er zijn veel soorten injectiebedreigingen, maar de meest voorkomende zijn SQL-injectie, RegEx-injectie en XML-injectie. Meer dan eens hebben we API's live zien gaan zonder bescherming tegen bedreigingen - het is niet ongewoon.

API's zonder authenticatie

Een API die is gebouwd zonder bescherming tegen kwaadaardige bedreigingen door middel van authenticatie, is een mislukte API-ontwerp die de databases van een organisatie kan bedreigen. Het negeren van de juiste authenticatie - zelfs als TLS (Transport Layer Encryption) wordt gebruikt - kan problemen veroorzaken. Met een geldig mobiel nummer in een API-verzoek kan bijvoorbeeld elke persoon persoonlijke e-mailadressen en apparaatidentificatiegegevens krijgen. Sterke authenticatie- en autorisatiemechanismen zoals OAuth / OpenID Connect in combinatie met TLS zijn daarom van cruciaal belang.

Gevoelige gegevens in de openbaarheid

Normaal hebben operatieteams en andere interne teams toegang tot traceertools voor foutopsporingsproblemen, die een duidelijk beeld kunnen bieden van API-informatie over de nuttige lading. Idealiter worden PCI-kaarthoudergegevens (CHD) en Personal Health-gegevens (PHI) gecodeerd vanaf het punt waar gegevens worden vastgelegd tot waar gegevens worden verbruikt, hoewel dit niet altijd het geval is.

Met groeiende bezorgdheid over API-beveiliging moet codering van gevoelige en vertrouwelijke gegevens een topprioriteit zijn. In juni 2016 is bijvoorbeeld een http-proxykwetsbaarheid bekendgemaakt die aanvallers op verschillende manieren de mogelijkheid bood om het uitgaande verzoek te proxyen naar een server naar keuze, gevoelige informatie van het verzoek vast te leggen en informatie te verkrijgen over interne gegevens. Naast het gebruik van TLS, is het belangrijk dat API-verkeer wordt beschermd door gevoelige gegevens te coderen, gegevensmaskering voor trace / logging te implementeren en tokenization te gebruiken voor kaartinformatie.

Herhaal aanvallen

Een grote potentiële zorg voor enterprise-architecten is de zogenaamde 'transactie-replay'. API's die open staan ​​voor het publiek staan ​​voor de uitdaging om uit te zoeken of ze binnenkomende verzoeken moeten vertrouwen. In veel gevallen, zelfs als een niet-vertrouwd verzoek wordt gedaan en geweigerd, kan de API de - mogelijk kwaadwillende - gebruiker beleefd toestaan ​​om het opnieuw te proberen.

Aanvallers benutten dit misplaatste vertrouwen door te proberen een legitiem gebruikersverzoek af te spelen of opnieuw af te spelen (in sommige gevallen met behulp van brute force-technieken) totdat ze succesvol zijn. In 2016 kwamen hackers in Github-accounts terecht via een afspeelaanval door e-mailadressen en wachtwoorden van andere gecompromitteerde online services opnieuw te gebruiken en ze uit te proberen op Github-accounts.

Tegenmaatregelen zijn onder meer snelheidsbeperkend beleid om verzoeken te vertragen, het gebruik van geavanceerde tools zoals Apigee Sense om API-aanvraagverkeer te analyseren en identificatie van patronen die ongewenste botverzoeken vertegenwoordigen. Aanvullende beveiligingsmaatregelen om aanvallen opnieuw af te spelen zijn onder meer:

  • HMAC, die tijdstempels bevat om de geldigheid van de transactie tot een gedefinieerde periode te beperken
  • tweefactorauthenticatie
  • een kortstondig toegangstoken inschakelen met OAuth

Onverwachte pieken in API-gebruik

Het is altijd lastig om het gebruik van een API te schatten. Een goed voorbeeld is de app die kort de National Weather Service API heeft uitgebracht. Deze specifieke API had geen enkele vorm van verkeerspiekpreventie of smoormechanisme, dus de onverwachte toename van het verkeer raakte direct de backend.

Het is een goede gewoonte om een ​​arrestatie in spike-verkeer of een gebruiksquotum per app af te dwingen, zodat de backend niet wordt beïnvloed. Dit kan eenvoudig worden uitgerold met behulp van een geavanceerd API-beheerplatform met beleid zoals quota en spike arrestatie.

Toetsen in URI

Voor sommige gevallen is het goed genoeg om API-sleutels te implementeren voor authenticatie en autorisatie. Het verzenden van de sleutel als onderdeel van de URI (Uniform Resource Identifier) ​​kan er echter toe leiden dat de sleutel wordt aangetast. Zoals uitgelegd in IETF RFC 6819, omdat URI-details kunnen worden weergegeven in browser- of systeemlogboeken, kan een andere gebruiker de URI's mogelijk bekijken vanuit de browsergeschiedenis, waardoor API-sleutels, wachtwoorden en gevoelige datums in API URI's gemakkelijk toegankelijk zijn.

Het is veiliger om API-sleutels te verzenden in de kop van de berichtautorisatie, die niet wordt vastgelegd door netwerkelementen. Als vuistregel wordt het gebruik van de HTTP POST-methode met nuttige lading met gevoelige informatie aanbevolen.

Stack Trace

Veel API-ontwikkelaars gebruiken 200 voor alle succesverzoeken, 404 voor alle fouten, 500 voor sommige interne serverfouten en, in sommige extreme gevallen, 200 met een foutbericht in de body, bovenop een gedetailleerd stacktrace. Een stacktracering kan mogelijk een informatielek worden voor een kwaadwillende gebruiker wanneer onderliggende ontwerp- of architectuurimplementaties worden onthuld in de vorm van pakketnamen, klassenamen, frameworknamen, versies, servernamen en SQL-query's.

Aanvallers kunnen deze informatie gebruiken door vervaardigde URL-aanvragen in te dienen, zoals uitgelegd in dit Cisco-voorbeeld. Het is een goede gewoonte om een ​​"gebalanceerd" foutobject te retourneren, met de juiste HTTP-statuscode, met minimaal vereiste foutmelding (en) en "geen stack-trace" tijdens foutcondities. Dit verbetert de foutafhandeling en beschermt API-implementatiedetails tegen een aanvaller. De API-gateway kan worden gebruikt om backend-foutmeldingen om te zetten in gestandaardiseerde berichten zodat alle foutmeldingen op elkaar lijken; dit elimineert ook het blootstellen van de backend codestructuur.

Houd API's veilig

Zoals we in dit artikel hebben beoordeeld, kunnen veel potentiële bedreigingen worden voorkomen door goed na te denken over API-ontwerp en governance-beleid vast te stellen dat in de hele onderneming kan worden toegepast. Het is belangrijk om API's te beschermen tegen kwaadaardige berichtinhoud door gevoelige versleutelde gegevens tijdens runtime te openen en te maskeren en backend-services te beschermen tegen directe toegang. Een API-beveiligingsfout kan aanzienlijke gevolgen hebben - maar met de juiste gedachte en beheer kunnen bedrijven zichzelf veel veiliger maken.

[Op zoek naar meer informatie over API-beveiliging? Ontvang uw exemplaar van ons recente eBook, Inside the API Product Mindset: Building and Management Secure API's.]