kunskap om hur man säkrar REST API är lika viktigt som att skriva API: erna själv. För det mesta är REST API: er HTTP-protokollbaserade, och alla användare som har internetanslutning kan komma åt dem, och det kan också dåliga användare. Det är mycket viktigt att skriva säkra API: er för att skydda verksamheten.
innan vi börjar säkra RESTful API: er, Låt oss förstå vad alla är våra alternativ som utvecklare? Vad passar bra för vår användningfallet?
Table of Contents1. Authentication vs. Authorization2. Four Ways to Secure RESTful Web Services- BASIC Authentication- DIGEST Authentication- Client CERT Authentication- OAUTH2 API Keys3. RESTful Web Services Security Implementations- Using SecurityContext- Using Annotations4. Best Practices
- skillnad mellan autentisering vs. auktorisation
- fyra sätt att säkra RESTful webbtjänster
- 2.1. Grundläggande autentisering
- 2.2. DIGEST Authentication
- 2.3. Client CERT Authentication
- 2.4. OAUTH2 API-nycklar
- REST API-Säkerhetsimplementeringar
- 3.1. JAX-RS SecurityContext instans
- 3.2. JAR-RS annotations for method level authorization
- REST API säkerhet bästa praxis
- var det här inlägget till hjälp?
skillnad mellan autentisering vs. auktorisation
innan vi hoppar in i huvuddiskussionen, låt oss göra våra fakta raka om vad som är autentisering och vad som är auktorisation.
på vanlig enkel engelska är autentisering processen att fastställa att ”är användaren verkligen någon som han påstår sig vara”. I tekniska termer är det processen att logga in på systemet via användarnamn / lösenord eller liknande mekanismer, t.ex. fingeravtrycksskanning, säkerhetstoken, säkerhetsfrågor eller SAML-token mottagen från SSO-inloggning. Det måste finnas något som kan identifiera användaren från andra.
när användaren är inne i systemet hänvisar auktorisering till regler som bestämmer ”vad användaren får göra” och vad han inte är, t.ex. en vanlig användare kan skicka ett meddelande i någon offentlig grupp, men användare endast med redigeringsroll kommer att kunna ta bort något. Auktorisering ses ofta som både inledande inställning av behörigheter av en systemadministratör och kontroll av behörighetsvärden som redan har ställts in när en användare får åtkomst till systemet.
när vi säkrar RESTful webbtjänster måste vi ta hand om båda faktorerna. De två koncepten är helt ortogonala och oberoende, men båda är centrala för säkerhetsdesign, och misslyckandet med att få en korrekt ökar risken för kompromissat system..
fyra sätt att säkra RESTful webbtjänster
det finns flera sätt att säkra ett RESTful API i Java. Låt oss gå igenom 4 mest populära val:
2.1. Grundläggande autentisering
det är enklaste av alla tekniker och förmodligen mest använda också. Du använder inloggnings – / lösenordsformulär-det är bara grundläggande autentisering. Du anger ditt användarnamn och lösenord och skicka formuläret till servern, och ansökan identifiera dig som användare – du får använda systemet – annars får du fel.
det största problemet med denna säkerhetsimplementering är att referenser sprids på ett vanligt sätt från klienten till servern. Referenser är bara kodade med Base64 i transit, men inte krypterade eller hashade på något sätt. På så sätt kan alla sniffer läsa de skickade paketen över nätverket.
HTTPS föredras därför vanligtvis framför eller används tillsammans med grundläggande autentisering vilket gör konversationen med webbservern helt krypterad. Det bästa är att ingen ens kan gissa från utsidan att grundläggande Auth äger rum.
2.2. DIGEST Authentication
denna autentiseringsmetod använder sig av en hashing algoritmer för att kryptera lösenordet (kallas lösenord hash) in av användaren innan du skickar den till servern. Detta gör det självklart mycket säkrare än den grundläggande autentiseringsmetoden, där användarens lösenord färdas i vanlig text som lätt kan läsas av den som avlyssnar det.
Läs Mer: generera krypterade lösenord
det finns många sådana hashingalgoritmer i java också, vilket kan visa sig vara riktigt effektivt för lösenordssäkerhet som MD5, SHA, BCrypt, SCrypt och PBKDF2WithHmacSHA1 algoritmer.
kom ihåg att när detta lösenord hash genereras och lagras i databasen, kan du inte konvertera det tillbaka till det ursprungliga lösenordet. Varje gång användaren logga in ansökan, måste du regenerera lösenord hash igen, och matcha med hash lagras i databasen. Så om användaren har glömt sitt lösenord måste du skicka honom ett tillfälligt lösenord och be honom ändra det med sitt nya lösenord. Det är en vanlig trend nu för tiden.
2.3. Client CERT Authentication
detta är en mekanism där ett förtroendeavtal upprättas mellan servern och klienten genom certifikat. De måste undertecknas av en byrå som är etablerad för att säkerställa att certifikatet som presenteras för autentisering är legitimt, vilket kallas CA.
med den här tekniken, när klienten försöker komma åt en skyddad resurs, istället för att tillhandahålla ett användarnamn eller lösenord, presenterar det certifikatet för servern. Certifikatet innehåller användarinformationen för autentisering inklusive säkerhetsuppgifter, förutom ett unikt privat-offentligt nyckelpar. Servern bestämmer sedan om användaren är legitim genom CA. Dessutom måste det verifiera om användaren har tillgång till resursen. Denna mekanism måste använda HTTPS som kommunikationsprotokoll eftersom vi inte har en säker kanal för att förhindra att någon stjäl klientens identitet.
du kan hitta en komplett handledning för att generera säkerhetscertifikat i officiella oracle docs.
2.4. OAUTH2 API-nycklar
om du någonsin har utvecklat applikationer som interagerar med andra applikationer via moln, t.ex. Facebook-integration eller twitter-autentisering etc. då har du redan använt det här. De kräver att du tillhandahåller API-nyckel och API-hemlighet för att korrekt identifiera dig. Dessa API-nyckel och hemlighet är några slumpmässiga kodade sträng som är omöjligt att gissa.
för att förstå hur det fungerar, låt oss anta att du använder en Flickr (photo sharing application) och vill lägga upp några av dina foton med hjälp av REST API. Du bygger begäran som dokumenterad i Flickr docs och skickar sedan den.
då, när du tar emot begäran, autentiserar Flickr användaren genom att läsa informationen från API-nyckeln med den hemliga nyckeln som tillhör användaren. När dessa valideringar är framgångsrika levererar servern svaret till klienten. Således får vi ett svar med alla foton som nyligen har publicerats inom Flickr.
som du märker kan du enkelt skapa applikationer med leverantörens API. Leverantören låter dig också autentisera, få tillgång till offentlig information.
om någon börjar respektera avtal, t.ex. skicka skräptrafik eller någon policyöverträdelse, drar leverantören tillbaka API-nyckeln och förhindrar missbruk av sina API: er.
REST API-Säkerhetsimplementeringar
förutom ovanstående koncept måste du vanligtvis säkra dina RESTful API: er i ditt företag med hjälp av nedanstående metoder.
3.1. JAX-RS SecurityContext instans
gränssnittet javax.ws.rs.core.SecurityContext
ger åtkomst till säkerhetsrelaterad information för en begäran och liknar mycket javax.servlet.http.HttpServletRequest
.
du kommer åt SecurityContext genom att injicera en instans i ett klassfält, setter-metod eller metodparameter med javax.ws.rs.core.Context
– anteckningen, t.ex. i nedanstående kod sc.isUserInRole()
används för att kontrollera behörighet för användare.
denna teknik används ofta i företagsapplikation och används för att verifiera roller och ansvar för en autentiserad använd – för någon viss operation. JAX-RS ger nedan anteckningar för detta ändamål.
- @PermitAll
- @DenyAll
- @RolesAllowed
ett exempel på användning av annotering kan vara:
Läs Mer : JAX-RS autentisering och auktorisering exempel
REST API säkerhet bästa praxis
Låt oss notera några viktiga punkter när du utformar säkerhet för dina RESTful webbtjänster.
- Använd endast HTTPS-protokollet så att hela din kommunikation alltid är krypterad.
- Skicka aldrig auth-referenser eller API-nycklar som query param. De visas i URL och kan loggas eller spåras enkelt.
- använd hårdaste krypteringsnivå alltid. Det kommer att hjälpa till att ha mer förtroende.
- för resurser som exponeras av RESTful web services är det viktigt att se till att alla PUT, POST och DELETE-förfrågningar är skyddade från förfalskning av Cross Site Request.
- validera alltid indata asap den tas emot i servermetoden. Använd endast primitiva data som ingångsparameter så mycket som möjligt.
- lita på ramverk som tillhandahålls valideringsfunktioner eftersom de redan testas av stora samhällen.
Låt mig veta dina tankar och erfarenheter om hur du säkrar RESTful Webbtjänster i din organisation.
Lyckligt Lärande !!