Integrering av tofaktorautentisering med CodeIgniter

Med den siste strengen med høy profilinnbrudd (hacks) hos Sony og andre selskaper, er det på tide at du tok et nytt blikk på sikkerheten til nettstedet ditt. Tofaktorautentisering er et skritt i riktig retning for å sikre nettstedet ditt fra angriperne. I denne veiledningen tar vi en titt på implementeringen av dette i vårt CodeIgniter-program.


Hva er tofaktorautentisering?

Tofaktorautentisering krever at brukere bruker noe de kjenner, for eksempel et brukernavn og passord, og noe de har, som en telefon, for å logge på.

I det siste har selskaper som Google og Facebook rullet ut tofaktorautentisering for sine brukere. Andre tjenester, som MailChimp, bruker alternative former for tofaktorautentisering for å bidra til å hindre angripere. Men fortsatt, hva er spesifikt tofaktorautentisering?

Tofaktorautentisering er en måte å bevise din identitet basert på brukernavn og passord, samt en fysisk enhet som du kan bære med deg.


Duos mobilprogram støtter pushvarsler for autentisering!

Dette gjør det mye vanskeligere for skurke å stjele din identitet, siden de trenger tilgang til din telefon eller maskinvare token - ikke bare påloggingsinformasjonen din.

Heldig for deg, Duo Security tilbyr en gratis tofaktorservice som er ideell for alle som ønsker å beskytte deres nettsted.

Ikke bare er Duo gratis, men den er full av funksjoner. De lar deg autentisere på en rekke måter, inkludert:

  • Telefonnummerautentisering
  • SMS-baserte tokens
  • Mobil app token generator
  • Push-basert autentisering
  • Maskinvare tokens tilgjengelig for kjøp

Trinn 1: Oppsett

Oppsett CodeIgniter

Hvis du ikke har jobbet med CodeIgniter før, anbefaler jeg på det sterkeste at du sjekker ut theCodeIgniter From Scratch series først.

Denne opplæringen vil bygge på Easy Authentication med CodeIgniter opplæring. Denne opplæringen vil være mye lettere for deg å forstå hvis du fullfører den forrige opplæringen før du fortsetter. Vi vil bruke filene fra den opplæringen som utgangspunkt.

Vennligst kontroller at din config / autoload.php har følgende hjelpere lastet.

$ autoload ['helper'] = array ('url', 'form');

Opprett en konto

Gå over til Duo Security, og registrer deg for en konto.

De tilbyr en gratis plan for open source-prosjekter, og for nettsteder med mindre enn 10 Duo-brukere (En Duo-bruker er noen som vil bruke tofaktorautentiseringen for å logge på).

Lag en integrasjon

Etter å ha registrert, må du logge på Duo og opprette en integrasjon. Når du er logget inn, klikker du på integrasjoner på sidepanelet for å trekke opp integrasjonssiden. Derfra klikker du på knappen "Ny integrering".

Sørg for at integrasjonen du lager, er en web-SDK-integrasjon. Dette vil tillate deg å bruke PHP API med CodeIgniter.

Integrasjonsnavnet brukes kun på Duos nettsted. Dette er bare en måte for deg å identifisere integrasjonen din. Duo har en startveiledning som forklarer hvordan man etablerer en integrering.

Last ned web-SDK

I tillegg til å sette opp en integrasjon, må du laste ned web-SDK.

Det er to deler av SDK som vi trenger: En PHP-fil (duo_web.php) og en JavaScript-fil. Vær oppmerksom på at JavaScript har en jQuery-avhengighet, og det medfølgende JavaScript leveres med jQuery.

Vi bruker den medfølgende JavaScript, men merk at hvis du ikke er det, må jQuery lastes inn før JavaScript levert av Duo. For mer informasjon om web-SDK og hvordan det fungerer, se dokumentasjonen på http://www.duosecurity.com/docs/duoweb


Trinn 2: Modifikasjoner for sikkerhet

Etter å ha fullført Easy Authentication med CodeIgniter opplæringen, bør du ha et grunnleggende påloggingssystem på plass.

Bedre Hashing

Som et første skritt legger vi til en sterk hashing-funksjon i databasen. Openwall har et fint PHP hashing bibliotek som implementerer bcrypt. Den nyeste versjonen av phpass er 0,3 på tidspunktet for denne artikkelen.

Gå videre og last ned phpass fra deres nettsted: http://openwall.com/phpass/. Etter at du har lastet ned og arkivert mappen, må du plassere det i bibliotekets mappe.

Vi må nå lage vår egen biblioteksfil som et grensesnitt til phpass. Opprett en ny biblioteksfil, oppkalt password.php. Vårt bibliotek har to funksjoner:

  • en hash-funksjon for å rehash de gamle passordene
  • en check_password funksjon for å sammenligne hashes med plaintext passord.
require_once ( 'phpass-0,3 / PasswordHash.php'); klasse passord var $ hasher; funksjon __construct () // 8 er hashstyrken. En større verdi kan brukes til ekstra sikkerhet. // TRUE gjør passordene bærbare. FALSE er mye sikrere. $ this-> hasher = nytt PasswordHash (8, SANT);  funksjonshash ($ pass) return $ this-> hasher-> HashPassword ($ pass);  funksjon check_password ($ pass, $ hash) return $ this-> hasher-> CheckPassword ($ pass, $ hash); 

De require_once () erklæring sikrer at vi vil kunne bruke PasswordHash klasse fra phpass.

PasswordHash tar to argumenter i sin konstruktør:

  • et tall som indikerer hashstyrke
  • en boolean om passordene skal være bærbare eller ikke.

I dette tilfellet skal vi gjøre passordene våre bærbare.

Dette betyr i hovedsak at hash ikke er så sterk, men hvis vi noen gang trenger å bytte servere eller flytte databasen, kan vi lage en kopi. Hvis vi ikke bruker et bærbart hashingprogram, risikerer vi at alle brukerne oppretter nye passord hvis databasen er flyttet.

Merk: Selv om vi implementerer en sterkere hashing-funksjon, bør du likevel kreve at brukerne har et sterkt passord.

Endre adminmodellen

 offentlig funksjon verify_user ($ email, $ password) $ q = $ this -> db -> hvor ('email_address', $ email) -> limit (1) -> get ('users'); hvis ($ q-> num_rows> 0) $ result = $ q-> row (); $ Dette-> last> bibliotek ( 'passord'); // Kontroller at hashene samsvarer. hvis ($ dette-> passord-> sjekk_password ($ passord, $ resultat-> passord)) return $ result;  returnere false; 

Tidligere valgte vi brukeren etter e-postadressen og det hevede passordet. Nå drar vi brukeren fra databasen basert på e-postadressen. Dette betyr at vi må validere passordet før vi kan returnere brukeren.

Etter at vi har trukket brukeren fra databasen, laster vi inn passordbiblioteket vi nettopp har opprettet, og bekrefter at det angitte passordet samsvarer med det harpassede passordet.

Hvis de to passordene stemmer overens, fortsetter vi å returnere brukeren, ellers returnerer vi falsk.

Pass på at du bruker passordbiblioteket til å ha et nytt passord for deg selv. Passordene i databasen din vil være ugyldige nå!

Endre brukertabellen

Vi skal legge til et grunnleggende tillatelsesfelt til databasen. Denne tillatelsen bestemmer hvorvidt brukeren vil logge inn med tofaktorautentisering eller ikke.

Vi må legge til en kolonne i brukertabellen for tofaktorrettigheter. Du kan gjøre dette via phpMyAdmin, eller ved å kjøre følgende SQL.

ALTER TABLE-brukere ADD to_factor_permission BOOLEAN NOT NULL;

En verdi på 1 i tillatelseskolonnen vil gjøre at brukeren bruker tofaktorautentisering.

SQL vil legge til en boolsk kolonne til brukertabellen. Vi bruker dette for å kreve at brukere bruker tofaktorautentisering, eller omgå det.

Hvis du gjorde dette riktig, bør du se en ny kolonne i brukerens tabell. Du må da oppdatere en gjeldende post, eller sette inn en ny post som setter inn two_factor_permission til ekte (1).

Hvis denne kolonnen er satt til falsk (0), vil brukeren kunne omgå tofaktorautentisering. Dette er ideelt for brukere som ikke trenger samme sikkerhetsnivå som administrator.


Trinn 3: Bruk innstillingsinnstillingen

Vi trenger en måte å omgå sekundær autentisering, samt en måte å sette inn et sekundært autentiseringstrinn til påloggingsprosessen.

Bypassing Sekundær Autentisering

Først må vi ha en måte å omgå sekundær autentisering. Dette betyr at vi må inspisere brukeren i administrasjonskontrollen.

 hvis ($ res! == FALSE) $ _SESSION ['brukernavn'] = $ res-> email_address; hvis ($ res-> two_factor_permission) $ dette -> _ second_auth ($ res-> email_address); komme tilbake;  ellers $ _SESSION ['logged_in'] = TRUE; omdirigere ( 'Velkommen'); 

Dette kontrollerer om brukeren skal logges inn med vårt tofaktorsystem.

Hvis brukeren skal bruke tofaktorautentisering, vil vi at de skal gå til den sekundære autentiseringssiden uten å logge dem inn.

I stedet for å omdirigere brukeren kan vi ringe til _second_auth () funksjonen og la den laste inn siden. "komme tilbake"setning unngår å laste inn påloggingsskjemaet.

Vi har opprettet en ny sesjonsvariabel logget inn som vi skal bruke for å bekrefte at brukeren er logget inn. Dette betyr at vi må gjøre noen endringer i viderekoblingene.

Å fikse omadressene

Det er to omdirigeringer som må endres: den første er i indeksfunksjonen til administrasjonskontrollen.

hvis (isset ($ _ SESSION ['logged_in']) && $ _SESSION ['logged_in'] === TRUE) omdirigere ('velkommen'); 

Den andre er i Velkommen kontrolleren. Vi må sørge for at brukeren ikke er logget inn før omdirigering.

hvis (! isset ($ _ SESSION ['logged_in']) || $ _SESSION ['logged_in']! == TRUE) redirect ('admin'); 

Sette inn sekundær godkjenning

Nå må vi håndtere sekundær autentisering.

I admin / index funksjon, vi kaller _second_auth (), så la oss skrive en grunnleggende funksjon.

 offentlig funksjon _second_auth ($ brukernavn) echo "Velkommen $ brukernavn, du ser på en sekundær autentiseringsside."; 

Trinn 4: Konstruere visningen

Tradisjonelle autentiseringssystemer behandler logoer som en enkelt trinns prosess.

Duo gir oss litt JavaScript og HTML å injisere mellom de to trinnene. Dette betyr at vi må opprette en visning med den nødvendige koden.

La oss lage en ny visning, kalt second_auth.php i visninger mappe. Vi må sette inn iframe og JavaScript levert av Duo for å få det til å fungere.

Du bør opprette en side med den grunnleggende HTML-strukturen. Følgende kan plasseres i kroppen:

  

I et typisk oppsett vil du beholde alt ditt JavaScript i en ressursmappe. Her har vi satt en ressurser mappe i roten til nettstedet vårt, med en 'js'undermappe som inneholder Web SDK JavaScript-filen.

Våre src vil se ut som:

src ="ressurser / js / Duo-web-v1.js"

Vi må også legge til denne andre biten av JavaScript.

Vi genererer disse dataene fra kontrolleren snart.

Sette inn et skjema

Hvis du fulgte den forrige opplæringen, bør du ha konfigurert CodeIgniter for å beskytte mot CSRF.

Fordi JavaScript vil sende data til vår kontroller, vil CodeIgniter lete etter CSRF-token. Hvis vi ikke har denne token, får vi en feil.

JavaScript vi bruker vil sende inn et skjema med id "duo_form"Alt vi trenger å gjøre er å lage det.

ekko form_open ('admin', array ('id' => "duo_form")); ekko form_close ();

Ved å bruke skjema klassen, vil CodeIgniter automatisk injisere token. Når skjemaet blir lagt opp, vil CodeIgniter finne token og la oss fortsette.


Trinn 5: Klargjøre dataene

Tilbake i admin controller, vi trenger å generere noen data i vår _second_auth () funksjon.

Verten er API-nettadressen du ble gitt når du registrerte deg med Duo. Denne nettadressen skal se ut som om api-xxxxxxxx.duosecurity.com (hvor 'xxxxxxxx' er en unik streng knyttet til din Duo-konto).

$ data ['host'] = "api-xxxxxxxx.duosecurity.com";

Husk å erstatte verten med din spesifikke nettadresse. Nettadressen ovenfor vil ikke fungere.

Postvirkningen er nettadressen som vil håndtere svaret når brukeren har forsøkt å godkjenne med Duo.

Vi lager en annen funksjon i administrasjonskontrollen for å håndtere etterpå. For nå nevner vi funksjonen process_second_auth ().

 $ data ['post_action'] = base_URL (). "Admin / process_second_auth";

Laster inn PHP Web SDK

Pass på at du omdøper 'duo_web.php' til 'duo.php' for å unngå CodeIgniter-feil.

Hvis du ikke har lastet ned den nyeste kopien av duo_web.php, kan du hente den fra Duos Web SDK GitHub-side.

Fordi Web SDK kommer som en PHP-klasse, kan vi omdøpe den til "duo.php"og legg den inn i mappen" application / libraries ".

Etter at du har lagt filen inn i biblioteker mappe, vi kan laste den i vår kontroller.

 offentlig funksjon _second_auth ($ brukernavn) $ this-> load-> library ('duo'); $ data ['host'] = "api-xxxxxxxx.duosecurity.com"; $ data ['post_action'] = base_URL (). "Admin / process_second_auth"; ekko "Welcome $ brukernavn, du ser på en sekundær autentiseringsside."; 

Genererer den signerte forespørselen

Å forstå hvordan å generere sig_request, du må forstå hva vi genererer.

De $ akey variabel må være minst 40 tegn lang, ellers vil Duo-biblioteket returnere en feil!

Duo Web SDK lager to signerte tokens, en med den hemmelige nøkkelen de gir deg, en annen med en applikasjonsnøkkel du gjør opp.

sig_request er en kombinasjon av de to tokens.

Ved å lage din egen applikasjonsnøkkel får du et andre lag med sikkerhet. En angriper trenger både den hemmelige nøkkelen fra Duo og din personlige applikasjonsnøkkel for å spoof et token.

Nå genererer vi «sig_request». Duo vil gi deg en integreringstast og hemmelig nøkkel når du lager en integrering.

Pass på at du erstatter nedenstående tekst med integrasjonsnøkkelen og hemmelig nøkkel som er gitt til deg. Du må gjøre opp din egen hemmelige nøkkel. Det må være minst 40 tegn langt, og skal være så tilfeldig som mulig.

offentlig funksjon _second_auth ($ brukernavn) $ this-> load-> library ('duo'); // Duo Integreringsnøkkel $ ikey = "BYGG MED DIN DUO INTEGRASJONSNØKE"; // Duo Secret Key $ skey = "BYGG MED DU DUO SECRET KEY"; // Personal Application Key $ akey = "CREATE A APPLICATION KEY"; $ data ['host'] = "api-xxxxxxxx.duosecurity.com"; $ data ['post_action'] = base_URL (). "Admin / process_second_auth"; $ data ['sig_request'] = $ this-> duo-> signRequest ($ ikey, $ skey, $ akey, $ brukernavn); ekko "Welcome $ brukernavn, du ser på en sekundær autentiseringsside."; 

duoens signRequest () vil generere tokens og returnere dem som en streng for å passere til sig_request.

Nå må vi laste dataene til visningen vi opprettet tidligere.

offentlig funksjon _second_auth ($ brukernavn) $ this-> load-> library ('duo'); // Duo Integreringsnøkkel $ ikey = "BYGG MED DIN DUO INTEGRASJONSNØKE"; // Duo Secret-nøkkel $ skey = "SKIFT MED DIN HJEMMELIG SLEKT"; // Personal Application Key $ akey = "CREATE A APPLICATION KEY"; $ data ['host'] = "api-xxxxxxxx.duosecurity.com"; $ data ['post_action'] = base_URL (). "Admin / process_second_auth"; $ data ['sig_request'] = $ this-> duo-> signRequest ($ ikey, $ skey, $ akey, $ brukernavn); $ this-> load-> view ('second_auth', $ data); 

Hvis du prøver å logge inn nå, bør du se denne siden:

Dette er påmeldingsskjemaet. Du kan registrere din mobiltelefon her, men vi har ikke noe å behandle sekundær autentisering, slik at det ikke logger deg på.

Hvis du ikke ser noe i det hele tatt, kan du se sidekilden for feilmeldinger. Eventuelle feil med dataene vil bli vist i > stikkord.

Hvis det står "Tilgang nektet", må du kontrollere at du har angitt integrasjonen og hemmelig nøkkelen fra Duo Securitys nettsted.


Trinn 6: Behandling av sekundær godkjenning

Vi har satt opp vår posthandling for å være admin / process_second_auth, så vi må lage en process_second_auth () funksjon.

offentlig funksjon process_second_auth () if (isset ($ _ SESSION ['logged_in']) && $ _SESSION ['logged_in'] === TRUE) omdirigere ('velkommen'); 

Siden denne funksjonen vil ha sin egen nettadresse, må vi omdirigere innloggede brukere.

Vi må laste Duo-biblioteket igjen for å validere dataene.

$ Dette-> last> bibliotek ( 'duo'); // Samme nøkler som brukes i _second_auth () $ ikey = "SKIFT MED DIN DUO INTEGRASJONSNØKE"; $ skey = "SKIFT MED DIN HJEMMELIG SLEKT"; $ akey = "SKIFT MED DIN APPLIKASJONSNØKE";

Vi trenger det samme $ ikey, $ skey og $ akey fra _second_auth () funksjon for å validere de oppførte dataene.

JavaScript-innleggene tilbake a sig_response fra Duo-serverne.

$ sig_response = $ this-> input-> post ('sig_response'); $ username = $ this-> duo-> verifyResponse ($ ikey, $ skey, $ akey, $ sig_response);

Når vi har trukket sig_response fra de oppgitte dataene, kjører vi den gjennom verifyResponse () funksjon. Dette returnerer NULL hvis tokens ikke samsvarer, eller et brukernavn hvis de er gyldige.

hvis ($ brukernavn) $ _SESSION ['logged_in'] = TRUE; omdirigere ( 'Velkommen');  ellers omdirigere ('admin'); 

Til slutt vil vi bekrefte at et brukernavn ble returnert, og ferdig med å logge dem inn ved å angi verdien av $ _SESSION [ 'logged_in'] til sant.

Alt sammen bør funksjonen se slik ut:

offentlig funksjon process_second_auth () if (isset ($ _ SESSION ['logged_in']) && $ _SESSION ['logged_in'] === TRUE) omdirigere ('velkommen');  $ this-> load-> library ('duo'); // Samme tastene som brukes i _second_auth () $ ikey = "SKIFT MED DUO'S INTEGRATION KEY"; $ skey = "REPLASJON MED DUO'S SECRET KEY"; $ akey = "SKIFT MED DIN APPLIKASJONSNØKE"; $ sig_response = $ this-> input-> post ('sig_response'); $ username = $ this-> duo-> verifyResponse ($ ikey, $ skey, $ akey, $ sig_response); hvis ($ brukernavn) $ _SESSION ['logged_in'] = TRUE; omdirigere ( 'Velkommen');  ellers omdirigere ('admin'); 

Nå bør du være i stand til å logge inn med tofaktorautentisering, gå videre og prøve den ut!


Konklusjon

Forhåpentligvis har du satt opp ditt eget tofaktors autentiseringssystem for CodeIgniter!

Hva mer kan du gjøre? Det er mye å gjøre når det gjelder sikkerhet, men den største forbedringen vil være sporing av brukerhandlinger.

Et godt sikkerhetssystem er ikke bare sikkert: det vil hjelpe deg med å identifisere hvor et sikkerhetsproblem kom fra. Du bør holde styr på påloggingsforsøk, og andre tiltak for å gjøre identifiserende angripere enklere.

Takk for at du leste! Hvis du har problemer, legg igjen et innlegg i kommentarene.