abonneren

Tweestapsverificatie voor eigen sites instellen

Tweestapsverificatie voor eigen site
Maak je voor je website geen gebruik van een bestaand cms zoals WordPress? Ook dan kun je vaak het inloggedeelte voorzien van tweestapsverificatie. Zo’n handmatige implementatie lijkt lastig, maar er zijn genoeg tools die je het werk grotendeels uit handen nemen.

Een kant-en-klaar cms zoals WordPress of Joomla! is weliswaar snel en makkelijk op te zetten maar voor sommige websites te zwaar of te beperkt. Wie flexibel wil zijn maakt zijn website zelf, geholpen door een programmeertaal zoals php. Heb je wat ervaring met php, databases en het gebruik van sessies binnen php, dan is een inlogsysteem een relatief eenvoudig klusje. Maar hoe voeg je hier tweestapsverificatie aan toe? In deze workshop helpen we je op weg.

Lees ook: Tweestapsverificatie Wordpress instellen

Het maken van een uitgebreide website kost veel tijd. Wie wat gestructureerd en snel wil werken kan kiezen voor een framework. Bekende voorbeelden zijn Laravel, Phalcon en CodeIgniter. Zo’n framework bevat heel veel kant-en-klare componenten waarmee je volgens een vast ontwerppatroon je website kunt inrichten. Het leren werken met een framework kost wel wat tijd en het is handig als je eerst php onder de knie hebt. Wil je tweestapsverificatie aan een website toevoegen die je met zo’n framework hebt gemaakt, dan kun je het beste op zoek naar een goede tutorial daarover voor dat bewuste framework.

Opties

Wil je tweestapsverificatie aan je zelfgemaakte website toevoegen dan hoef je het wiel niet opnieuw uit te vinden. Er zijn gelukkig handige hulpmiddelen beschikbaar. Naast uitgebreidere bibliotheken met volledig uitgewerkte voorbeelden kun je er ook voor kiezen om bibliotheken te gebruiken die één taak in het proces voor je uitvoeren. Voor het maken van een unieke sleutel heb je in Linux niet eens een bibliotheek nodig: je kunt gewoon karakters lezen van /dev/urandom, een speciaal device.

Die karakterreeks kun je daarna met een bibliotheek omzetten naar Base32, de codering die onder andere Google Authenticator verwacht. Die waarde kun je als tekst aan de bezoeker presenteren, al kun je er ook een qr-code van maken (zie verderop). Verder zijn er bibliotheken die de toegangscode op de server voor je kunnen genereren volgens het totp-protocol, zodat je de toegangscode die de gebruiker invoert kunt verifiëren.

Maken van qr-codes

Het maken van een qr-code is gemakkelijk. Er bestaan diverse qr-code generatoren voor JavaScript en jQuery die volledig zelfstandig werken, zonder aparte dienst. Je kunt er natuurlijk ook voor kiezen om wel zo’n dienst gebruiken. Een van de bekendste is het onderdeel Infographics van de Google Charts API. Gebruik

https://chart.googleapis.com/chart?

als root-URL. Voeg daar parameters aan toe die je scheidt met een &. Begin met

cht=qr

om aan te geven dat je een qr-code wil genereren. Geef ook minimaal de gewenste afmetingen op, bijvoorbeeld

chs=200x200

voor een afbeelding van 200x200 pixels. We voegen ook

chld=M|0

toe voor een wat grotere foutcorrectie, voor gegevens die niet goed worden gescand, en een minimale witruimte rondom de qr-code. Met

chl=<data>

definieer je de gegevens die je wil overbrengen, waarbij je op de plek van data de gegevens zet met tekencodering utf-8 en url-encoded. Dit laatste betekent dat speciale tekens zoals spaties en schuine streepjes vooraf moeten worden omgezet. Bij tweestapsverificatie moet je voor de data een speciaal formaat aanhouden met daarin een label en secret in de vorm

otpauth://totp/<label>?secret=<sleutel>

Zet op de plek van label een herkenbare naam zet en in sleutel de sleutel zelf (in Base32 codering).

Kant-en-klare bibliotheek

Met een kant-en-klare bibliotheek voor php kun je relatief eenvoudig tweestapsverificatie aan je website toevoegen. Bijvoorbeeld met de bibliotheek van de Nederlander Rob Janssen. De inlogfunctionaliteit moet je weliswaar zelf maken, maar samen met de voorbeeldcode zal de integratie van tweestapsverificatie niet lastig meer zijn. Als je een pakketbeheerder gebruikt - zoals het in de php-gemeenschap populaire Composer - is de installatie eenvoudig. Ga op je webserver naar de www-root waarin de bestanden voor je website staan. Geef de opdracht

composer require robthree/twofactorauth

om de bibliotheek te installeren. Composer zet ze in de map vendor. Blader naar de map vendor/robthree/twofactorauth/demo. Hierin vind je het bestand demo.php dat je in je browser kunt openen. Hiermee zie je in een notendop hoe dit werkt. Zorg dat de rechten goed staan en dat je server php ondersteunt. Op de genoemde GitHub-pagina vind je uitgebreide uitleg. Als voorziening voor het maken van een qr-code vertrouwt de bibliotheek ook op de Google Charts API maar je kunt ook uit een paar alternatieven kiezen.

Tweestapsverificatie voor eigen site

De sleutel bij tweestapsverificatie is een willekeurige reeks getallen, omgezet naar Base32-codering. Het blijkt voor een computer nog niet zo eenvoudig om een echt willekeurige reeks te produceren, terwijl dit zeker voor cryptografie en in mindere mate voor tweestapsverificatie wel belangrijk is.

Vooral php 7 brengt op dit punt verbetering met nieuwe functies onder de noemer csprng: Cryptographically Secure Pseudo-Random Number Generator. Die functies benut bovengenoemde bibliotheek voor php alleen als je php 7 gebruikt, anders valt hij terug op een minder nauwkeurige generator voor willekeurige getallen.

Tijdsynchronisatie

Omdat het totp-protocol zo sterk leunt op de exacte tijd, is het belangrijk dat de tijd en tijdzone op je server correct zijn ingesteld. Het is gebruikelijk om de tijd te synchroniseren met een ntp-server. Ubuntu maakt sinds 16.04 gebruik van timesyncd en timedatectl. Geholpen door een pool van ntp-servers zorgt timesyncd er met periodieke controles voor dat de tijd correct blijft. De status van die service kun je met

systemctl status systemd-timesyncd

controleren. Gezien de aanwezigheid van deze service is het niet nodig (en ook niet verstandig) andere tijdsynchronisatietools te installeren zoals ntp en ntpdate. Om de huidige status van de tijd en de configuratie van bijvoorbeeld de tijdzone te controleren kun je de opdracht

timedatectl status

geven. Achter NTP synchronized kun je zien of de tijd wordt gesynchroniseerd. Als dit niet het geval is kun je dit aanzetten met

sudo timedatectl set-ntp on
Tweestapsverificatie voor eigen site

Geschreven door: Gertjan Groen op

Category: Workshop, Security

Tags: Security, Wachtwoord, 2fa

Laatste Vacatures