Er zijn veel manieren om authenticatie op te bouwen in een API-first product zoals SparkPost, en degene die we in een vroeg stadium kozen is het gebruik van API-sleutels. Het injecteren van je API-sleutel als een ruwe Authorization-header of via standaard HTTP Basic Auth maakt het erg eenvoudig om onze API's te gebruiken. Dergelijke API-sleutels zijn een gangbare standaard voor webservices, maar hoe veilig is dit systeem?
De risico's
Bij het gebruik van een webservice, als een aanvaller je API-sleutel te pakken krijgt, kunnen ze namens jou handelen en dingen doen zoals (in ons geval):
hun e-mail gratis via jouw account versturen
je ontvangerslijst downloaden en deze aan spammers doorgeven (als ze zelf geen spammers zijn)
je sjablonen bewerken om phishing-links in te voegen
namens jou spam of phishing versturen
Elk van deze uitkomsten kan zeer schadelijk zijn voor je reputatie en je bedrijf, en in het geval van phishing mogelijk direct schade toebrengen aan je eindgebruikers. Dit is de reden waarom het uiterst belangrijk is ervoor te zorgen dat niemand je API-sleutel kan ontdekken.
De kansen
Heb ik bruteforce gehoord? Onze API-sleutels zijn willekeurig gegenereerde 40-cijferige hexadecimale strings. Dit maakt een totaal van 1.4615e+48 API-sleutels. Als alle 3 miljard computers en smartphones in de wereld 100 API-sleutels per seconde zouden proberen, aannemende dat onze servers dat zouden toestaan, zou het meer dan 150.000.000.000.000.000.000.000.000.000 jaar duren om door alle mogelijke API-sleutels heen te gaan. Dus brute forcing van de API-sleutel heeft gewoon geen zin.
Dus hoe kan iemand je API-sleutel vinden? Omdat de sleutel als een header wordt doorgegeven, kan deze worden gelezen met man-in-the-middle-aanvallen, dus je moet er altijd voor zorgen dat je client de SSL-certificaten controleert wanneer je verbinding maakt met onze API's (dit is een belangrijke reden waarom we https vereisen voor API-verbindingen). Ook, als je slordig omgaat met het gebruik van openbare code repositories zoals GitHub, kan je API-sleutel gemakkelijk blootgesteld raken. Dit is geen academisch probleem: er zijn bekende bots die GitHub crawlen om API-sleutels te vinden, en er zijn succesvolle aanvallen via die vector geweest.
IP-whitelisting ter redding
Wanneer je een API-sleutel aanmaakt, kun je nu een lijst opgeven van IP's die gemachtigd zijn om deze sleutel te gebruiken. Je kunt meerdere IP's opgeven, evenals IP-blokken, met behulp van de CIDR-notatie, zodat je je servers niet afzonderlijk hoeft op te sommen. Wanneer de API-sleutel wordt gebruikt, voor REST API's of SMTP, zullen we het verbindende IP vergelijken met deze lijst om toegang toe te staan of te weigeren.
Met deze functie, zelfs als je API-sleutel wordt gevonden of gestolen, zullen alleen je servers het kunnen gebruiken. Gezien de risico's en hoe eenvoudig het is om het in te stellen, raden we al onze klanten ten zeerste aan deze functie te gebruiken.
Laatste woorden
Enkele persoonlijke aanbevelingen met betrekking tot beveiliging:
Bewaar je API-sleutels niet in code. Er zijn veel voordelen aan het bewaren als omgevingsvariabelen, zoals Heroku doet
Je kunt een onbeperkt aantal API-sleutels creëren, en het is beter voor de beveiliging om de verantwoordelijkheden over meerdere API-sleutels te verdelen, in plaats van slechts één alles-in-één-sleutel. Dit zou je ook in staat stellen om verschillende IP-whitelijsten per sleutel te hebben, voor een nog betere scheiding van verantwoordelijkheden
Als je met derden werkt, deel je API-sleutel dan niet, maar maak een nieuwe voor hen aan, met alleen de nodige rechten, en gekoppeld aan hun IP's
Aangezien API-sleutels alleen via de UI kunnen worden aangemaakt, is 2-factor authenticatie inschakelen op je SparkPost-account een must-have en kost slechts 2 minuten