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.
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.
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:
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');
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å).
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.
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
Etter å ha fullført Easy Authentication med CodeIgniter opplæringen, bør du ha et grunnleggende påloggingssystem på plass.
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:
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:
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.
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å!
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.
Vi trenger en måte å omgå sekundær autentisering, samt en måte å sette inn et sekundært autentiseringstrinn til påloggingsprosessen.
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.
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');
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.";
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 =" echo base_url(); ?>ressurser / js / Duo-web-v1.js"
Vi må også legge til denne andre biten av JavaScript.
Vi genererer disse dataene fra kontrolleren snart.
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.
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";
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.";
Å 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.
er en kombinasjon av de to tokens.sig_request
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 >