OpenVPN ile İki Faktörlü Kimlik Doğrulama Nasıl Kurulur

VPN güvenliğini sadece sertifika tabanlı kimlik doğrulamaya bırakmak, özellikle kurumsal ortamlarda ciddi bir risk oluşturuyor. Bir çalışanın dizüstü bilgisayarı çalındığında ya da sertifika dosyası yanlışlıkla paylaşıldığında, tek katmanlı koruma anında çöküyor. İşte tam bu yüzden OpenVPN kurulumlarına ikinci bir doğrulama katmanı eklemek artık bir lüks değil, zorunluluk haline geldi. Bu yazıda Google Authenticator ve TOTP tabanlı iki faktörlü kimlik doğrulamayı OpenVPN ile nasıl entegre edeceğinizi, gerçek dünya senaryolarıyla birlikte adım adım anlatacağım.

Neden İki Faktörlü Kimlik Doğrulama?

Klasik OpenVPN kurulumlarında kimlik doğrulama genellikle şu üç yöntemden biriyle yapılır: sadece sertifika, sertifika artı kullanıcı adı/şifre, ya da her ikisi birden. Bunların hepsi “bir şeye sahip olmak” kategorisinde kalıyor. Oysa gerçek güvenlik, “bir şeye sahip olmak” ile “bir şeyi bilmek” veya “bir şeyi fiziksel olarak tutmak” kombinasyonunu gerektiriyor.

Pratik bir senaryo düşünelim: Şirketinizde 50 uzak çalışan var. Bunlardan birinin VPN sertifikası ve şifresi içeren config dosyası bir phishing saldırısı sonucu ele geçirildi. Eğer sadece sertifika kullanıyorsanız, saldırgan anında ağınıza giriyor. Ama TOTP entegrasyonu varsa, her 30 saniyede değişen 6 haneli kodu da bilmesi gerekiyor. Bu, saldırıyı pratikte imkânsız hale getiriyor.

Ön Gereksinimler ve Ortam Hazırlığı

Bu rehberde Ubuntu 22.04 LTS üzerinde çalışacağız. OpenVPN sunucunuzun zaten kurulu ve çalışır durumda olduğunu varsayıyorum. Eğer sıfırdan kurulum yapacaksanız, önce temel OpenVPN kurulumunu tamamlayın.

Gerekli paketleri kuralım:

apt update && apt upgrade -y
apt install -y openvpn libpam-google-authenticator google-authenticator qrencode

PAM (Pluggable Authentication Modules) burada kilit rol oynuyor. OpenVPN, PAM modülü aracılığıyla Google Authenticator ile konuşacak. libpam-google-authenticator paketi bu köprüyü kuruyor.

Mevcut OpenVPN kurulumunuzu kontrol edelim:

systemctl status openvpn@server
ls -la /etc/openvpn/
cat /etc/openvpn/server.conf | grep -E "auth|tls|cipher"

PAM Yapılandırması

İlk adım, OpenVPN için özel bir PAM konfigürasyonu oluşturmak. Bu dosya, kimlik doğrulama akışını tanımlıyor.

cat > /etc/pam.d/openvpn << 'EOF'
# OpenVPN PAM Konfigürasyonu
auth required pam_google_authenticator.so secret=/etc/openvpn/google-auth/${USER} user=root
auth required pam_unix.so
account required pam_unix.so
EOF

Burada birkaç önemli nokta var. secret parametresi, her kullanıcının TOTP seed dosyasının nerede saklanacağını belirtiyor. user=root satırı, PAM’ın bu dosyaları root olarak okumasını sağlıyor, aksi takdirde izin sorunları yaşarsınız.

Seed dosyaları için dizin oluşturalım:

mkdir -p /etc/openvpn/google-auth
chmod 700 /etc/openvpn/google-auth

OpenVPN Sunucu Konfigürasyonu

Şimdi server.conf dosyasına gerekli direktifleri ekleyelim. Mevcut konfigürasyonunuzu yedeklemeyi unutmayın:

cp /etc/openvpn/server.conf /etc/openvpn/server.conf.backup.$(date +%Y%m%d)

Şimdi server.conf dosyasına şu satırları ekleyin veya güncelleyin:

# /etc/openvpn/server.conf - 2FA ile ilgili direktifler

# Kullanıcı adı/şifre doğrulamasını etkinleştir
plugin /usr/lib/x86_64-linux-gnu/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn

# Sertifikayla birlikte kullanıcı adı/şifre de iste
auth-user-pass-verify /etc/openvpn/auth-script.sh via-env
script-security 3

# Her bağlantıda yeniden doğrulama
reneg-sec 0

# Kullanıcı adını log'a yaz
username-as-common-name

plugin satırı ile PAM entegrasyonunu aktif hale getiriyoruz. Bazı sistemlerde plugin yolu farklı olabilir:

# Plugin dosyasının yerini bulmak için:
find /usr -name "openvpn-plugin-auth-pam.so" 2>/dev/null
find /lib -name "openvpn-plugin-auth-pam.so" 2>/dev/null

Kullanıcı Kaydı ve TOTP Seed Oluşturma

Her kullanıcı için TOTP seed dosyası oluşturmanız gerekiyor. Bu işlemi iki şekilde yapabilirsiniz: kullanıcının kendisi yapabilir ya da sistem yöneticisi merkezi olarak yönetebilir. Kurumsal ortamlarda genellikle merkezi yönetim daha güvenli.

Bir kullanıcı için seed oluşturalım:

# ahmet kullanıcısı için seed oluştur
google-authenticator 
  --time-based 
  --disallow-reuse 
  --force 
  --rate-limit=3 
  --rate-time=30 
  --window-size=3 
  --secret=/etc/openvpn/google-auth/ahmet 
  --label="CompanyVPN:ahmet" 
  --issuer="Company VPN"

Bu komut çalıştığında bir QR kodu ve yedek kodlar üretecek. Kullanıcıya bu QR kodu güvenli bir kanal üzerinden (şifreli e-posta, şifreli mesaj vs.) iletmeniz gerekiyor.

Otomatik kurulum için şu scripti kullanabilirsiniz:

#!/bin/bash
# /usr/local/bin/vpn-user-setup.sh

USERNAME=$1
if [ -z "$USERNAME" ]; then
    echo "Kullanım: $0 <kullanici_adi>"
    exit 1
fi

SECRET_FILE="/etc/openvpn/google-auth/${USERNAME}"

if [ -f "$SECRET_FILE" ]; then
    echo "UYARI: $USERNAME için zaten bir secret dosyası mevcut!"
    read -p "Üzerine yazmak istiyor musunuz? (e/H): " confirm
    [ "$confirm" != "e" ] && exit 0
fi

# Google Authenticator seed oluştur
google-authenticator 
    --time-based 
    --disallow-reuse 
    --force 
    --rate-limit=3 
    --rate-time=30 
    --window-size=3 
    --secret="$SECRET_FILE" 
    --label="CompanyVPN:${USERNAME}" 
    --issuer="Company VPN" 
    --qr-mode=UTF8

# Dosya izinlerini ayarla
chmod 600 "$SECRET_FILE"
chown root:root "$SECRET_FILE"

echo ""
echo "Kullanıcı $USERNAME için VPN 2FA kurulumu tamamlandı."
echo "QR kodu yukarıda görüntülendi, kullanıcıya güvenli şekilde iletin."

Bu scripti çalıştırılabilir yapın:

chmod +x /usr/local/bin/vpn-user-setup.sh
vpn-user-setup.sh ahmet
vpn-user-setup.sh mehmet
vpn-user-setup.sh fatma

İstemci Tarafı Yapılandırması

İstemci konfigürasyonunda da bazı değişiklikler gerekiyor. İstemci .ovpn dosyasına şu direktifi ekleyin:

# client.ovpn - eklenecek direktifler
auth-user-pass
static-challenge "Google Authenticator Kodu:" 1

static-challenge direktifi, istemcinin bağlanırken hem şifre hem de OTP kodu sormasını sağlıyor. Son parametredeki 1, yanıtın gizleneceği (ekranda görünmeyeceği) anlamına geliyor.

OpenVPN GUI istemcileri (Windows, macOS) bu direktifi destekliyor. Linux’ta komut satırından bağlanırken şu formatta giriş yapmanız gerekiyor:

# Bağlantı sırasında sorulacak:
# Enter Auth Username: ahmet
# Enter Auth Password: [kullanici_sifresi]
# Enter Static Challenge 'Google Authenticator Kodu:': [6_haneli_otp]

openvpn --config client.ovpn --auth-user-pass

Gelişmiş Senaryo: LDAP ile Entegrasyon

Büyük kuruluşlarda Active Directory veya LDAP zaten kullanılıyor olabilir. Bu durumda şifreyi LDAP’tan, OTP’yi Google Authenticator’dan almak mantıklı. openvpn-auth-ldap eklentisini PAM ile birlikte kullanabilirsiniz.

apt install -y libpam-ldap

# /etc/pam.d/openvpn dosyasını güncelle
cat > /etc/pam.d/openvpn << 'EOF'
auth required pam_ldap.so
auth required pam_google_authenticator.so secret=/etc/openvpn/google-auth/${USER} user=root nullok
account required pam_ldap.so
EOF

nullok parametresi dikkat çekici: Bu parametre, henüz Google Authenticator kaydı olmayan kullanıcıların giriş yapabilmesini sağlıyor. Geçiş sürecinde kullanışlı ama prodüksiyonda kaldırmanız gerekiyor.

Güvenlik Sertleştirme

2FA’yı eklemek harika bir başlangıç ama tek başına yeterli değil. Birkaç ek güvenlik önlemi:

Brute Force Koruması:

# fail2ban ile OpenVPN brute force koruması
apt install -y fail2ban

cat > /etc/fail2ban/filter.d/openvpn.conf << 'EOF'
[Definition]
failregex = ^ TLS Error: TLS handshake failed$
            ^ <HOST>:d+ TLS Error
            ^ AUTH_FAILED
EOF

cat > /etc/fail2ban/jail.d/openvpn.conf << 'EOF'
[openvpn]
enabled = true
port = 1194
protocol = udp
filter = openvpn
logpath = /var/log/openvpn/openvpn.log
maxretry = 3
bantime = 3600
findtime = 600
EOF

systemctl restart fail2ban
systemctl enable fail2ban

Sertifika ile 2FA Birlikte:

En güçlü konfigürasyon, sertifika artı kullanıcı adı/şifre artı OTP üçlüsünü zorunlu kılmaktır. Server.conf’ta verify-client-cert require direktifinin aktif olduğundan emin olun:

# server.conf - sertifika zorunluluğu
verify-client-cert require
tls-auth /etc/openvpn/ta.key 0
tls-version-min 1.2
cipher AES-256-GCM
auth SHA512

Log Yönetimi ve İzleme

2FA kayıtlarını takip etmek, olası güvenlik ihlallerini erkenden fark etmenizi sağlar.

# OpenVPN loglarını düzenli olarak kontrol etmek için basit bir script
cat > /usr/local/bin/vpn-auth-report.sh << 'EOF'
#!/bin/bash

LOG_FILE="/var/log/openvpn/openvpn.log"
DATE=$(date +%Y-%m-%d)

echo "=== VPN Kimlik Doğrulama Raporu: $DATE ==="
echo ""
echo "Başarılı bağlantılar:"
grep "AUTH_SUCCESS|CONNECTED" "$LOG_FILE" | grep "$DATE" | wc -l

echo ""
echo "Başarısız denemeler:"
grep "AUTH_FAILED|TLS Error" "$LOG_FILE" | grep "$DATE"

echo ""
echo "Şu anda bağlı kullanıcılar:"
cat /etc/openvpn/openvpn-status.log 2>/dev/null | grep "^CLIENT_LIST" | awk -F',' '{print $2, $3}'
EOF

chmod +x /usr/local/bin/vpn-auth-report.sh

# Cron'a ekle - her gün sabah 08:00'de rapor gönder
echo "0 8 * * * root /usr/local/bin/vpn-auth-report.sh | mail -s 'VPN Raporu' [email protected]" >> /etc/cron.d/vpn-report

Yaygın Sorunlar ve Çözümleri

“TOTP kodu hatalı” hatası: Sunucu ve istemci saatlerinin senkronize olmaması en yaygın sebep. NTP ayarlarını kontrol edin:

timedatectl status
timedatectl set-ntp true
chronyc tracking

PAM modülü bulunamıyor hatası: Plugin yolunu doğrulayın ve OpenVPN’i yeniden başlatın:

ls -la /lib/security/pam_google_authenticator.so
systemctl restart openvpn@server
journalctl -u openvpn@server -n 50 --no-pager

“Permission denied” hatası secret dosyasında: Bu genellikle user=root parametresi eksikse veya dosya izinleri yanlışsa olur:

ls -la /etc/openvpn/google-auth/
chmod 600 /etc/openvpn/google-auth/*
chown root:root /etc/openvpn/google-auth/*

Mobil Uygulama Seçenekleri

Kullanıcılarınıza sunabileceğiniz TOTP uygulamaları:

  • Google Authenticator: En yaygın, Android ve iOS, basit arayüz, yedek kod desteği yok dikkatli olun
  • Authy: Çoklu cihaz desteği, bulut yedekleme, kurumsal kullanım için uygun
  • Microsoft Authenticator: Microsoft ekosistemiyle iyi entegre, kurumsal tercih
  • andOTP (Android): Açık kaynak, şifreli yedek alma özelliği var, gizlilik odaklı
  • Bitwarden Authenticator: Şifre yöneticisiyle entegre, tek uygulamada her şey

Kurumsal ortamlarda Authy veya Microsoft Authenticator’ı tercih ediyorum. Çünkü çalışan telefon değiştirdiğinde ya da cihaz kaybolduğunda yeniden kayıt süreci çok daha kolay oluyor.

Kullanıcı Onboarding Süreci

Gerçek dünyada 2FA’nın en zor kısmı teknik kurulum değil, kullanıcı onboarding sürecidir. Şu akışı öneririm:

  • IT departmanı yeni kullanıcı için vpn-user-setup.sh scriptini çalıştırır
  • QR kodu şifreli bir PDF olarak veya güvenli bir self-servis portal üzerinden kullanıcıya iletilir
  • Kullanıcı mobil uygulamasıyla QR kodu tarar
  • Test bağlantısı yapılır, bir IT personeli eşliğinde
  • Yedek kodlar kullanıcıya teslim edilir ve güvenli bir yerde saklaması söylenir
  • Kullanıcı onboarding tamamlanır, eski sertifika tabanlı erişim iptal edilir

Yedek kodları küçümsemeyin. Bir kullanıcı telefonu kaybolduğunda, doğru süreç yoksa gece 02:00’de sizi arar ve “VPN’e giremiyorum, yarın toplantım var” der. Yedek kodlar bu krizi önler.

Üretim Ortamında Dikkat Edilecekler

Canlı sisteme geçmeden önce bir test ortamında her şeyi doğrulayın. Özellikle şu senaryoları test edin:

  • Doğru OTP ile başarılı bağlantı
  • Yanlış OTP ile bağlantı reddi
  • Süresi dolmuş OTP ile bağlantı davranışı
  • Aynı OTP’yi iki kez kullanma girişimi (replay saldırısı simülasyonu)
  • Telefon kaybolduğunda yedek kodlarla erişim

Sunucu yeniden başlatılabilirlik testini de yapın. OpenVPN servisi her boot’ta otomatik başlamalı ve 2FA entegrasyonu sağlam çalışmalı:

systemctl enable openvpn@server
reboot
# Reboot sonrası kontrol:
systemctl status openvpn@server
ls -la /etc/openvpn/google-auth/

Sonuç

OpenVPN’e 2FA eklemek, birkaç saatlik çalışmayla ağ güvenliğinizi dramatik biçimde artırmanın en etkili yollarından biri. PAM ve Google Authenticator kombinasyonu olgun ve güvenilir bir çözüm. Sertifika çalınsa bile, saldırganın her 30 saniyede yenilenen bir kodu bilmesi gerekiyor.

En kritik noktayı tekrar vurgulayayım: Teknik kurulum önemli ama operasyonel süreçler en az onun kadar önemli. Kullanıcı onboarding, cihaz kayıp prosedürü, yedek kod yönetimi ve düzenli güvenlik denetimi olmadan en iyi teknik çözüm bile yetersiz kalır.

Eğer 50’den fazla kullanıcınız varsa, bu süreci bir self-servis portalla otomatize etmeyi düşünün. Küçük ekipler için manuel süreç yönetilebilir ama orta ve büyük ölçekte otomasyon şart. FreeOTP, privacyIDEA veya benzeri araçlar bu işi çok daha ölçeklenebilir hale getiriyor.

Sorularınız veya kendi ortamınızda karşılaştığınız sorunlar için yorum bölümünü kullanın. Özellikle LDAP entegrasyonu ve ileri düzey PAM yapılandırmaları için ayrı bir yazı hazırlayabilirim.

Yorum yapın