Twee-factorenauthenticatie met Duo-beveiliging

In mijn laatste artikel over tweefactorauthenticatie, heb ik een screencast gemaakt waarin wordt geschetst hoe het Authentic-authenticatiesysteem met twee factoren moet worden gebruikt om de inlogbeveiliging van uw website eenvoudig te verbeteren. Deze keer gaan we kijken naar een andere service van Duo Security, die een solide beveiligings-API, handleidingen en kant-en-klare bibliotheken biedt die het ongelooflijk gemakkelijk maken om snel aan de slag te gaan.

Net als Authy heb je een applicatieserver nodig om Duo te implementeren, omdat sommige aspecten ervan, met name de geheime sleutels, op een niet-toegankelijke plek moeten worden gedefinieerd. Voor deze zelfstudie gebruik ik de ColdFusion-bibliotheek van Duo, maar ze bieden ook libs voor:

  • Python
  • Robijn
  • Klassieke ASP
  • ASP.Net
  • Java
  • PHP
  • Node.js
  • Perl

Vanuit het oogpunt van de server hebben ze zeker een goede dekking.


Uw app gereedmaken voor Duo

Het eerste dat u moet doen, is aanmelden voor een account. Ik ga je niet door die stappen heen lopen, omdat het vanzelfsprekend zou moeten zijn, maar ik zal zeggen dat het cool was om een ​​gratis optie te zien, zodat ik deze tutorial kosteloos kon maken. Ja, Duo brengt kosten in rekening voor hun service en eerlijk gezegd is dat een goede zaak. U wilt zeker weten dat een service die u helpt uw ​​site te beveiligen geld heeft om zichzelf een beetje in bedrijf te houden.

Zodra u bent aangemeld, wordt u gevraagd om een ​​nieuwe integratie in te stellen. Dit betekent alleen dat u de details moet instellen van wat u wilt beveiligen. En u zult zien waarom ik zeg, "wat u wilt beveiligen" wanneer u op klikt Integratietype laten vallen. Met Duo kunt u verschillende beveiligingsopties instellen, niet alleen een website.


Voor onze doeleinden gebruiken we de Web SDK"optie Integratie naam is een semantische naam die u wilt gebruiken om uw site te identificeren.


Nadat u die informatie hebt opgeslagen, krijgt u een instellingenpagina te zien voor uw integratie. Hier kunt u bepalen hoe de verificatie moet werken en krijgt u toegang tot uw integratie, geheime sleutels en API-hostnaam. Deze zijn essentieel voor het succesvol werken met Duo en mogen niet worden gedeeld.


Daarnaast moet u uw eigen alfanumerieke toepassingssleutel van 40 tekens maken die Duo niet kent en die zorgt voor meer controle over uw account en toepassing. Ik heb bijvoorbeeld de volgende willekeurige sleutel gegenereerd voor mijn demo-app:

gQNU4CYYu3z5YvVuBamA7ZUvQ2cbe98jjI8G6rkL

Houd er rekening mee dat het uit 40 tekens bestaat. Anders krijg je een foutmelding wanneer je het probeert te gebruiken.

Terwijl je door de instellingen kijkt, zijn de meeste vanzelfsprekend maar er is een sectie genaamd Het beleid waarmee u kunt definiëren wanneer een gebruiker om verificatie met twee factoren wordt gevraagd. Het is belangrijk om de beste optie voor uw app te kiezen. Vanuit mijn ervaring hebben de meeste sites de neiging om hun gebruikers te vragen of ze zich willen aanmelden voor de verbeterde beveiliging. Twee-factor authenticatie kan omslachtig zijn en sommige gebruikers willen het gewoon niet gebruiken. Voor dit scenario ga ik met de Inschrijving vereisen beleid (dat ervoor zorgt dat het Duo-inschrijvingsproces niet wordt overbrugd) en een vlag in de databaserecord van de gebruiker plaatst wanneer deze zich heeft aangemeld. Hiermee kunnen gebruikers inloggen met uw normale authenticatieschema zonder te worden geauthenticeerd via Duo.

In werkelijkheid was dat eigenlijk alles wat ik nodig had om in te stellen in het Duo-beheerpaneel om de service beschikbaar te maken voor mijn app. Laten we beginnen met het toevoegen van wat code.


Duo toevoegen aan mijn app

Ik wil herhalen dat je code op de server moet bouwen om dit echt te laten werken en dat Duo een breed scala aan libs voor je heeft geleverd om te gebruiken.

De code die ik schrijf is CFML en ik zal hun ColdFusion-component gebruiken die alle complexiteiten van het ondertekenen en coderen van mijn verzoek beheert, evenals het verifiëren van de retourwaarde van de Duo API.

Zoals ik eerder al zei, zijn de meeste activeringen met twee factoren opt-in, wat betekent dat een gebruiker naar zijn accountinstellingen gaat, op een link klikt om de service in te schakelen en een proces doorloopt om relevante informatie in te vullen om dingen te laten werken. Meestal gaat het erom de service een mobiel nummer te geven en de instellingen te valideren op basis van een uniek nummer dat via sms of een telefoontje wordt verzonden. Duo kan gebruikers beide opties aanbieden en biedt ook hun eigen mobiele app die de toegangscode voor gebruikers via hun telefoon kan genereren.

Als u de onderstaande schermafbeelding bekijkt, kunt u zien hoe ik heb geprobeerd om een ​​eenvoudig accountscherm te kopiëren met een prominente knop eronder, als een aansporing om de authenticatie in te schakelen:


Wanneer de gebruiker erop klikt, wordt er een oproep gedaan naar het Duo-onderdeel om het verzoek te ondertekenen via de signRequest () methode.

 

Om te begrijpen wat deze methode doet, zou ik graag een citaat van de Duo-site willen gebruiken:

sign_request () voert een HMAC-SHA1 uit van de gebruikersnaam, integratiesleutel en een verlooptijdstempel met behulp van de geheime sleutel van de integratie als de HMAC-sleutel. Door het genereren van deze server-side en na primaire authenticatie, is Duo verzekerd dat de gebruiker inderdaad geautoriseerd is om door te gaan naar de secundaire fase van authenticatie.

Kortom, het maakt een versleuteld verzoek op basis van alle sleutels voor uw integratie, de unieke 40-char applicatie-sleutel die u hebt gemaakt en de unieke gebruikersnaam van de gebruiker. Het eindresultaat ziet er ongeveer zo uit:

TX | cmV5YmFuZ29AZ21haWwuY29tfERJVzJNWDNQUDVOV0wxOVk0SVJPfDEzNzE4NDk1MTc = | 2ec4457684ad00419cfa04f833f5e99f29d20935: APP | cmV5YmFuZ29AZ21haWwuY29tfERJVzJNWDNQUDVOV0wxOVk0SVJPfDEzNzE4NTI4MTc = | d53e0565ab8d632ccac40097dfedc4356dd79209

De handtekening wordt opgeslagen in de variabele session.sigReq dat is een persistente op sessies gebaseerde variabele die ik later kan raadplegen. Ik controleer de waarde ervan om ervoor te zorgen dat een geldige handtekening is teruggestuurd en zo ja, ik kan doorgaan naar de volgende pagina in het proces.


De Duo IFRAME

De handtekening wordt doorgegeven aan IFRAME van Duo, die zowel de toevoeging van nieuwe gebruikers aan de service beheert, als de validatie van bestaande gebruikers. Duo biedt een JavaScript-bibliotheek die samenwerkt met de IFRAME om de gebruikersinterface te voorzien van instellingsgebruikers. Als we naar de onderstaande code kijken, zien we de IFRAME, de verwijzing naar de Duo JS lib en de methodeoproep om alles te initialiseren:

  

De methodeaanroep is eenvoudig en neemt drie opties:

  • De API-hostnaam die is gedefinieerd voor uw integratie.
  • Het handtekeningverzoek dat we hebben gegenereerd.
  • De URL die Duo de resultaten zal posten zodra deze klaar is met de verwerking ervan.

Als je hierdoor in de war bent, # Session.sigReq #, wees niet. Het is gewoon ColdFusion 'manier om een ​​variabele te vervangen door zijn waarde.

Op dit punt krijgt de gebruiker het Duo-instelscherm te zien:


De gebruiker moet een telefoonnummer invoeren en vervolgens kiezen of hij zijn zescijferige validatiecode via spraak of sms wil ontvangen. Ik probeerde het allebei en ze werkten even goed. Duo doet verificatie aan het einde om ervoor te zorgen dat de ingevoerde code geldig is.

Vervolgens krijgt de gebruiker een scherm om de mobiele Duo-app te downloaden:


Dit is eigenlijk een goede zaak, want als u de mobiele app gebruikt, kan de gebruiker een code ontvangen, zelfs als deze geen celservice heeft.

Nadat hun aanmelding is gelukt, ontvangen ze de onderstaande pagina en vragen ze er nog een keer om zichzelf te valideren:


In alle opzichten ligt dit hele proces in Duo's handen; je wacht gewoon op feedback.

Die feedback zal bepalen of de gebruiker correct is ingesteld en je moet de verifyResponse () methode daarvoor.

Zoals hiervoor, neemt het alle belangrijke variabelen en ontvangt in dit geval een reactie van Duo in de vorm van een geposte variabele genaamd sig_response. Ik heb het als gerefereerd form.sig_response omdat ColdFusion zo toegang geeft tot de geposte variabelen.

De verifyResponse () methode neemt het ondertekende antwoord teruggestuurd door Duo en als alles goed is, zal de gebruikersnaam van de gebruiker voor u worden teruggestuurd om te valideren tegen uw database. Dus in mijn geval zou ik verwachten dat "[email protected]" zou worden geretourneerd. Nadat ik het heb gevalideerd, plaats ik de vlag in de databaserecord van de gebruiker die me laat weten dat ze zich hebben aangemeld voor tweefactorauthenticatie.

Dat is het. Dat is alles wat u hoeft te doen om gebruikers in te stellen om verificatie met twee factoren te activeren. Laten we nu naar de login-ervaring gaan.


Aanmelden met Duo

Je zou kunnen verwachten dat er iets magischs van hieruit gebeurt, maar interessant genoeg kun je bijna dezelfde exacte code gebruiken die je hebt gemaakt om een ​​gebruiker te activeren om in te loggen. Ik ging door en creëerde een heel eenvoudige inlogpagina:


De pagina zelf is slechts HTML-markup. Het belangrijkste onderdeel is om eerst te bepalen of de gebruiker zich heeft aangemeld en dat gebeurt wanneer u de normale login-informatie van de site valideert. Ja, u moet nog steeds uw normale inlogvalidatie van uw gebruikersnaam en wachtwoord uitvoeren. Duo's service is daar complementair aan, geen vervanging.

Door het databaserecord te controleren, moet u kunnen bepalen of ze zich hebben aangemeld. Als dat niet het geval is, authenticeert u ze alleen met uw normale combinatie van gebruikersnaam en wachtwoord. Als ze dat hebben, dan ga je de signRequest () methode, dezelfde die we gebruikten bij het activeren van een nieuwe gebruiker:

Nogmaals, we maken een gecodeerde handtekening om naar Duo's API te verzenden via de IFRAME- en JavaScript-bibliotheek. Het belangrijkste is dat we in dit scenario alleen authenticatie met twee factoren afdwingen als de gebruiker zich hiervoor heeft aangemeld. Daarom is het belangrijk dat u het juiste beleid voor uw integratie instelt. Door de mijne in te stellen Inschrijving vereisen en met behulp van een vlag van een databaserecord, kan ik de gebruiker nog steeds toegang verlenen tot mijn site, zelfs als deze zich niet heeft aangemeld voor tweefactorauthenticatie. Als de gebruiker zich heeft aangemeld, wordt hem gevraagd een Duo-code in te voeren om zijn account te valideren.


Afsluiten

Het verhogen van de veiligheid van uw site is altijd een goede zaak. U wilt ervoor zorgen dat u uw gebruikers zoveel mogelijk beschermt en dat het gebruik van tweefactorauthenticatie een grote stap in de goede richting is.

Duo biedt een gedegen service met ongelooflijk gemak en flexibiliteit. Hoewel ik je hun web-SDK alleen heb laten zien, hebben ze ook een veel flexibelere API die je heel gedetailleerde controle geeft over de meeste aspecten van het proces. Hoewel ik aanbeveel om de Web SDK te gebruiken, is het fijn te weten dat je die kracht tot je beschikking hebt. Hat is op weg naar Duo voor het creëren van een geweldige service.