OpenVPN ile RADIUS Sunucu Entegrasyonu ve Merkezi Kimlik Doğrulama Yapılandırması

Kurumsal ağlarda VPN kullanıcı yönetimi, özellikle onlarca ya da yüzlerce kullanıcıya ulaştığında gerçek bir baş ağrısına dönüşebilir. Her kullanıcı için ayrı sertifika üretmek, iptal etmek, takip etmek… Bunları manuel yapmaya çalışmak hem zaman kaybı hem de ciddi güvenlik riski demek. İşte tam bu noktada OpenVPN ile RADIUS entegrasyonu devreye giriyor. Merkezi kimlik doğrulama sayesinde kullanıcıları tek bir noktadan yönetebilir, Active Directory veya LDAP ile senkronize edebilir, hatta çok faktörlü doğrulama ekleyebilirsiniz. Bu yazıda sıfırdan başlayarak production ortamında kullanılabilir bir yapı kuracağız.

Mimari Genel Bakış

Kurulumu anlamadan önce bileşenlerin nasıl konuştuğunu bilmek gerekiyor. Kullanıcı OpenVPN istemcisinden bağlandığında, OpenVPN sunucusu kullanıcı adı ve parolayı doğrudan kendi veritabanında aramak yerine RADIUS sunucusuna iletir. RADIUS sunucusu da bu isteği kendi backend’ine (FreeRADIUS durumunda bu LDAP, Active Directory, MySQL veya düz dosya olabilir) göndererek doğrulama yapar ve sonucu OpenVPN’e bildirir.

Bu yapının temel avantajları şunlardır:

  • Merkezi kullanıcı yönetimi: Birini işten çıkardığınızda AD’dan hesabı devre dışı bırakmanız yeterli, VPN erişimi anında kesilir
  • Denetim logu: Tüm kimlik doğrulama denemeleri RADIUS üzerinde loglanır
  • Şifre politikaları: Kurumsal parola kuralları otomatik devreye girer
  • MFA desteği: Google Authenticator veya benzeri OTP çözümleri kolayca entegre edilebilir

Senaryo olarak şunu kullanacağız: Ubuntu 22.04 üzerinde OpenVPN sunucusu, yine Ubuntu 22.04 üzerinde FreeRADIUS, backend olarak da OpenLDAP. Gerçek dünyada LDAP yerine Active Directory de kullanabilirsiniz, konfigürasyon farkları minimum düzeydedir.

FreeRADIUS Kurulumu

Önce RADIUS sunucusunu kurup ayağa kaldıralım. Bu sunucu ayrı bir makinede olması önerilir, ama test ortamı için aynı sunucuya da kurabilirsiniz.

apt update && apt upgrade -y
apt install freeradius freeradius-ldap freeradius-utils -y

# Servisi başlat ve enable et
systemctl enable freeradius
systemctl start freeradius

# Durumu kontrol et
systemctl status freeradius

FreeRADIUS’un varsayılan konfigürasyon dizini /etc/freeradius/3.0/ altındadır. Bu dizin yapısını anlamak kritik önem taşır:

  • /etc/freeradius/3.0/clients.conf: Hangi istemcilerin (OpenVPN sunucusu gibi) RADIUS’a bağlanabileceğini tanımlar
  • /etc/freeradius/3.0/users: Lokal kullanıcı tanımları
  • /etc/freeradius/3.0/mods-available/: Kullanılabilir modüller
  • /etc/freeradius/3.0/mods-enabled/: Aktif modüller (symlink’ler)
  • /etc/freeradius/3.0/sites-available/: Virtual server tanımları

OpenVPN Sunucusunu RADIUS İstemcisi Olarak Tanımlama

nano /etc/freeradius/3.0/clients.conf

Dosyanın sonuna şunu ekleyin:

client openvpn-server {
    ipaddr          = 192.168.1.10    # OpenVPN sunucusunun IP'si
    secret          = G3rC3kT3Gucl4B1rS1fr3!
    shortname       = openvpn
    nas-type        = other
    require_message_authenticator = no
}

Shared secret’ı mutlaka güçlü ve benzersiz seçin. Bu değeri OpenVPN tarafında da kullanacaksınız, kaydedin.

LDAP Modülünü Yapılandırma

FreeRADIUS’un LDAP ile konuşabilmesi için ilgili modülü aktif edip konfigüre etmemiz lazım:

# LDAP modülünü etkinleştir
ln -s /etc/freeradius/3.0/mods-available/ldap 
      /etc/freeradius/3.0/mods-enabled/ldap

# LDAP konfigürasyonunu düzenle
nano /etc/freeradius/3.0/mods-available/ldap

LDAP modülünün temel konfigürasyonu:

ldap {
    server = "ldap://192.168.1.20"    # LDAP sunucu IP'si
    port = 389
    
    # Bağlantı için kullanılacak DN
    identity = "cn=radius-bind,dc=sirket,dc=local"
    password = "LdapB4glantıP4rolas1!"
    
    # Kullanıcı arama base DN
    base_dn = "dc=sirket,dc=local"
    
    user {
        base_dn = "ou=VPNUsers,dc=sirket,dc=local"
        filter = "(uid=%{%{Stripped-User-Name}:-%{User-Name}})"
        scope = 'sub'
    }
    
    group {
        base_dn = "ou=Groups,dc=sirket,dc=local"
        filter = "(objectClass=groupOfNames)"
        membership_attribute = "memberOf"
    }
    
    # TLS kullanacaksanız
    # tls {
    #     start_tls = yes
    #     certificate_file = /etc/ssl/certs/ca-certificates.crt
    # }
    
    pool {
        start = 5
        min = 3
        max = 32
        spare = 10
        uses = 0
        retry_delay = 30
        lifetime = 0
        idle_timeout = 60
    }
}

Active Directory kullanıyorsanız filter satırını şöyle değiştirin:

filter = "(sAMAccountName=%{%{Stripped-User-Name}:-%{User-Name}})"

Default Site’ı Düzenleme

LDAP kimlik doğrulamasının devreye girmesi için default virtual server’ı düzenlememiz gerekiyor:

nano /etc/freeradius/3.0/sites-available/default

authorize bölümünde ldap satırını uncomment edin:

authorize {
    filter_username
    preprocess
    chap
    mschap
    
    # LDAP modülünü etkinleştir
    ldap
    
    eap {
        ok = return
    }
    
    expiration
    logintime
    pap
}

authenticate {
    Auth-Type PAP {
        pap
    }
    Auth-Type CHAP {
        chap
    }
    Auth-Type MS-CHAP {
        mschap
    }
    
    # LDAP authenticate
    Auth-Type LDAP {
        ldap
    }
}

Değişikliklerden sonra FreeRADIUS’u debug modda başlatarak test edin:

systemctl stop freeradius
freeradius -X 2>&1 | head -100

Hata yoksa servisi tekrar başlatın:

systemctl start freeradius

FreeRADIUS Bağlantı Testi

OpenVPN tarafına geçmeden önce RADIUS’un düzgün çalıştığını doğrulayalım:

# radtest ile test kullanıcısı deneyin
radtest testkullanici P@ssw0rd 127.0.0.1 0 testing123

# Başarılı yanıt şöyle görünmeli:
# Sent Access-Request Id 77 from 0.0.0.0:56789 to 127.0.0.1:1812
# Received Access-Accept Id 77 from 127.0.0.1:1812 to ...

Access-Accept görüyorsanız RADIUS tarafı hazır demektir. Access-Reject alıyorsanız LDAP bağlantısını ve kullanıcı DN’ini kontrol edin.

OpenVPN Sunucusunu Kurma

RADIUS tarafı hazır, şimdi OpenVPN kurulumuna geçelim:

apt install openvpn openvpn-auth-radius -y

# Easy-RSA ile PKI altyapısını kur
apt install easy-rsa -y
make-cadir /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa

# PKI başlat
./easyrsa init-pki
./easyrsa build-ca nopass

# Sunucu sertifikası oluştur
./easyrsa gen-req server nopass
./easyrsa sign-req server server

# Diffie-Hellman parametreleri (bu biraz zaman alabilir)
./easyrsa gen-dh

# TLS Auth key
openvpn --genkey secret /etc/openvpn/ta.key

# Sertifikaları kopyala
cp pki/ca.crt /etc/openvpn/
cp pki/issued/server.crt /etc/openvpn/
cp pki/private/server.key /etc/openvpn/
cp pki/dh.pem /etc/openvpn/

OpenVPN Sunucu Konfigürasyonu

nano /etc/openvpn/server.conf
port 1194
proto udp
dev tun

ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem
tls-auth /etc/openvpn/ta.key 0

server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt

push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

keepalive 10 120
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2

user nobody
group nogroup

persist-key
persist-tun

status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3

# RADIUS kimlik doğrulama için kritik satırlar
plugin /usr/lib/openvpn/radiusplugin.so 
    /etc/openvpn/radiusplugin.conf

# Kullanıcı adı/parola doğrulamasını zorunlu kıl
auth-user-pass-verify via-plugin
verify-client-cert none
username-as-common-name

RADIUS Plugin Konfigürasyonu

OpenVPN’in RADIUS sunucusuyla nasıl konuşacağını tanımlamak için plugin konfigürasyon dosyasını oluşturuyoruz:

nano /etc/openvpn/radiusplugin.conf
# NAS bilgileri
NAS-Identifier=openvpn
Service-Type=5
Framed-Protocol=1
NAS-Port-Type=5

# RADIUS sunucu bağlantısı
server
{
    # RADIUS sunucusunun IP'si
    name=192.168.1.15
    
    # Authentication portu
    authport=1812
    
    # Accounting portu
    acctport=1813
    
    # clients.conf'da tanımladığınız secret
    sharedsecret=G3rC3kT3Gucl4B1rS1fr3!
    
    # Timeout süresi (saniye)
    wait=3
    
    # Yeniden deneme sayısı
    retry=3
    
    # Dead zamanı (saniye) - sunucu cevap vermezse
    deadtime=0
    
    # Sonraki sunucuya geç?
    nextserver=no
}

# Accounting aktif/pasif
accounting=true
accountingonly=false

# Kullanıcı ipini RADIUS'a bildir
useauthcontrolfile=false

# VPN subnet bilgisi
overwriteccfiles=true

# Log seviyesi (0-3)
nonfatalaccounting=false

Gerekli dizini oluşturun:

mkdir -p /var/log/openvpn
chown nobody:nogroup /var/log/openvpn

IP yönlendirmesini aktif edin:

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

# NAT kuralı ekle
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
apt install iptables-persistent -y
netfilter-persistent save

OpenVPN servisini başlatın:

systemctl enable openvpn@server
systemctl start openvpn@server
systemctl status openvpn@server

İstemci Konfigürasyonu

Kullanıcılara dağıtmak için bir istemci konfigürasyon dosyası hazırlayalım. RADIUS entegrasyonunda istemci sertifikası zorunlu olmadığından (verify-client-cert none ayarıyla) sadece CA sertifikasını eklemek yeterli:

cat > /etc/openvpn/client-template.ovpn << 'EOF'
client
dev tun
proto udp
remote vpn.sirket.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun

ca [inline]
tls-auth [inline] 1

cipher AES-256-GCM
auth SHA256
tls-version-min 1.2

# Kullanıcı adı/parola sor
auth-user-pass

# Bağlantı doğrulama
remote-cert-tls server
verify-x509-name server name

verb 3
EOF

Gerçek dünyada bu dosyayı bir script ile CA sertifikası ve TLS key gömülü hale getirip kullanıcılara dağıtabilirsiniz.

İki Faktörlü Doğrulama Ekleme

RADIUS üzerinde Google Authenticator entegrasyonu yapmak mümkün. Bu sayede kullanıcılar VPN bağlantısı sırasında hem şifrelerini hem de OTP kodlarını girecekler.

apt install libpam-google-authenticator -y

FreeRADIUS’ta PAP modülünü PAM’a yönlendirin:

nano /etc/freeradius/3.0/mods-available/pam
# PAM modülü aktivasyonu
ln -s /etc/freeradius/3.0/mods-available/pam 
      /etc/freeradius/3.0/mods-enabled/pam

PAM konfigürasyonunu ekleyin:

nano /etc/pam.d/radiusd
auth    required    pam_google_authenticator.so secret=/etc/freeradius/otp/${USER}/.google_authenticator
auth    sufficient  pam_ldap.so
account required    pam_permit.so

Her kullanıcı için Google Authenticator kurulumu:

# Kullanıcı adına otp dizini oluştur
mkdir -p /etc/freeradius/otp/ahmet
su -c "google-authenticator -t -d -f 
    -r 3 -R 30 
    --secret=/etc/freeradius/otp/ahmet/.google_authenticator" 
    -s /bin/bash ahmet

Sorun Giderme

Entegrasyon sırasında karşılaşılan yaygın problemler ve çözümleri:

RADIUS bağlantı hatası alıyorsanız:

# Firewall kurallarını kontrol et
ufw allow 1812/udp
ufw allow 1813/udp

# RADIUS portlarının dinlenip dinlenmediğini doğrula
ss -ulnp | grep radius

# Test bağlantısı
radtest kullanici sifre 192.168.1.15 0 sharedsecret

OpenVPN loglarında authentication failed görüyorsanız:

# Detaylı log için
tail -f /var/log/openvpn/openvpn.log

# FreeRADIUS debug modda çalıştır
systemctl stop freeradius
freeradius -X

LDAP bağlantı sorunları için:

# LDAP bağlantısını test et
ldapsearch -H ldap://192.168.1.20 
    -D "cn=radius-bind,dc=sirket,dc=local" 
    -w "LdapB4glantıP4rolas1!" 
    -b "ou=VPNUsers,dc=sirket,dc=local" 
    "(uid=testkullanici)"

Plugin yüklenemiyorsa:

# Plugin konumunu bul
find /usr -name "radiusplugin.so" 2>/dev/null

# Alternatif kurulum
apt install openvpn-auth-radius

Accounting ve Loglama

RADIUS accounting sayesinde kimin ne zaman bağlandığını, ne kadar veri transferi yaptığını loglamak mümkün. Bu veriler hem güvenlik denetimi hem de kapasite planlaması için çok değerli:

nano /etc/freeradius/3.0/mods-available/detail
detail {
    filename = /var/log/freeradius/radacct/%{Client-IP-Address}/detail-%Y%m%d
    permissions = 0600
    header = "%t"
    locking = no
    log_packet_header = no
}

Accounting loglarını analiz etmek için basit bir script:

#!/bin/bash
# /usr/local/bin/vpn-report.sh

LOG_DIR="/var/log/freeradius/radacct"
TODAY=$(date +%Y%m%d)

echo "=== VPN Bağlantı Raporu - $(date +%d/%m/%Y) ==="
echo ""

grep "User-Name" $LOG_DIR/*/detail-$TODAY 2>/dev/null | 
    awk '{print $2}' | sort | uniq -c | sort -rn | 
    while read count user; do
        echo "  Kullanıcı: $user | Oturum Sayısı: $count"
    done

echo ""
echo "=== Toplam Aktif Oturum ==="
cat /var/log/openvpn/openvpn-status.log | grep "^CLIENT_LIST" | wc -l

Sonuç

OpenVPN ile FreeRADIUS entegrasyonu ilk bakışta karmaşık görünse de adım adım yapıldığında oldukça yönetilebilir bir süreç. Bu yapıyı kurduğunuzda elde ettiğiniz en büyük kazanım merkezi yönetim ve denetlenebilirlik oluyor. Yüz kullanıcılı bir VPN altyapısını artık sertifika karmaşasına girmeden Active Directory veya LDAP üzerinden yönetebilirsiniz.

Production’a almadan önce mutlaka şu noktaları gözden geçirin:

  • RADIUS sunucusuna olan bağlantıyı TLS ile şifreleyin
  • Shared secret’ı en az 32 karakter ve kompleks seçin
  • RADIUS sunucusu için ayrı bir güvenlik grubu veya VLAN kullanın
  • Accounting loglarını düzenli olarak yedekleyin ve izleyin
  • FreeRADIUS için fail-over senaryosu oluşturun, tek nokta arızası (SPOF) ciddi sorun yaratır
  • Rate limiting ile brute-force saldırılarına karşı önlem alın

Özellikle kurumsal ortamlarda bu yapıyı Active Directory ile entegre etmek ve MFA eklemek, güvenlik duruşunuzu önemli ölçüde güçlendirecektir. Sorularınız olursa yorum bölümünde buluşalım.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir