Säkerhet

Att använda “rätt” nivå på säkerhet i dina APIer ger dig möjlighet att användandet av dessa kan ske utan att säkerheten äventyras och att informationen som hanteras skyddas på ett korrekt sätt. Ytterligare säkerhetsöverväganden kan gälla beroende på API-design och krav från informationens informationsklassning m.m.

Transportsäkerhet

  • All transport SKALL (SÄK.01) ske över HTTPS med minst TLS 1.2.
  • Alla certifikat SKALL (SÄK.02) vara från SHA-2 (Secure Hash Algorithm 2) kryptografiska hashfunktioner med minsta nyckellängd på 2048.
  • Alla offentligt tillgängliga endpoints SKALL (SÄK.03) använda ett digitalt certifikat som har undertecknats av en godkänd certifikatutfärdare.
  • Endpoints avsedd för internt bruk KAN (SÄK.04) använda självsignerade digitala certifikat.
  • Omdirigera inte HTTP-trafik till HTTPS – avvisa dessa förfrågningar.
  • Oanvända HTTP-metoder BÖR (SÄK.05) inaktiveras och returnera HTTP-status 405.
  • Alla requests SKALL (SÄK.06) valideras.

Beroende på säkerhetsklassificeringen av informationen i API:et KAN (SÄK.07) du behöva upprätta följande kontroller utöver standardkontrollerna:

  • Ömsesidig autentisering mellan konsumenten och API-gateway.
  • Ömsesidig autentisering mellan API Gateway och back-end API.
  • PKI Mutual TLS OAuth-klientautentiseringsmetod.
  • Vitlistning av IP-nummer för API-konsumenter som använder antingen API Gateway Policy eller brandväggskonfigurationer.
  • Vitlistning av IP-nummer för API-producenter som använder antingen API Gateway Policy eller brandväggskonfigurationer.
  • Kryptering av payload under överföring.
  • Signering av payload för integritet och verifiering.

Autentisering och auktorisation

Om man i informationsklassningen har restriktioner till vilka som får konsumera informationen i API:et så SKALL (SÄK.08) autentisering och auktorisation användas.

  • Basic- eller Digest-autentisering SKALL INTE (SÄK.09) användas.
  • Authorization: Bearer header SKALL (SÄK.10) användas för autentisering/auktorisation.
  • En uppdateringstoken SKALL (SÄK.11) tillhandahållas för att förlänga giltighetstiden för befintliga token utan att behöva tillhandahålla referenserna igen.
  • Ställ alltid in en rimlig giltighetstid för tokens. En OIDC-åtkomsttokens livslängd BÖR INTE (SÄK.12) överstiga 5 minuter.
  • Klientapplikationsidentitet BÖR (SÄK.13) etableras via en konsekvent mekanism. Detta kan vara via en API-nyckel eller via en mer robust mekanism som en OAuth-serveridentitet.
  • Rotationspolicy för API-nycklar BÖR (SÄK.14) implementeras där så är tillämpligt.
  • API-nycklar SKALL INTE (SÄK.15) inkluderas i URL eller querysträngen.
  • API-nycklar SKALL (SÄK.16) inkluderas i HTTP-headern eftersom querysträngar kan sparas av klienten eller servern i okrypterat format av webbläsaren eller serverapplikationen.
  • CORS-headers (Cross-origin resource sharing) BÖR (SÄK.17) endast användas när det är nödvändigt eftersom det kringgår de övergripande säkerhetsmekanismerna som är inbyggda i webbläsare genom att selektivt lätta på restriktioner för cross-origins, RFC 6454.
    • Använd aldrig URL-adresser med jokertecken (*) i response headers (dvs. Access-Control-Allow-Origin) såvida inte REST-resursen verkligen är offentlig och kräver liten eller ingen auktorisation för användning.
    • En request från domän A anses vara Cross-Origin när den försöker göra en request till ett API som finns på domän B.
      • Av säkerhetsskäl begränsar webbläsares HTTP-förfrågningar med flera ursprung.
      • Cross-Origin Resource Sharing-standarden fungerar genom att lägga till nya HTTP-headers (d.v.s. Access-Control-Allow-Origin) som tillåter servrar att beskriva vilka domäner som har tillåtelse att komma åt API:et

OAuth

OAuth version 2.0 eller senare BÖR (SÄK.18) användas för auktorisation. OAuth är ett auktorisationsprotokoll som säkert delegerar behörighet till en annan resurs. Det tillåter användare att godkänna applikationer att agera för deras räkning utan att dela med sig av sitt lösenord.

Abstraktion

Det finns flera abstraktionsnivåer, benämningar av abstraktionsnivån baseras till stor del på antalet konsumenter och kostnaden för att ändra systemet på grund av en API-ändring.

Som en allmän princip BÖR (SÄK.19) det finnas en abstraktionsnivå av källsystemets data- och affärslogik i din API-design för att frikoppla konsumenterna och API-tjänsteleverantörerna. Det rekommenderas att tillämpa grundläggande abstraktion på ett SaaS API (som ett Azure API). Till exempel; om det finns ändringar i SaaS-autentiseringsschemat kan det hanteras inom API:t.

En högre abstraktionsnivå skulle krävas för API:er som har flera konsumenter och kostnaden för förändring för API-konsumenterna är större än kostnaden för att byta backend-system/tjänsteleverantörer.

De olika abstraktionsnivåerna är följande:

AbstraktionsnivåBeskrivning
Grundläggande

Representerar den minsta abstraktion som krävs för alla API:er (inklusive punkt-till-punkt)

  • Använd JSON som din standardrepresentation. 
  • Ange alltid ett versionsnummer i URL:en för att underlätta ändringen. 
  • Använd alltid ett API Key ID.
  • Lite eller ingen abstraktion av datamodellen och exponera data vid behov.
Mellan

API:er som syftar till återanvändning BÖR (SÄK.20) överväga mellanliggande abstraktionsnivån

  • Payload representerar affärsresurser som en abstraktion av domänmodellen, oberoende av implementationen, med fokus på klientanvändbarhet och självbetjäning.
  • Interna databastabellstrukturer SKALL INTE (SÄK.21) exponeras direkt i ditt API. 
  • Hantera fel i källsystem på ett konsekvent och informativt sätt. 
  • Exponering av interna systemidentifierare BÖR INTE (SÄK.22) (exempelvis ett databas-ID) med konsumenter. Använd en kandidatnyckel eller en sekundär identifierare.
Avancerad

Den högsta abstraktionsnivån omfattar alla andra nivåer.

  • Använd API Gateway för att ta hand om övergripande problem som säkerhet, trafikhantering och analys/övervakning. 
  • Använd hypermedia med länkad data för att främja "upptäckbarheten" av dina API-resurser och relationer. 
  • HATEOAS BÖR (SÄK.23) användas för att abstrahera tillåtna åtgärder.

Begränsa användandet av API:et

Tillämpa policyer för att begränsa antal requests eller systematiskt missbruk för att förhindra felaktig användning av ditt API. Se till att lämpliga varningar implementeras och svara med informativa felmeddelanden när tröskelvärdena närmar sig eller har överskridits.

Följande headers returneras vid användning av “rate limits”:

HeaderBeskrivning
X-RateLimit-LimitMax antal meddelanden för en specifik tidsperiod (exempelvis, 100 meddelanden).
X-RateLimit-RemainingAntal återstående meddelanden återstår innan max begränsningen är nådd.
X-RateLimit-ResetÅterstående tid innan antal nyttjade meddelanden återställs.

Felhantering

Felmeddelanden SKALL INTE (SÄK.24) avslöja information som kan användas för att attackera ditt system. För att undvika detta upprätta följande kontroller när du tillhandahåller felmeddelanden:

  • Ett API SKALL (SÄK.25) maskera alla systemrelaterade fel bakom vanliga HTTP-statuskoder och felmeddelanden, t.ex. exponera inte information på systemnivå i ditt felmeddelande
  • Ett API SKALL INTE (SÄK.26) skicka tekniska detaljer (t.ex. anropsstackar eller andra interna tips) till klienten

Loggning

En viktig aspekt av säkerheten är att bli meddelad när något fel inträffar och att kunna undersöka det. Man BÖR (SÄK.27) definiera loggningsnivåer som kan användas för att trigga lämpliga varningar och larm.

  • Skriv audit-loggar före och efter säkerhetsrelaterade händelser som kan utlösa varningarna
  • Sanering av loggdata för att förhindra logginjektionsattacker

Validering av ingående parametrar

Validering av ingående parametrar BÖR (SÄK.28) utföras för att säkerställa att endast korrekt formaterad data tas emot av ditt system, detta hjälper till att förhindra skadliga attacker.

  • Validering av indata bör ske så tidigt som möjligt, helst så snart informationen har tagits emot från den externa parten
  • Definiera exempelvis en lämplig storleksgräns för request och avvisa requests som överskrider gränsen
  • Validera exempelvis: längd/intervall/format och typ
  • Överväg att logga valideringsfel på indata. Anta att någon som utför hundratals misslyckade indatavalideringar per sekund har en skadlig avsikt
  • Begränsa stränginmatningar med reguljärt uttryck där så är lämpligt

Validering av innehållstyp

Man BÖR (SÄK.29) respektera angiven content-type i header. Avvisa förfrågningar som innehåller oväntade eller saknade content-type headers med HTTP-status “415 Unsupported Media Type

Gateway säkerhetsfunktioner

Det är att föredra att använda säkerhetspolicyfunktionerna som finns i API Gateway-plattformar än att implementera policyerna i ditt back-end API.

SäkerhetKommentarImplementationskrav
HTTP verbHTTP verb bör användas för att beskriva sökvägen för ett API.BÖR (SÄK.30)
Validering av parametrarOlika typer av filter bör användas bekräfta giltigheten på input till ett API. Exempelvis meddelandestorlek, kontroll av scheman, kontroll av headers eller kontroll av sökparametrar.BÖR (SÄK.31)
SSLSSL protokoll (TLS 1.2).BÖR (SÄK.32) 
Digitala certifikatOlika filter och funktioner kan användas för att säkerställa ett certifikat.KAN (SÄK.33), beroende på affärskrav
JWT Ett meddelande kan signeras med hjälp av JWT:er.KAN (SÄK.34), beroende på affärskrav
API KeysAPI Keys bör användas för identifiera en klient.BÖR (SÄK.35)
OAUTH OAUTH bör användas för identifiera en klient.BÖR (SÄK.36), beroende på affärskrav
CORS CORS bör tillåta resursdelning över domängränser när det är nödvändigt.BÖR (SÄK.37)