Website accounts beveiligen – Deel 2/2
In deel 1 van “Website Account Beveiliging” hebben we het gehad over de risico’s van een accountmanagement systeem en welke rol het wachtwoord speelt binnen beveiliging.
Nu gaan we kijken naar de verwerking van de wachtwoorden en overige gegevens. Ook hier valt qua beveiliging vaak nog veel te sleutelen.
Secure Connection:
Zorg er ook voor dat MiTM (Man in the Middle) aanvallen niet mogelijk zijn. Bij een Man in the Middle aanval luistert de hacker het verkeer af tussen de server en de bezoeker. Als er gevoelige informatie over de lijn verzonden worden dan heeft de hacker deze ook. Om MiTM aanvallen te voorkomen raden we aan om gebruik te maken van een veilige verbinding middels SSL (of beter nog TLS). Dit doet u met een geldig (signed) SSL certificaat. Zorg ervoor dat elke pagina die werkt met gevoelige gegeven met SSL beveiligd is.
Wachtwoord opslag:
Als wachtwoorden sterk zijn en veilig verzonden zijn is het zaak om deze ook veilig op te slaan in de database. Als iemand immers uw database kan hacken (SQLi) dan zal deze ook beschikken over alle gebruikersnaam + wachtwoord combinaties.
Wachtwoorden kunnen op een paar manieren opgeslagen worden in de database:
- Platte tekst (geen beveiliging
- Encrypted (encryptie middels een symetrische sleutel)
- Hashed (data wordt omgezet in willekeurige tekens, de vingerafdruk)
- Salted (hetzelfde als hashed maar een salted hash zal nooit hetzelfde zijn als de opgeslagen wachtwoorden wel hetzelfde zijn. Deze hash is niet omkeerbaar)
U kunt het beste de wachtwoorden salted (of salted en encrypted) opslaan omdat deze nooit te achterhalen zijn. Een encryptie kan gekraakt worden en een hash kan middels een rainbow table teruggedraait worden.
Wachtwoorden e-mailen:
Not-done! E-mail nooit het wachtwoord naar een gebruiker. E-mails worden meestal niet gewist dus het wachtwoord blijft in de e-mail van de gebruikers staan waar het vatbaar is voor hackers die de
PC kraken of voor Malware die de e-mail kan lezen. Daarnaast worden mailaccounts vaak gesynchroniseerd op vele apparaten waardoor het wachtwoord ineens ook op je telefoon en tablet staat.
Of het nu gaat om een wachtwoord herinnering of een account registratie, een wachtwoord mag niet gemaild worden. E-mails worden ook onbeveiligd verzonden omdat er geen transport layer beveiliging is op SMTP. Het e-mail verkeer is dus ook gevoelig voor MiTM attacks.
Account Enumeration:
Onbedoeld geven websites vaak het e.e.a. prijs over hun beveiliging. De hacker zal deze zaken onderzoeken en waar nodig misbruiken.
Hierboven hebben we het al even gehad over het e-mailen van wachtwoorden. Als de hacker ziet dat dit mogelijk is weet hij meteen dat het wachtwoord niet hashed is opgeslagen in de database omdat een hashed wachtwoord niet zomaar terug opgehaald kan worden.
Maar laten we ook even kijken naar het “wachtwoord resetten” systeem. Het is mooi dat een gebruiker zelf zijn wachtwoord kan resetten. Kijk echter uit met de melding die gegeven wordt. Nu zien we vaak na het invullen van een gebruikersnaam of e-mailadres de volgende 2 meldingen:
- Helaas, het door u opgegeven account is bij ons niet bekend. Probeer het s.v.p. nogmaals.
- Hartelijk dank. Wij hebben u een e-mail met instructies verzonden hoe u uw wachtwoord kunt resetten.
Maar dat is makkelijk! Deze systemen vertellen dus simpelweg of een account wel of niet bestaat.
Hetzelfde is van toepassing op registratiesystemen die vertellen of een gebruikersnaam + wachtwoord wel of niet in gebruik is alvorens alle overige gegevens incl. captcha te hebben ingevuld. Ook dit is een security VS usability afweging.
De juiste methode om een wachtwoord te resetten:
De volgende methode is een veilige methode om wachtwoorden te resetten:
- De gebruiker moet ingelogd zijn om bij de “wachtwoord reset” functie te kunnen.
- Zodra de gebruiker hierop klikt moet de gebruiker nogmaals inloggen.
- De gebruiker vult 2x het nieuwe wachtwoord in.
- Het systeem geeft nu de melding “Hartelijk dank. Uw wachtwoord wordt gereset zodra u op de link klikt die wij u zojuist gemaild hebben. Tot die tijd blijft het oude wachtwoord geldig.
- De gebruiker ontvangt een e-mail met een reset token (URL). Deze URL mag slechts 1 keer bruikbaar zijn en heeft een beperkte geldigheid van maximaal 1 uur.
- De gebruiker ontvangt in de e-mail ook een unieke pincode.
- Na het klikken op de link komt de gebruiker op de webpagina waar de melding gegeven wordt dat het wachtwoord goed gereset is. De gebruiker wordt hier niet automatisch ingelogd.
De juiste methode om een wachtwoord te sturen als de gebruiker deze vergeten is:
- De volgende methode is een veilige methode om wachtwoorden te resetten:
- De gebruiker vult zijn e-mailadres in.
- Het systeem geeft nu de melding “Hartelijk dank. Wij hebben de instructies om uw wachtwoord te resetten naar het opgegeven e-mailadres verstuurd.” Deze melding laat het systeem ook zien bij accounts die niet in de database voorkomen.
- De gebruiker ontvangt een e-mail met een reset token (URL). Deze URL mag slechts 1 keer bruikbaar zijn en heeft een beperkte geldigheid van maximaal 1 uur.
- De gebruiker ontvangt in de e-mail ook een unieke pincode.
- Na het klikken op de link komt de gebruiker op een webpagina waarbij hij zijn pincode moet invoeren en zijn nieuwe wachtwoord (2x).
- Als alles correct is wordt het wachtwoord gereset en is het oude wachtwoord niet meer geldig.
Cookies:
Cookies maken het mogelijk om privilege escalation in hand te werken. Een voorbeeld hiervan is een slecht geprogrammeerde “onthoud mij” functie. Een slecht geprogrammeerde “onthoud mij” functie zal gebruik maken van een persistent browser cookie. Dit is dus een plain tekst cookie die bewaard blijft na het sluiten van de browser. Deze cookies bevat je inloggegevens en is voor iedereen te lezen die toegang heeft tot je apparaat, waaronder mogelijke malware. Maar deze cookie wordt ook op en neer gezonden tussen de server en uw bezoeker bij elke actie die gedaan wordt. Als dit niet over een veilige verbinding gebeurt is het voor een hacker mogelijk om deze te onderscheppen. De cookie is vaak ook niet HTTP-Only dus kan gebruikt worden door JavaScript. De Cookie dan te onderscheppen door een XSS aanval.
De auth-cookie die gebruikt wordt bij het inloggen mag niet langer geldig zijn dan een paar uur. Als een “onthoud mij” functie echt nodig is dan ontkomt u er niet aan om de TTL (Time To Live) van de cookie te verhogen. Maar alleen dan, en niet voor de standaard auth-cookie. Maak de cookie ook HTTP-Only zodat de kans op een XSS aanval kleiner is.
Account Lockout:
Een goede beveiliging tegen Brute-Force attacks is het instellen van een account lockout. Een goede account lock-out zorgt ervoor dat een bepaalde gebruiker de komende 10 min niet meer in kan loggen nadat deze 5x in 2 minuten tijd het foute wachtwoord geprobeerd heeft.
Er zijn ook lockout systemen die gebruikers van een bepaald IP adres blokkeren als deze een x aantal keer binnen een x tijdsbestek foutief hebben ingelogd. Het nadeel aan IP lockouts is dat er ook legitieme gebruikers die datzelfde IP adres gebruiken niet meer in kunnen loggen. En hackers hebben vele IP adressen tot hun beschikking waardoor switchen tussen IP adressen niet zo lastig is.
Resume account beveiliging:
- Gebruik een veilig wachtwoord
- Zorg dat gevoelige informatie (dus ook account gerelateerde zaken) altijd over een veilige verbinding verzonden worden.
- Zorg dat wachtwoorden veilig worden opgeslagen
- E-mail nooit het wachtwoord aan een gebruiker
- Zorg voor een goede workflow om wachtwoorden te resetten
- Zorg ervoor dat het systeem geen meldingen geeft die voor een hacker interessant zijn
- Zorg ervoor dat cookies zo veilig mogelijk zijn
- Implementeer bij voorkeur geen “onthoud mij” functie
- Zorg voor een goede account lockout controle
Conclusie:
Accountmanagement systemen zijn alles behalve simpel. De functionaliteiten die ze moeten verwerken zijn vaak complex en lastig te programmeren en beveiliging is moeilijk te implementeren. Tijdens het ontwikkelen van een accountmanagement systeem is het zaak om beveiliging direct mee te nemen zodat deze in alle processen en workflows doorgevoerd kan worden.