Säkerhet för utvecklare

I den här inledande artikeln introducerar jag dig som är utvecklare och idag inte känner till något om säkerhet överhuvudtaget till några av de mest grundläggande begreppen och teknikerna för att ge dig en enklare grund att stå på inför kommande artiklar.

”Vadå säkerhet – jag är ju utvecklare?”

Ett allt för vanligt uttryck är att säkerhet är ingenting som en utvecklare behöver tänka på, det är istället upp till användare eller administratörer att hantera den färdiga applikationen på rätt sätt. Tyvärr så är det just den inställningen som gör att många system dras med onödigt mycket säkerhetshål som snabbt går att identifiera som hacker. Det som många skulle behöva förstå är att säkerhet är något som berör alla inblandade i ett utvecklingsprojekt, arkitekter, designers, testare och absolut inte minst utvecklarna, det betyder också att säkerhet i en applikation inte är något som en projektgrupp bör börja tänka på i slutet av projektet utan ha i åtanke redan från början. För att en utvecklare ska kunna bidra med så mycket som möjligt till projektets säkerhetstänkande krävs både en grundläggande förståelse för vilka vanliga säkerhetshål som existerar i osäkra applikationer, en kunskap om säkerhetstekniker som kan användas för att skydda sig mot dessa, men också en ambition att skriva säker kod, att gå i främsta ledet av utvecklare som tar ansvar för den kod som skrivs och säkerställa att den uppträder på förväntat sätt. Det första en utvecklare behöver lära sig är vilka tekniker som finns att använda sig av i applikationer och vad de löser för utmaningar i dagens och morgondagens lösningar.

”Vadå, är Internet osäkert?”

Trenderna för dagens och morgondagen applikationer och lösningar leder mer och mer mot en viss grad av uppkoppling mot internet, speciellt med den nya generationens olika terminaler som handdatorer, mobiltelefoner, tablet-pcs och bärbara datorer. Det är inte helt ovanligt att dessa terminaler kopplar upp sig mot företags nätverk via internet, från privata bredbandsuppkopplingar, hotspots på hotell och cafeer eller kanske från andra privata nätverk. Det är viktigt att känna till att Internet är en fientlig miljö att vistas på och det blir allt vanligare med olika typer av attacker från hackers och virusmakare som blir allt smartare och lär sig utnyttja brister och sårbarheter i applikationer och operativsystem. Vissa attacker sker mot organisationer med avsikt att införskaffa hemlig information. Vissa hackers har som sitt mål i livet att testa gränser, bryta sig in i säkra system utan att orsaka skada, kanske enbart för att bevisa sin kompetens för sig själv eller någon annan. Det finns utvecklare som skapar virus, trojaner och maskar som ofta orsakar stor skada på både privata datorer som datorer på företag. Andra attacker kan ske av ”misstag” genom brist i utvecklingen av applikationer, där exempelvis användarnamn och lösenord till systemkonton exponeras. Det här är bara exempel på varför vi som utvecklare måste ta vårt ansvar och lära oss både sårbarheterna och hur vi skyddar oss mot dessa, samt naturligtvis använda våra kunskaper i all utveckling som vi gör.

”Så vad behöver jag veta?”

Säkerhet för utvecklare är stort och det finns många termer och tekniker som är relevanta, bli inte förskräckt av detta utan börja från grunderna och arbeta dig djupare in i de ämnen som berör dig närmare än andra. Låt oss ta en vanlig applikation idag som använder internet som bärare av trafik, det kan vara allt från e-handelsapplikationer till enstaka webservices och utmaningarna kan bestå av olika saker. Några vanliga frågor som ofta uppkommer och som härrör till olika tekniker är följande:

Autentisering

”Vem är det som kommer att använda min applikation?”

Detta kallas att autentisera en användare och går vanligtvis ut på att användaren av applikationen får presentera något sorts bevis på att personen är den som den utger sig för att vara, det kan vara en kombination av användarnamn och lösenord, eller ett digital certifikat. Tekniken som används kallas autentisering och det finns ett flertal olika bakomliggande sätt att göra detta på. Windows har inbyggd autentisering med hjälp av användarnamn och lösenord och ibland använd även biometriska lösningar där en användare med hjälp av olika typer av hårdvarulås bevisar sin identitet, t.ex. genom röstigenkänning, fingeravtrycksläsare eller rent av optiska retina-scanners.

Auktorisering

”Vad i min applikation får olika personer göra?”

När användare väl har bevisat sin identitet så gäller det att bestämma vad den personen får tillgång till för funktioner i applikationen, vi kan tänka oss en applikation som en säljanda organisation använder där en avdelning med säljare endbart får mata in nya kunder och avtal, och där en grupp med säljchefer enbart har tillgång till rapporter på befintliga avtal och kan alltså inte skapa nya. Vi kan också auktorisera baserat på innehåll i vår applikation, till exempel så kan vi i en inköpsapplikation se till så att alla anställda får beställa material för 1000 kronor, men chefer i organisationen får handla för 5000 kronor. Det här kallas att auktorisera användare och går vanligtvis ut på att en användare tilldelas rättigheter till applikationen baserat på vilka grupper som den personen är med i eller vilka roller som han eller hon har. Det finns ett flertal sätt att definera, skapa och hantera roller eller grupper, bland annat så finns grupper i Active Directory som enstaka användare kan tillhöra. I Windows Server 2003 finns också ett separat XML-baserat ramverk för rollbaserade lösningar som kan användas istället för att skapa egna ramverk för olika applikationer med egna verktyg och tekniker, detta kallas Authorization Manager och kommer med stor sannolikhet skrivas om inom en snar framtid.

Kryptering

”Hur ser jag till att ingen annan får ta del av informationen?”

Om applikationen lagrar känslig information om exempelvis avtal och kunder så är det väldigt viktigt att den informationen skyddas från intrång. Att använda kryptering är vanligt och går att göra på många olika sätt. Att kryptera information går ut på att med hjälp av en så kallad nyckel transformera informationen så att den blir helt och hållet oläsbar men går att transformera om igen till sitt ursprungliga utseende genom att använda antingen samma nyckel igen (symetrisk kryptering) eller en ytterligare nyckel (asymetrisk kryptering). Symetrisk kryptering är vanligtvis snabbare än asymmetrisk men lider av en sårbarhet i att nyckeln delas mellan mottagare och sändare och kan användas åt båda hållen. Därför måste nyckeln skickas på något sätt till mottagaren av meddelandet samt skyddas för att någon annan aktör inte får tag på nyckeln, då den i praktiken blir värdelös att använda. Vanliga algoritmer för symmetrisk kryptering är DES, Triple DES och AES som även kallas Rijndael.

 

Asymmetrisk kryptering är något långsammare men har en väldigt effektiv nyckelhantering som kan användas både vid kryptering och vid digitala signaturer som kommer att tas upp i stycket nedanför. Vanliga algoritmer för asymetrisk kryptering är RSA, DSA och Diffie-Helman.

 

Kryptering används också ofta vid kommunikation över Internet för att se till att denna inte avlyssnas av personer som inte är avsedda att kunna höra konversationen. Ibland kombineras symmetrisk och asymmetrisk kryptering för att kunna få det som är det bästa av båda algoritmerna. När du exempelvis surfar med din webbläsare till sidor som går över HTTPS och använder SSL (Secure Sockets Layer) så genererar webbläsaren en symmetrisk nyckel som krypteras med webbserverns publika nyckel och skickas till webbservern. Webbservern kan då dekryptera denna nyckel med sin privata nyckel och sedan använda den symmetriska nyckel för fortsatt kommunikation med klienten.

 

Glöm inte heller att all information som krypteras har en tidsrymd då information är relevant, vi kan kalla det för ett bäst-före-datum. Om informationen blir avlyssnad och dekrypterad innan denna tidpunkt så kan vi anse att informationen har sprungit läck, men efter det datumet så spelar det ingen roll. Konkret så innebär detta att ju längre tid vi vill skydda informationen desto längre nycklar (i bitar) bör vi använda oss av och då försvåra för eventuella kryptoanalytiker som försöker komma åt vår information.

Digitala signaturer

Hur vet jag som användare att personen jag kommunicerar med är den jag tror?”

Med digitala signaturer kan olika aktörer på Internet kommunicera och se till att det som skickas över olika protokoll inte förändras på vägen samtidigt som avsändaren kan garanteras med hjälp av privata och publika nycklar på liknande sätt som i asymetrisk kryptering. En digital signatur skapas genom ett fåtal steg enligt följande:

 

  1. Den som skriver ett dokument och vill skicka detta till någon annan person eller aktör på Internet behöver en privat och en publik nyckel, här kommer certifikat väldigt väl till pass eftersom dessa oftast innehåller detta nyckelpar.
  2. Avsändaren av dokumentet använder en speciell sorts algoritm för att beräkna en aritmetisk checksumma på hela dokumentets innehåll, denna checksumma kallas vanligtvis för hash och kan inte användas för att återskapa innehållet i dokumentet med.
  3. Checkumman krypteras med avsändarens privata nyckel och skickas sedan tillsammans med dokumentet och avsändarens publika nyckel till mottagaren.
  4. Mottagaren beräknar en egen checksumma på dokumentet som mottagits med samma algoritm som avsändaren använt, sedan dekrypteras den krypterade checksumman som skickats från avsändaren med hjälp av den publika nyckeln.
  5. Checksummorna jämförs och om dessa överrensstämmer så vet mottagaren av dokumentet att dokumentet inte förändrats efter att avsändaren skickat dokumentet samt att avsändaren är den som den utger sig för att vara.

Och hur lär jag mig allt det här?

Idag finns en uppsjö av bra böcker för utvecklare som vill lära sig mer om säkerhet, men också artiklar finns i massor. På den svenska MSDN-sidan kommer jag att skriva och publicera ett flertal artiklar och också recensera och länka till andra intressanta sidor, artiklar och böcker. Min förhoppning är att jag ska kunna hjälpa dig att snabbare hitta fram till sidor och information som är relevant för säkerhet i allmänhet och utveckling på Microsofts teknik och produkter i synnerhet. Det som också är viktigt är att redan nu, efter att du läst den här artikeln, börja ta ett större ansvar för den kod som du skriver, tänka på vilka sårbarheter eller luckor som just dina skapade funktioner och metoder exponerar och hur dessa kan täppas till innan den färdiga lösningen lanseras.

Sammanfattning

Jag har inte haft som avsikt att i denna inledande artikel lösa några större utmaningar eller ge någon specifik djupdykning i något separat ämne utan min ambition var att ge en kort introduktion till vad som vi bör känna till initiellt när vi börjar utveckla applikationer. Min förhoppning är ändå att jag ska ha gett dig en liten vink om hur autentisering, auktorisering, kryptering och digitala signaturer går till och används i applikationer samt naturligtvis motivera dig till att fortsätta lära dig mer om säkerhet för utvecklare, och avslutningsvis, det ska vara kul att skriva säker kod, och med kunskap blir det roligare!