Two-Factor Authentication Med Duo-Security

I min siste artikkel om tofaktorsautentisering opprettet jeg en skjermbilde som skisserte hvordan du bruker authy-tofaktorautentiseringssystemet for å enkelt forbedre innloggingssikkerheten til nettstedet ditt. Denne gangen skal vi se på en annen tjeneste av Duo Security, som tilbyr en solid sikkerhets-API, guider og forhåndsbygde biblioteker som gjør det utrolig enkelt å komme seg raskt opp.

Akkurat som Authy, trenger du en applikasjonsserver for å implementere Duo siden noen aspekter av den, spesielt de hemmelige nøklene, må defineres på et ikke-tilgjengelig sted. For denne opplæringen bruker jeg Duos ColdFusion-bibliotek, men de tilbyr også libs for:

  • Python
  • Rubin
  • Klassisk ASP
  • ASP.Net
  • Java
  • PHP
  • node.js
  • Perl

Fra et servert perspektiv har de definitivt fått en god dekning.


Få din app klar på Duo

Det første du må gjøre er å registrere deg for en konto. Jeg skal ikke gå deg gjennom disse trinnene, siden det burde være selvforklarende, men jeg vil si det var kult å se et gratis alternativ tilgjengelig slik at jeg kunne lage denne opplæringen uten kostnad. Ja, Duo kostnader for deres tjeneste og ærlig det er en god ting. Du vil sørge for at en tjeneste som hjelper deg med å sikre nettstedet ditt, har penger til å holde seg i virksomhet for litt.

Når du er registrert, blir du bedt om å sette opp en ny integrasjon. Dette betyr bare at du må sette opp detaljene for hva du vil sikre. Og du vil se hvorfor jeg sier "hva du vil sikre" når du klikker på Integrasjonstype fall ned. Duo lar deg sette opp en rekke sikkerhetsalternativer, ikke bare et nettsted.


For våre formål bruker vi Web SDK"alternativ Integrasjonsnavn er et hvilket som helst semantisk navn du vil bruke til å identifisere nettstedet ditt med.


Etter å ha lagret den informasjonen, presenteres du med en innstillingsside for integrasjonen. Dette er hvor du finjusterer hvordan autentiseringen skal fungere og få tilgang til integrasjonen, hemmelige nøkler og API-vertsnavn. Disse er kritiske for å kunne jobbe med Duo og bør ikke deles.


I tillegg må du opprette din egen alfanumeriske applikasjonsnøkkel med 40 tegn, som ikke er kjent for Duo, og sikrer større kontroll over kontoen din og applikasjonen. For eksempel genererte jeg følgende tilfeldig nøkkel for min demo-app:

gQNU4CYYu3z5YvVuBamA7ZUvQ2cbe98jjI8G6rkL

Bare vær oppmerksom på at den må være 40 tegn lang. Ellers får du en feil når du prøver å bruke den.

Som du ser gjennom innstillingene, er de fleste selvforklarende, men det er en seksjon som heter Politikk som lar deg definere når en bruker blir bedt om tofaktorautentisering. Det er viktig å velge det beste alternativet for appen din. Fra min erfaring har de fleste nettsteder en tendens til å spørre brukerne om de ønsker å registrere seg for den forbedrede sikkerheten. To-faktor auth kan være tungvint og noen brukere vil bare ikke bruke den. For dette scenariet skal jeg gå med Krev innmelding politikk (som sikrer at Duo-registreringsprosessen ikke omgåes) og angir et flagg i brukerens databaseoppføring når de har valgt. Dette tillater brukere å logge inn ved hjelp av din normale autentiseringsordning uten å bli tvunget til å autentisere via Duo.

I virkeligheten er det egentlig alt jeg trengte å sette opp på Duo admin panel for å gjøre tjenesten tilgjengelig for appen min. Så la oss begynne å legge til i noen kode.


Legger Duo til min app

Jeg vil gjenta at du må bygge server-side kode for å virkelig gjøre dette arbeidet, og Duo har gitt et bredt spekter av libs for deg å bruke.

Koden jeg skriver er CFML, og jeg bruker sin ColdFusion-komponent som styrer alle kompleksiteten ved å signere og kryptere forespørselen min, samt å verifisere returverdien fra Duo API.

Som nevnt tidligere, er de fleste tofaktoraktiveringene innlogging, noe som betyr at en bruker vil gå til kontoinnstillingene sine, klikke på en kobling for å slå på tjenesten og gå gjennom en prosess for å fylle ut relevant informasjon for å få ting til å fungere. Dette innebærer vanligvis å gi tjenesten et mobilnummer og validere innstillingene basert på et unikt nummer som sendes enten via tekstmelding eller en telefonsamtale. Duo kan tilby brukerne enten alternativet og gir også sin egen mobilapp som kan generere passordet for brukere via deres telefon.

Hvis du ser på skjermbildet nedenfor, kan du se hvordan jeg har forsøkt å kopiere en enkel kontoskjerm med en fremtredende knapp under den som en oppfordring til å slå på godkjenningen:


Når brukeren klikker på det, blir det ringt til Duo-komponenten for å signere forespørselen via signRequest () metode.

 

For å forstå hva denne metoden gjør, vil jeg gjerne bruke et tilbud fra Duo-siden:

sign_request () utfører en HMAC-SHA1 av brukernavnet, integrasjonsnøkkelen og en utløps-tidsstempel, ved hjelp av integrasjonens hemmelige nøkkel som HMAC-nøkkelen. Ved å generere denne server-siden og etter primær autentisering, er Duo sikret at brukeren faktisk er autorisert til å fortsette til sekundærstadiet av godkjenning.

I utgangspunktet skaper det en kryptert forespørsel basert på alle nøklene for integrasjonen din, den unike 40-karaktære søkenøkkelen du opprettet, og brukerens unike brukernavn. Sluttresultatet ser noe ut som dette:

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

Signaturen blir lagret i variabelen session.sigReq som er en vedvarende øktbasert variabel som jeg kan referere senere. Jeg sjekker verdien sin for å sikre at en gyldig signatur ble sendt tilbake, og i så fall kan jeg gå videre til neste side i prosessen.


Duo IFRAME

Signaturen sendes til Duo's IFRAME som administrerer både tillegg av nye brukere til tjenesten, samt validering av eksisterende brukere. Duo tilbyr et JavaScript-bibliotek som samhandler med IFRAME for å gi brukergrensesnittet til oppsettbrukere. Ser på koden under, kan vi se IFRAME, referansen til Duo JS lib, og metoden ring for å initialisere alt:

  

Metoden anropet er grei, tar tre alternativer:

  • API-vertsnavnet som ble definert for integrasjonen.
  • Signaturforespørselen som vi genererte.
  • Nettadressen som Duo vil legge ut resultatene til når det er ferdig med å gjøre behandlingen.

Hvis du er forvirret av dette, # Session.sigReq #, ikke vær. Det er bare ColdFusions måte å erstatte en variabel med verdien.

På dette tidspunktet vil brukeren bli presentert med Duo-oppsettskjermen:


Brukeren må skrive inn et telefonnummer og deretter velge om de vil motta sin seksifrede valideringskode via tale eller tekstmelding. Jeg prøvde begge og de jobbet like bra. Duo gjør verifisering på slutten for å sikre at koden blir oppgitt, gyldig.

Deretter vil brukeren bli presentert med en skjerm for å laste ned Duo-mobilappen:


Dette er faktisk en god ting fordi å ha mobilappen vil tillate brukeren å få en kode selv om de ikke har noen celle service.

Når de er vellykket innmeldt, mottar de siden som vises nedenfor, og bedt om en gang til å validere seg selv:


For all hensikt er hele denne prosessen i Duos hender; du venter bare på tilbakemelding.

Tilbakemeldingen vil avgjøre om brukeren har blitt riktig konfigurert, og du må bruke verifyResponse () metode for det.

Som før tar det alle nøkkelvariablene, og i dette tilfellet mottar du et svar fra Duo i form av en oppdatert variabel som kalles sig_response. Jeg har referert til det som form.sig_response siden det er slik ColdFusion tillater tilgang til oppdaterte variabler.

De verifyResponse () Metoden vil ta det signerte svaret sendt tilbake av Duo, og hvis alt er bra, returnerer brukerens brukernavn for å validere mot databasen din. Så i mitt tilfelle, ville jeg forvente at "[email protected]" ville bli returnert. Når jeg har validert det, setter jeg deretter flagget i brukerens databasepost som vil gi meg beskjed om at de har valgt to-faktor-autentisering.

Det er det. Det er alt du trenger å gjøre for å konfigurere brukere for å aktivere tofaktorautentisering. La oss nå skifte til innloggingsopplevelsen.


Logg inn med Duo

Du kan forvente noe magisk å skje herfra, men interessant nok, kan du nesten gjenbruke samme eksakte kode som er opprettet for å aktivere en bruker for å tillate dem å logge inn. Jeg gikk videre og opprettet en veldig grunnleggende innloggingsside:


Selve siden er bare HTML markup. Den viktige delen er å først avgjøre om brukeren har logget inn, og det skjer når du bekrefter deres vanlige nettstedinnloggingsinformasjon. Ja, du bør fortsatt gjøre din normale innloggingsvalidering av brukernavn og passord. Duos tjeneste er komplementær til det, ikke en erstatning.

Ved å sjekke databaseposten, bør du kunne avgjøre om de har valgt. Hvis de ikke har det, ville du bare godkjenne dem ved å bruke ditt vanlige brukernavn / passord kombinasjon. Hvis de har, så skal du ringe signRequest () metode, samme som vi brukte når du aktiverte en ny bruker:

Igjen skaper vi en kryptert signatur for å sende til Duos API via dets IFRAME- og JavaScript-bibliotek. Det viktigste er at i dette scenariet trenger vi bare å håndheve tofaktorautentisering hvis brukeren har registrert seg for den. Derfor er det viktig å sette riktig policy for integrasjonen. Ved å sette min til Krev innmelding og ved hjelp av et databasepostflagg kan jeg fortsatt tillate brukeren å få tilgang til nettstedet mitt, selv om de ikke har valgt for tofaktorautentisering. Hvis brukeren har logget på, blir de bedt om å legge inn en Duo-kode for å validere kontoen sin.


Innpakning

Å øke sikkerheten til en nettside er alltid en god ting. Du vil sørge for at du beskytter brukerne dine så mye som mulig, og ved hjelp av tofaktorsautentisering er et stort skritt i riktig retning.

Duo tilbyr en solid service med utrolig enkelhet og fleksibilitet. Mens jeg bare viste deg deres web-SDK, har de også en mye mer fleksibel API som gir deg svært granulær kontroll over de fleste aspekter av prosessen. Mens jeg anbefaler å bruke web-SDK, er det flott å vite at du har den strømmen til din disposisjon. Hat er av til Duo for å skape en god service.