Twofactor authentication and strong password
This commit is contained in:
@@ -0,0 +1,741 @@
|
||||
# DBOIS Tweefactorauthenticatie - Beheerdershandleiding
|
||||
|
||||
## Inhoudsopgave
|
||||
|
||||
1. [Introductie](#introductie)
|
||||
2. [Installatie en Configuratie](#installatie-en-configuratie)
|
||||
3. [Gebruikers Helpen met 2FA Setup](#gebruikers-helpen-met-2fa-setup)
|
||||
4. [Veelvoorkomende Problemen Oplossen](#veelvoorkomende-problemen-oplossen)
|
||||
5. [Gebruikers Deblokkeren](#gebruikers-deblokkeren)
|
||||
6. [Best Practices](#best-practices)
|
||||
7. [Veelgestelde Vragen](#veelgestelde-vragen)
|
||||
|
||||
---
|
||||
|
||||
## Introductie
|
||||
|
||||
### Wat is Tweefactorauthenticatie?
|
||||
|
||||
Tweefactorauthenticatie (2FA) is een extra beveiligingslaag die vereist dat gebruikers twee vormen van identificatie opgeven bij het inloggen:
|
||||
1. **Iets dat ze weten**: hun wachtwoord
|
||||
2. **Iets dat ze hebben**: hun telefoon of e-mailaccount
|
||||
|
||||
### Waarom 2FA Gebruiken?
|
||||
|
||||
- **Bescherming tegen gestolen wachtwoorden**: Zelfs als iemands wachtwoord wordt gestolen, kan een aanvaller niet inloggen zonder toegang tot de tweede factor
|
||||
- **Compliance**: Voldoet aan beveiligingsrichtlijnen en compliance-vereisten
|
||||
- **Vertrouwen**: Gebruikers weten dat hun accounts beter beschermd zijn
|
||||
|
||||
### Beschikbare 2FA Methodes
|
||||
|
||||
DBOIS ondersteunt twee 2FA-methodes:
|
||||
|
||||
1. **E-mail OTP (One-Time Password)**
|
||||
- Gebruiker ontvangt een 6-cijferige code per e-mail
|
||||
- Code is 10 minuten geldig
|
||||
- Eenvoudig te gebruiken, geen extra app nodig
|
||||
- Geschikt voor gebruikers die niet technisch onderlegd zijn
|
||||
|
||||
2. **Google Authenticator**
|
||||
- Gebruiker installeert een authenticator app op hun smartphone
|
||||
- App genereert elke 30 seconden een nieuwe 6-cijferige code
|
||||
- Werkt zonder internetverbinding
|
||||
- Veiliger dan e-mail (geen afhankelijkheid van e-mailbeveiliging)
|
||||
- Apps: Google Authenticator, Microsoft Authenticator, Authy, etc.
|
||||
|
||||
---
|
||||
|
||||
## Installatie en Configuratie
|
||||
|
||||
### Stap 1: Database Migratie Uitvoeren
|
||||
|
||||
**BELANGRIJK**: Voer eerst een backup uit van uw database voordat u de migratie uitvoert!
|
||||
|
||||
#### Optie A: Via Command Line
|
||||
|
||||
```bash
|
||||
# Navigeer naar de DBOIS directory
|
||||
cd /pad/naar/dbois
|
||||
|
||||
# Voer de migratie uit
|
||||
mysql -u [gebruikersnaam] -p [database_naam] < application/migrations/001_add_two_factor_authentication.sql
|
||||
```
|
||||
|
||||
Vervang:
|
||||
- `[gebruikersnaam]` met uw MySQL gebruikersnaam
|
||||
- `[database_naam]` met de naam van uw DBOIS database
|
||||
|
||||
#### Optie B: Via phpMyAdmin
|
||||
|
||||
1. Log in op phpMyAdmin
|
||||
2. Selecteer de DBOIS database
|
||||
3. Klik op de "SQL" tab
|
||||
4. Open het bestand `application/migrations/001_add_two_factor_authentication.sql` in een teksteditor
|
||||
5. Kopieer de gehele inhoud
|
||||
6. Plak in het SQL venster van phpMyAdmin
|
||||
7. Klik op "Go" of "Uitvoeren"
|
||||
|
||||
#### Verificatie
|
||||
|
||||
Controleer of de migratie succesvol was:
|
||||
|
||||
```sql
|
||||
-- Controleer nieuwe kolommen in users tabel
|
||||
DESCRIBE users;
|
||||
|
||||
-- U zou deze kolommen moeten zien:
|
||||
-- two_factor_enabled
|
||||
-- two_factor_method
|
||||
-- two_factor_secret
|
||||
|
||||
-- Controleer nieuwe tabel
|
||||
SHOW TABLES LIKE 'user_otp_codes';
|
||||
```
|
||||
|
||||
### Stap 2: E-mail Configuratie Controleren
|
||||
|
||||
Zorg ervoor dat de e-mailconfiguratie correct is ingesteld in `application/config/email.php`:
|
||||
|
||||
```php
|
||||
$config['protocol'] = 'smtp';
|
||||
$config['smtp_host'] = 'mail.uwdomain.nl';
|
||||
$config['smtp_user'] = 'noreply@dbois.nl';
|
||||
$config['smtp_pass'] = 'uw_wachtwoord';
|
||||
$config['smtp_port'] = 587;
|
||||
$config['smtp_crypto'] = 'tls';
|
||||
$config['mailtype'] = 'html';
|
||||
$config['charset'] = 'utf-8';
|
||||
$config['newline'] = "\r\n";
|
||||
```
|
||||
|
||||
**Test de e-mailconfiguratie** door de wachtwoord-vergeten functie te gebruiken.
|
||||
|
||||
### Stap 3: Link naar 2FA Instellingen Toevoegen
|
||||
|
||||
Voeg een link toe in het gebruikersmenu zodat gebruikers hun 2FA kunnen beheren:
|
||||
|
||||
Voorbeeld locatie: In uw hoofdnavigatie of gebruikersprofiel menu:
|
||||
|
||||
```html
|
||||
<li>
|
||||
<a href="/beheer/TwoFactorController">
|
||||
<i class="icon wb-lock"></i>
|
||||
<span>2FA Instellingen</span>
|
||||
</a>
|
||||
</li>
|
||||
```
|
||||
|
||||
Of in een dropdown menu:
|
||||
```html
|
||||
<a class="dropdown-item" href="/beheer/TwoFactorController">
|
||||
<i class="icon wb-lock"></i> Tweefactorauthenticatie
|
||||
</a>
|
||||
```
|
||||
|
||||
### Stap 4: Test de Implementatie
|
||||
|
||||
1. Log in als testgebruiker
|
||||
2. Ga naar `/beheer/TwoFactorController`
|
||||
3. Schakel 2FA in met e-mail methode
|
||||
4. Log uit en log opnieuw in
|
||||
5. Verifieer dat u de OTP code ontvangt en kunt invoeren
|
||||
6. Test ook de Google Authenticator methode
|
||||
|
||||
---
|
||||
|
||||
## Gebruikers Helpen met 2FA Setup
|
||||
|
||||
### E-mail OTP Methode Instellen
|
||||
|
||||
**Stap 1**: Gebruiker gaat naar 2FA Instellingen
|
||||
- URL: `/beheer/TwoFactorController`
|
||||
- Of via menu: Gebruikersprofiel → 2FA Instellingen
|
||||
|
||||
**Stap 2**: E-mail methode selecteren
|
||||
- Klik op het "E-mail" kaartje
|
||||
- Klik op "2FA Inschakelen"
|
||||
|
||||
**Stap 3**: Bevestiging
|
||||
- Gebruiker ziet melding: "Tweefactorauthenticatie ingeschakeld"
|
||||
- Pagina toont huidige status: E-mail methode actief
|
||||
|
||||
**Stap 4**: Testen
|
||||
- Log uit
|
||||
- Log opnieuw in met gebruikersnaam en wachtwoord
|
||||
- Controleer e-mail inbox (en spam folder!)
|
||||
- Voer 6-cijferige code in
|
||||
- Klik "Verifiëren"
|
||||
|
||||
**Tips voor gebruikers**:
|
||||
- Bewaar de DBOIS e-mail adres (noreply@dbois.nl) in contacten om te voorkomen dat mails in spam terechtkomen
|
||||
- Codes zijn 10 minuten geldig
|
||||
- Nieuwe code kan worden aangevraagd met "Code opnieuw verzenden"
|
||||
|
||||
### Google Authenticator Methode Instellen
|
||||
|
||||
**Stap 1**: Authenticator App Installeren
|
||||
- iOS: Download "Google Authenticator" of "Microsoft Authenticator" uit App Store
|
||||
- Android: Download "Google Authenticator" of "Microsoft Authenticator" uit Play Store
|
||||
- Alternatief: Authy (multi-device ondersteuning)
|
||||
|
||||
**Stap 2**: 2FA Instellingen Openen
|
||||
- Ga naar `/beheer/TwoFactorController`
|
||||
|
||||
**Stap 3**: Google Authenticator Selecteren
|
||||
- Klik op het "Google Authenticator" kaartje
|
||||
- Klik op "2FA Inschakelen"
|
||||
|
||||
**Stap 4**: QR Code Scannen
|
||||
- Een QR code verschijnt op het scherm
|
||||
- Open de authenticator app op de telefoon
|
||||
- Klik op "+" of "Account toevoegen"
|
||||
- Selecteer "QR code scannen"
|
||||
- Scan de QR code op het scherm
|
||||
- DBOIS verschijnt nu in de app met een 6-cijferige code
|
||||
|
||||
**Stap 5**: Verificatie
|
||||
- De 6-cijferige code in de app verandert elke 30 seconden
|
||||
- Voer de huidige code in op het verificatiescherm
|
||||
- Klik "Verifiëren"
|
||||
- Bij succes: 2FA is nu actief
|
||||
|
||||
**Stap 6**: Testen
|
||||
- Log uit
|
||||
- Log opnieuw in
|
||||
- Open authenticator app
|
||||
- Voer de 6-cijferige code in (let op: code verandert elke 30 seconden!)
|
||||
- Klik "Verifiëren"
|
||||
|
||||
**Belangrijk voor gebruikers**:
|
||||
- ⚠️ **Bewaar de QR code of secret code veilig** (screenshot maken en veilig opslaan)
|
||||
- Als telefoon verloren gaat, kan de QR code gebruikt worden om opnieuw in te stellen
|
||||
- Codes zijn 30 seconden geldig
|
||||
- Zorg dat de tijd op de telefoon correct is ingesteld (belangrijk voor TOTP!)
|
||||
|
||||
### Methode Wijzigen
|
||||
|
||||
Gebruikers kunnen later van methode wisselen:
|
||||
|
||||
1. Ga naar 2FA Instellingen
|
||||
2. Selecteer een andere methode (E-mail of Google Authenticator)
|
||||
3. Klik "Methode Wijzigen"
|
||||
4. Volg de setup stappen voor de nieuwe methode
|
||||
|
||||
### 2FA Uitschakelen
|
||||
|
||||
Als een gebruiker 2FA wil uitschakelen:
|
||||
|
||||
1. Ga naar 2FA Instellingen
|
||||
2. Scroll naar beneden
|
||||
3. Klik op rode knop "2FA Uitschakelen"
|
||||
4. Bevestig de actie
|
||||
|
||||
**Let op**: Vanuit beveiligingsperspectief raden we aan om 2FA verplicht te stellen voor beheerders en gebruikers met gevoelige toegang.
|
||||
|
||||
---
|
||||
|
||||
## Veelvoorkomende Problemen Oplossen
|
||||
|
||||
### Probleem 1: E-mail OTP Niet Ontvangen
|
||||
|
||||
**Diagnose checklist**:
|
||||
- [ ] Is de e-mail configuratie correct? (test met wachtwoord-vergeten functie)
|
||||
- [ ] Controleer spam/junk folder
|
||||
- [ ] Is het e-mailadres van de gebruiker correct in de database?
|
||||
- [ ] Controleer applicatie logs voor e-mail fouten
|
||||
|
||||
**Oplossing A: E-mail Configuratie Controleren**
|
||||
|
||||
1. Test de e-mail functionaliteit:
|
||||
```php
|
||||
// In een test controller
|
||||
$this->load->library('email');
|
||||
$this->email->from('noreply@dbois.nl', 'DBOIS');
|
||||
$this->email->to('uw@email.nl');
|
||||
$this->email->subject('Test');
|
||||
$this->email->message('Test bericht');
|
||||
if (!$this->email->send()) {
|
||||
echo $this->email->print_debugger();
|
||||
}
|
||||
```
|
||||
|
||||
2. Controleer SMTP instellingen in `application/config/email.php`
|
||||
3. Controleer firewall/server configuratie voor uitgaande SMTP
|
||||
|
||||
**Oplossing B: Code Opnieuw Verzenden**
|
||||
|
||||
1. Gebruiker klikt op "Code opnieuw verzenden" op de verificatiepagina
|
||||
2. Check of nieuwe code wordt verzonden
|
||||
3. Controleer spam folder
|
||||
|
||||
**Oplossing C: Tijdelijk Uitschakelen**
|
||||
|
||||
Als beheerder kunt u 2FA tijdelijk uitschakelen (zie [Gebruikers Deblokkeren](#gebruikers-deblokkeren))
|
||||
|
||||
### Probleem 2: Authenticator Code Werkt Niet
|
||||
|
||||
**Meest voorkomende oorzaken**:
|
||||
|
||||
**A. Tijd Niet Gesynchroniseerd**
|
||||
- Authenticator codes zijn tijd-gebaseerd
|
||||
- Als de klok van de telefoon niet correct is, werken codes niet
|
||||
|
||||
**Oplossing**:
|
||||
1. Ga naar telefooninstellingen
|
||||
2. Schakel "Automatische datum en tijd" in
|
||||
3. Of handmatig de juiste tijd instellen
|
||||
4. **Voor Android**: In Google Authenticator app → Menu → Instellingen → Tijd correctie voor codes → Synchroniseer nu
|
||||
5. Probeer opnieuw in te loggen
|
||||
|
||||
**B. Verkeerde QR Code Gescand**
|
||||
- Mogelijk oude QR code gebruikt
|
||||
- QR code van andere account gescand
|
||||
|
||||
**Oplossing**:
|
||||
1. Verwijder het DBOIS account uit de authenticator app
|
||||
2. Log in op DBOIS (beheerder schakelt 2FA tijdelijk uit)
|
||||
3. Ga naar 2FA instellingen
|
||||
4. Schakel 2FA opnieuw in
|
||||
5. Scan de nieuwe QR code
|
||||
|
||||
**C. Te Lang Gewacht met Code Invoeren**
|
||||
- Codes zijn 30 seconden geldig
|
||||
- Als code bijna verlopen is bij invoeren, kan validatie falen
|
||||
|
||||
**Oplossing**:
|
||||
- Wacht op nieuwe code (elke 30 seconden)
|
||||
- Voer code direct in zodra deze verschijnt
|
||||
|
||||
### Probleem 3: Gebruiker Zit Vast op Verificatiepagina
|
||||
|
||||
**Symptoom**: Gebruiker blijft hangen op `/login/showVerify2fa`
|
||||
|
||||
**Diagnose**:
|
||||
- Session data mogelijk corrupt
|
||||
- Browser cookies geblokkeerd
|
||||
|
||||
**Oplossing A: Via Browser**
|
||||
- Klik op "Annuleren" link onderaan de verificatiepagina
|
||||
- Dit redirect terug naar login pagina
|
||||
|
||||
**Oplossing B: Via Database** (als beheerder)
|
||||
```sql
|
||||
-- Verwijder actieve sessies voor deze gebruiker
|
||||
DELETE FROM ci_sessions
|
||||
WHERE data LIKE '%pending_2fa_user_id%';
|
||||
```
|
||||
|
||||
**Oplossing C: Browser Cache Wissen**
|
||||
1. Wis browser cookies en cache
|
||||
2. Sluit browser volledig
|
||||
3. Open opnieuw en probeer in te loggen
|
||||
|
||||
### Probleem 4: QR Code Wordt Niet Weergegeven
|
||||
|
||||
**Oorzaken**:
|
||||
- JavaScript errors
|
||||
- Browser compatibiliteit
|
||||
- Netwerk problemen
|
||||
|
||||
**Oplossing**:
|
||||
1. Check browser console voor errors (F12 → Console tab)
|
||||
2. Probeer andere browser (Chrome, Firefox, Safari)
|
||||
3. Controleer dat JavaScript enabled is
|
||||
4. Refresh de pagina (Ctrl+F5 of Cmd+Shift+R)
|
||||
|
||||
**Alternatief: Handmatige Code Invoer**
|
||||
- Onder de QR code staat een tekstuele secret code
|
||||
- Deze kan handmatig worden ingevoerd in de authenticator app:
|
||||
1. Open authenticator app
|
||||
2. Klik "+" → "Enter a setup key"
|
||||
3. Voer account naam in: DBOIS
|
||||
4. Voer de secret code in
|
||||
5. Selecteer "Time based"
|
||||
6. Opslaan
|
||||
|
||||
### Probleem 5: "Ongeldige Verificatiecode" Foutmelding
|
||||
|
||||
**Mogelijke oorzaken en oplossingen**:
|
||||
|
||||
**A. Code Verlopen**
|
||||
- E-mail codes: 10 minuten geldig
|
||||
- Authenticator codes: 30 seconden geldig
|
||||
|
||||
**Oplossing**: Gebruik een nieuwe/actuele code
|
||||
|
||||
**B. Typfout**
|
||||
- Code incorrect overgetypt
|
||||
- Letters gebruikt in plaats van cijfers (O vs 0)
|
||||
|
||||
**Oplossing**: Zorgvuldig code opnieuw invoeren, gebruik copy-paste voor e-mail codes
|
||||
|
||||
**C. Meerdere Pogingen**
|
||||
- Code al gebruikt
|
||||
- Multiple browser tabs/windows
|
||||
|
||||
**Oplossing**:
|
||||
- Voor e-mail: vraag nieuwe code aan
|
||||
- Voor authenticator: wacht op nieuwe code
|
||||
|
||||
**D. Database Problemen**
|
||||
- OTP record niet gevonden
|
||||
- Session data verloren
|
||||
|
||||
**Oplossing**: Beheerder reset 2FA (zie volgende sectie)
|
||||
|
||||
---
|
||||
|
||||
## Gebruikers Deblokkeren
|
||||
|
||||
### Scenario 1: Gebruiker Heeft Toegang Tot Telefoon/E-mail Verloren
|
||||
|
||||
**Situatie**: Gebruiker kan niet inloggen omdat:
|
||||
- Telefoon verloren/gestolen/kapot
|
||||
- Geen toegang tot e-mail
|
||||
- Authenticator app verwijderd
|
||||
|
||||
**Oplossing: 2FA Handmatig Uitschakelen**
|
||||
|
||||
#### Methode A: Via Database (Meest Direct)
|
||||
|
||||
1. Log in op MySQL/phpMyAdmin
|
||||
2. Voer deze query uit:
|
||||
|
||||
```sql
|
||||
-- Zoek de gebruiker
|
||||
SELECT id, username, email, two_factor_enabled, two_factor_method
|
||||
FROM users
|
||||
WHERE username = 'gebruikersnaam';
|
||||
|
||||
-- Schakel 2FA uit voor deze gebruiker
|
||||
UPDATE users
|
||||
SET
|
||||
two_factor_enabled = 'F',
|
||||
two_factor_method = NULL,
|
||||
two_factor_secret = NULL
|
||||
WHERE id = [user_id];
|
||||
|
||||
-- Verwijder eventuele OTP codes
|
||||
DELETE FROM user_otp_codes WHERE user_id = [user_id];
|
||||
```
|
||||
|
||||
3. Gebruiker kan nu inloggen met alleen wachtwoord
|
||||
4. Adviseer gebruiker om 2FA opnieuw in te stellen
|
||||
|
||||
#### Methode B: Via PHP Script
|
||||
|
||||
Maak een tijdelijk PHP bestand `disable_2fa.php` in de root:
|
||||
|
||||
```php
|
||||
<?php
|
||||
// BELANGRIJK: Verwijder dit bestand na gebruik!
|
||||
// Alleen voor noodgevallen
|
||||
|
||||
require_once 'system/core/CodeIgniter.php';
|
||||
|
||||
$username = 'gebruikersnaam'; // Wijzig dit
|
||||
|
||||
$CI =& get_instance();
|
||||
$CI->load->database();
|
||||
$CI->load->model('beheer/User_model');
|
||||
|
||||
// Haal gebruiker op
|
||||
$user = $CI->User_model->getUserByUsername($username);
|
||||
|
||||
if (!$user) {
|
||||
echo "Gebruiker niet gevonden";
|
||||
exit;
|
||||
}
|
||||
|
||||
// Update database
|
||||
$data = [
|
||||
'two_factor_enabled' => 'F',
|
||||
'two_factor_method' => NULL,
|
||||
'two_factor_secret' => NULL
|
||||
];
|
||||
|
||||
$CI->User_model->update_record($user->id, $data);
|
||||
|
||||
echo "2FA uitgeschakeld voor gebruiker: " . $username;
|
||||
echo "\n<br>Gebruiker kan nu inloggen met alleen wachtwoord";
|
||||
echo "\n<br><strong>VERWIJDER DIT BESTAND!</strong>";
|
||||
?>
|
||||
```
|
||||
|
||||
Gebruik:
|
||||
1. Upload `disable_2fa.php` naar DBOIS root directory
|
||||
2. Ga naar `https://uwdomain.nl/dbois/disable_2fa.php`
|
||||
3. **BELANGRIJK: Verwijder het bestand direct na gebruik!**
|
||||
|
||||
### Scenario 2: Massa-Reset (Meerdere Gebruikers)
|
||||
|
||||
**Situatie**: Na een incident moeten meerdere gebruikers gereset worden.
|
||||
|
||||
**Oplossing: Bulk Database Update**
|
||||
|
||||
```sql
|
||||
-- Schakel 2FA uit voor alle gebruikers
|
||||
UPDATE users
|
||||
SET
|
||||
two_factor_enabled = 'F',
|
||||
two_factor_method = NULL,
|
||||
two_factor_secret = NULL;
|
||||
|
||||
-- Verwijder alle OTP codes
|
||||
TRUNCATE TABLE user_otp_codes;
|
||||
```
|
||||
|
||||
**Let op**: Alleen in noodgevallen gebruiken! Vraag gebruikers daarna 2FA opnieuw in te stellen.
|
||||
|
||||
### Scenario 3: Gebruiker Kan Geen Nieuwe Codes Ontvangen
|
||||
|
||||
**E-mail Methode**: Oude codes nog steeds verzonden, nieuwe codes komen niet aan
|
||||
|
||||
**Diagnose**:
|
||||
```sql
|
||||
-- Controleer actieve OTP codes voor gebruiker
|
||||
SELECT * FROM user_otp_codes
|
||||
WHERE user_id = [user_id]
|
||||
AND used = 'F'
|
||||
AND expires_at > NOW()
|
||||
ORDER BY created_at DESC;
|
||||
```
|
||||
|
||||
**Oplossing: OTP Codes Wissen**
|
||||
|
||||
```sql
|
||||
-- Verwijder alle OTP codes voor deze gebruiker
|
||||
DELETE FROM user_otp_codes WHERE user_id = [user_id];
|
||||
```
|
||||
|
||||
Nu kan gebruiker nieuwe code aanvragen.
|
||||
|
||||
### Best Practices voor Deblokkering
|
||||
|
||||
1. **Identificatie Verifiëren**: Zorg dat u de identiteit van de gebruiker verifieert voordat u 2FA uitschakelt
|
||||
- Telefonisch contact met bekend nummer
|
||||
- In persoon verificatie
|
||||
- Via manager/supervisor
|
||||
|
||||
2. **Documenteer de Actie**: Houd bij wanneer en waarom 2FA werd uitgeschakeld
|
||||
```
|
||||
[Datum] - 2FA uitgeschakeld voor [gebruiker] - Reden: [telefoon verloren]
|
||||
```
|
||||
|
||||
3. **Tijdelijke Uitschakeling**: Geef gebruiker beperkte tijd om 2FA opnieuw in te stellen
|
||||
- Mail de gebruiker met instructies
|
||||
- Stel deadline (bijv. 24 uur)
|
||||
|
||||
4. **Wachtwoord Reset Overwegen**: Als veiligheidsrisico groot is, forceer ook wachtwoord wijziging
|
||||
```sql
|
||||
-- Dit forceert wachtwoord reset bij volgende login (indien geïmplementeerd)
|
||||
UPDATE users SET password_reset_required = 'T' WHERE id = [user_id];
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Voor Beheerders
|
||||
|
||||
#### 1. Verplicht 2FA voor Gevoelige Accounts
|
||||
|
||||
Overweeg 2FA verplicht te stellen voor:
|
||||
- Alle beheerders
|
||||
- Gebruikers met financiële toegang
|
||||
- Gebruikers met toegang tot persoonlijke data
|
||||
|
||||
Implementatie:
|
||||
```php
|
||||
// In MY_Controller of inlog verificatie
|
||||
if ($user->role <= 2 && $user->two_factor_enabled !== 'T') {
|
||||
// Redirect naar 2FA setup met melding
|
||||
redirect('/beheer/TwoFactorController?required=true');
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. Regelmatig OTP Codes Opschonen
|
||||
|
||||
Voeg een cron job of scheduled task toe:
|
||||
|
||||
```bash
|
||||
# Dagelijks om 03:00
|
||||
0 3 * * * curl -s https://uwdomain.nl/dbois/maintenance/cleanup2fa
|
||||
```
|
||||
|
||||
PHP endpoint (`maintenance/cleanup2fa`):
|
||||
```php
|
||||
public function cleanup2fa() {
|
||||
$this->load->model('beheer/UserOtp_model');
|
||||
$deleted = $this->UserOtp_model->cleanupExpiredOTPs();
|
||||
log_message('info', "2FA Cleanup: {$deleted} expired OTP codes deleted");
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. Monitor 2FA Adoptie
|
||||
|
||||
Track hoeveel gebruikers 2FA hebben ingeschakeld:
|
||||
|
||||
```sql
|
||||
-- 2FA statistieken
|
||||
SELECT
|
||||
COUNT(*) as total_users,
|
||||
SUM(CASE WHEN two_factor_enabled = 'T' THEN 1 ELSE 0 END) as users_with_2fa,
|
||||
SUM(CASE WHEN two_factor_method = 'email' THEN 1 ELSE 0 END) as email_method,
|
||||
SUM(CASE WHEN two_factor_method = 'authenticator' THEN 1 ELSE 0 END) as authenticator_method,
|
||||
ROUND(SUM(CASE WHEN two_factor_enabled = 'T' THEN 1 ELSE 0 END) / COUNT(*) * 100, 2) as adoption_percentage
|
||||
FROM users
|
||||
WHERE archive = 'F';
|
||||
```
|
||||
|
||||
#### 4. Backup Strategie
|
||||
|
||||
Voor Google Authenticator gebruikers:
|
||||
- Adviseer gebruikers om QR code screenshot veilig op te slaan
|
||||
- Of secret code op veilige plek te bewaren
|
||||
- Overweeg gebruik van Authy (cloud backup functionaliteit)
|
||||
|
||||
#### 5. Communicatie
|
||||
|
||||
**Bij Uitrol**:
|
||||
- Stuur e-mail aankondiging 1 week van tevoren
|
||||
- Organiseer training sessies of demo's
|
||||
- Maak instructie video's beschikbaar
|
||||
- Bied helpdesk ondersteuning
|
||||
|
||||
**Ongoing**:
|
||||
- Voeg 2FA info toe aan onboarding proces
|
||||
- Herinner gebruikers zonder 2FA periodiek
|
||||
- Share security awareness tips
|
||||
|
||||
### Voor Eindgebruikers
|
||||
|
||||
#### Do's
|
||||
✅ Schakel 2FA in voor extra beveiliging
|
||||
✅ Gebruik Google Authenticator voor maximale veiligheid
|
||||
✅ Bewaar QR code of secret code veilig
|
||||
✅ Test 2FA setup direct na instellen
|
||||
✅ Update telefoonnummer en e-mail adres in profiel
|
||||
✅ Gebruik een app met backup (zoals Authy)
|
||||
|
||||
#### Don'ts
|
||||
❌ Deel nooit uw 2FA codes
|
||||
❌ Screenshot QR codes niet in onbeveiligde cloud
|
||||
❌ Gebruik geen publieke computers voor 2FA setup
|
||||
❌ Negeer niet 2FA waarschuwingen
|
||||
❌ Gebruik niet hetzelfde apparaat voor wachtwoord manager én 2FA (voor maximale veiligheid)
|
||||
|
||||
---
|
||||
|
||||
## Veelgestelde Vragen
|
||||
|
||||
### Algemeen
|
||||
|
||||
**Q: Is 2FA verplicht?**
|
||||
A: Dit hangt af van uw organisatie beleid. Standaard is 2FA optioneel, maar beheerders kunnen het verplicht stellen voor specifieke rollen.
|
||||
|
||||
**Q: Welke methode is veiliger?**
|
||||
A: Google Authenticator is veiliger omdat het niet afhankelijk is van e-mailbeveiliging en werkt zonder internetverbinding. E-mail OTP is echter gemakkelijker voor minder technische gebruikers.
|
||||
|
||||
**Q: Hoelang duren codes?**
|
||||
A: E-mail codes zijn 10 minuten geldig. Authenticator codes zijn 30 seconden geldig maar kunnen worden ingevoerd binnen een window van ±30 seconden (voor clock drift).
|
||||
|
||||
**Q: Wat als ik een nieuwe telefoon krijg?**
|
||||
A: Voor authenticator methode: gebruik de opgeslagen QR code of secret code om op nieuwe telefoon in te stellen. Of: schakel 2FA uit, log in, schakel opnieuw in met nieuwe QR code.
|
||||
|
||||
**Q: Kan ik 2FA overslaan op vertrouwde apparaten?**
|
||||
A: Deze functionaliteit is momenteel niet beschikbaar maar staat op de roadmap voor toekomstige updates.
|
||||
|
||||
### Technisch
|
||||
|
||||
**Q: Wordt mijn secret code versleuteld opgeslagen?**
|
||||
A: De TOTP secret wordt opgeslagen in de database. Voor productie omgevingen wordt aanbevolen database encryptie te implementeren.
|
||||
|
||||
**Q: Wat gebeurt er met actieve sessies als ik 2FA inschakel?**
|
||||
A: Bestaande sessies blijven actief. 2FA wordt alleen gevraagd bij nieuwe logins.
|
||||
|
||||
**Q: Kan ik zien wie 2FA heeft ingeschakeld?**
|
||||
A: Ja, beheerders kunnen dit bekijken via database query:
|
||||
```sql
|
||||
SELECT username, email, two_factor_enabled, two_factor_method
|
||||
FROM users
|
||||
WHERE archive = 'F'
|
||||
ORDER BY two_factor_enabled DESC;
|
||||
```
|
||||
|
||||
**Q: Hoeveel mislukte 2FA pogingen zijn toegestaan?**
|
||||
A: Er is momenteel geen ingebouwde rate limiting. Dit kan worden toegevoegd voor extra beveiliging.
|
||||
|
||||
### Problemen
|
||||
|
||||
**Q: Ik zie "Session expired" na 2FA verificatie**
|
||||
A: Dit kan gebeuren als de database session te snel vervalt. Check de `ci_sessions` tabel en verhoog eventueel de session timeout in config.
|
||||
|
||||
**Q: E-mails komen aan in spam**
|
||||
A: Vraag gebruikers om noreply@dbois.nl toe te voegen aan hun contacten en as "not spam" te markeren. Controleer ook SPF/DKIM records van uw domein.
|
||||
|
||||
**Q: Gebruiker ziet witte pagina na QR scan**
|
||||
A: Check voor JavaScript errors in browser console. Mogelijk browser compatibiliteit issue - probeer andere browser.
|
||||
|
||||
---
|
||||
|
||||
## Ondersteuning en Contact
|
||||
|
||||
### Bij Problemen
|
||||
|
||||
1. **Check eerst deze handleiding** voor standaard oplossingen
|
||||
2. **Controleer logs**:
|
||||
- Application logs: `application/logs/`
|
||||
- Server logs: afhankelijk van uw server setup
|
||||
3. **Test in andere browser** om browser-specifieke issues uit te sluiten
|
||||
4. **Database backup**: Maak altijd eerst een backup voordat u database wijzigingen doorvoert
|
||||
|
||||
### Escalatie
|
||||
|
||||
Als probleem niet opgelost kan worden:
|
||||
- Contact development team
|
||||
- Verstrek: gebruikersnaam, error messages, browser/device info, screenshots
|
||||
|
||||
### Documentatie Updates
|
||||
|
||||
Deze handleiding wordt bijgewerkt bij nieuwe features of veelvoorkomende issues. Check regelmatig voor updates.
|
||||
|
||||
---
|
||||
|
||||
## Appendix: Database Schema
|
||||
|
||||
### users tabel (relevante kolommen)
|
||||
|
||||
```sql
|
||||
`two_factor_enabled` VARCHAR(1) NOT NULL DEFAULT 'F'
|
||||
-- 'T' = enabled, 'F' = disabled
|
||||
|
||||
`two_factor_method` VARCHAR(20) NULL DEFAULT NULL
|
||||
-- 'email' of 'authenticator'
|
||||
|
||||
`two_factor_secret` VARCHAR(255) NULL DEFAULT NULL
|
||||
-- TOTP secret voor Google Authenticator (Base32 encoded)
|
||||
```
|
||||
|
||||
### user_otp_codes tabel
|
||||
|
||||
```sql
|
||||
CREATE TABLE `user_otp_codes` (
|
||||
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`user_id` INT(11) UNSIGNED NOT NULL,
|
||||
`otp_code` VARCHAR(6) NOT NULL,
|
||||
`expires_at` TIMESTAMP NOT NULL,
|
||||
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`used` VARCHAR(1) NOT NULL DEFAULT 'F',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_user_id` (`user_id`),
|
||||
KEY `idx_expires_at` (`expires_at`),
|
||||
CONSTRAINT `fk_otp_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Laatst bijgewerkt**: 2025-10-17
|
||||
**Versie**: 1.0
|
||||
**Geschreven voor**: DBOIS Beheerders
|
||||
Reference in New Issue
Block a user