OpenVPN ile Güvenlik Sertleştirme: tls-auth ve tls-crypt Kullanımı

OpenVPN kurulumlarında çoğu kişi sertifika altyapısını kuruyor, temel yapılandırmayı tamamlıyor ve “tamam, artık güvenli” diye düşünüyor. Oysa standart bir OpenVPN kurulumu, bazı ciddi saldırı vektörlerine karşı hala savunmasız kalabiliyor. tls-auth ve tls-crypt direktifleri tam da bu noktada devreye giriyor ve VPN’inize ciddi bir güvenlik katmanı ekliyor. Bu yazıda her iki yöntemi derinlemesine inceleyeceğiz, aralarındaki farkları net biçimde ortaya koyacağız ve production ortamında nasıl uygulayacağınızı adım adım göstereceğiz.

Neden Ekstra TLS Güvenliğine İhtiyaç Var?

Standart OpenVPN kurulumunda TLS el sıkışması herkes tarafından başlatılabilir. Yani internetteki herhangi bir tarayıcı veya script, OpenVPN portunuza bağlanıp TLS müzakeresi başlatmayı deneyebilir. Bu durum birkaç soruna yol açar.

DoS (Denial of Service) saldırıları bunların başında gelir. Saldırgan binlerce TLS el sıkışması başlatarak sunucunuzu yorabilir. TLS müzakeresi CPU açısından pahalı bir işlemdir ve bu tür saldırılar küçük bir sunucuyu dize getirebilir.

Port tarama ve servis tespiti de önemli bir sorun. Saldırgan OpenVPN portunuza bağlanıp hangi VPN yazılımı kullandığınızı, hangi sürümde olduğunuzu tespit edebilir. Bu bilgi sonraki saldırılar için zemin hazırlar.

Replay saldırıları da standart kurulumda mümkündür. Yakalanmış TLS paketleri tekrar oynatılarak oturum ele geçirme girişiminde bulunulabilir.

tls-auth ve tls-crypt bu sorunların tamamını farklı mekanizmalarla çözer. İkisi de HMAC tabanlı bir ön kimlik doğrulama katmanı ekler ancak bunu farklı şekillerde yapar.

tls-auth Direktifi

Nasıl Çalışır?

tls-auth, gelen her pakete bir HMAC imzası ekler. Sunucu bu imzayı kontrol eder ve geçersiz imzalı paketleri TLS el sıkışması başlamadan düşürür. Bu sayede sahte istemciler sunucunuzla hiçbir zaman gerçek bir TLS diyaloğuna giremez.

Teknik olarak şunu yapar: Her iki taraf (sunucu ve istemci) aynı paylaşılan anahtara sahip olmalıdır. Bu anahtar ile gelen paketlerin HMAC değeri hesaplanır. Eşleşmiyorsa paket anında düşürülür, loglanmaz bile.

tls-auth Anahtarı Oluşturma

# tls-auth anahtarını oluştur
openvpn --genkey --secret /etc/openvpn/ta.key

# Dosya içeriğine bakalım
cat /etc/openvpn/ta.key

Çıktıda -----BEGIN OpenVPN Static key V1----- ile başlayan bir blok göreceksiniz. Bu dosyayı güvenli bir şekilde her istemciye dağıtmanız gerekiyor.

Sunucu Yapılandırması

# /etc/openvpn/server.conf içine eklenecekler

# tls-auth direktifi - sunucu tarafı 0 parametresi alır
tls-auth /etc/openvpn/ta.key 0

# TLS versiyonunu sınırla
tls-version-min 1.2

# Güçlü şifreleme algoritmaları kullan
cipher AES-256-CBC
auth SHA256

# TLS cipher suite'leri sınırla
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256

İstemci Yapılandırması

# /etc/openvpn/client.conf içine eklenecekler

# İstemci tarafı 1 parametresi alır
tls-auth /etc/openvpn/ta.key 1

# Sunucuyla eşleşen ayarlar
cipher AES-256-CBC
auth SHA256
tls-version-min 1.2

Dikkat edilmesi gereken kritik nokta: sunucu 0, istemci 1 parametresi kullanır. Bu yönelim parametresi (direction parameter) olarak adlandırılır ve HMAC hesaplamalarında kullanılan anahtar materyalinin hangi yarısının kullanılacağını belirler.

tls-crypt Direktifi

tls-auth’dan Farkı Nedir?

tls-crypt, OpenVPN 2.4 ile geldi ve tls-auth‘un bir üst versiyonu olarak düşünülebilir. Farklar oldukça önemli.

tls-auth sadece HMAC doğrulama yapar, TLS kontrol kanalını şifrelemez. Yani bir sniffer TLS el sıkışma paketlerini yakalayabilir ve hangi OpenVPN versiyonu kullandığınızı tespit edebilir.

tls-crypt ise hem HMAC doğrulama yapar hem de TLS kontrol kanalının tamamını şifreler. Bu sayede dışarıdan bakıldığında tüm kontrol kanalı trafiği anlamsız görünür. OpenVPN kullandığınız bile tespit edilemez hale gelir.

tls-crypt’in sunduğu ek avantajlar:

  • Kontrol kanalı trafiği şifrelenir, içerik görülemez
  • Deep Packet Inspection (DPI) araçları VPN trafiğini tespit edemez
  • Sansürcü güçlerin VPN bağlantısını engellemesi zorlaşır
  • Replay saldırılarına karşı ek koruma sağlar

tls-crypt Anahtarı Oluşturma

# tls-crypt anahtarını oluştur
openvpn --genkey --secret /etc/openvpn/tls-crypt.key

# Dosyanın izinlerini güvence altına al
chmod 600 /etc/openvpn/tls-crypt.key
chown root:root /etc/openvpn/tls-crypt.key

# Anahtarın doğru oluştuğunu kontrol et
wc -l /etc/openvpn/tls-crypt.key

tls-crypt anahtarı ile tls-auth anahtarı teknik olarak aynı formattadır. Önemli olan yapılandırma dosyasında hangi direktifi kullandığınızdır.

Sunucu Yapılandırması

# /etc/openvpn/server.conf - tls-crypt ile tam örnek

port 1194
proto udp
dev tun

# Sertifika dosyaları
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/server.crt
key /etc/openvpn/pki/server.key
dh /etc/openvpn/pki/dh.pem

# tls-crypt direktifi - yön parametresi gerekmez
tls-crypt /etc/openvpn/tls-crypt.key

# Şifreleme ayarları
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2

# Sunucu ağı
server 10.8.0.0 255.255.255.0

# Günlükleme
verb 3

tls-crypt kullanırken yön parametresi (0 veya 1) kullanmaya gerek yoktur. Sunucu ve istemci için aynı direktif yeterlidir.

İstemci Yapılandırması

# /etc/openvpn/client.conf - tls-crypt ile tam örnek

client
dev tun
proto udp

remote vpn.sirketim.com 1194

# Sertifika dosyaları
ca ca.crt
cert client.crt
key client.key

# tls-crypt - yön parametresi yok
tls-crypt tls-crypt.key

# Şifreleme - sunucuyla eşleşmeli
cipher AES-256-GCM
auth SHA256
tls-version-min 1.2

verb 3

tls-crypt-v2: Daha Gelişmiş Senaryo

OpenVPN 2.5 ile gelen tls-crypt-v2, büyük ölçekli dağıtımlar için mükemmel bir çözüm sunuyor. Klasik tls-crypt‘te tüm istemciler aynı anahtarı paylaşıyor. Bu durum bir anahtarın ele geçirilmesi halinde tüm istemcileri etkiler.

tls-crypt-v2 ile her istemcinin kendi benzersiz anahtarı olur. Bir istemci anahtarı ele geçirilse bile sadece o istemcinin ön kimlik doğrulaması kırılır, diğerleri etkilenmez.

# tls-crypt-v2 için önce sunucu anahtarı oluştur
openvpn --genkey tls-crypt-v2-server /etc/openvpn/tls-crypt-v2-server.key

# Her istemci için ayrı anahtar oluştur
openvpn --tls-crypt-v2 /etc/openvpn/tls-crypt-v2-server.key 
        --genkey tls-crypt-v2-client /etc/openvpn/clients/ahmet-laptop.key

openvpn --tls-crypt-v2 /etc/openvpn/tls-crypt-v2-server.key 
        --genkey tls-crypt-v2-client /etc/openvpn/clients/mehmet-telefon.key
# Sunucu yapılandırması - tls-crypt-v2
# /etc/openvpn/server.conf

tls-crypt-v2 /etc/openvpn/tls-crypt-v2-server.key

# İstemci yapılandırmasında ise
# tls-crypt-v2 /etc/openvpn/clients/ahmet-laptop.key

Gerçek Dünya Senaryoları

Senaryo 1: Küçük Şirket VPN’i

50 kişilik bir şirkette çalışıyorsunuz. IT altyapısı temel düzeyde, herkesin aynı genel yapılandırma dosyasını kullandığı bir OpenVPN kurulumu var. Bu durumda tls-crypt ideal çözümdür.

Tüm istemciler aynı tls-crypt.key dosyasını kullanır. Dosyayı şirket içi güvenli kanaldan (mesela şifreli e-posta veya Bitwarden gibi bir şifre yöneticisi) dağıtırsınız. Bir çalışan ayrıldığında hem sertifikayı hem de tls-crypt anahtarını yenilemek gerekir, bu biraz zahmettir ama yönetilebilir.

Senaryo 2: Büyük Kurumsal Ortam

500+ kullanıcılı bir kurumda çalışıyorsunuz. Çalışan sirkülasyonu var ve güvenlik politikaları sıkı. Bu durumda tls-crypt-v2 doğru seçimdir.

Her kullanıcıya özel anahtar oluşturulur. Bir kullanıcı işten ayrıldığında veya cihazı çalındığında sadece o kullanıcının anahtarını iptal etmek yeterlidir. Diğer 499 kullanıcı etkilenmez.

Senaryo 3: Sansür Atlatma

Kısıtlayıcı bir ağ ortamında (kurumsal güvenlik duvarı, ülke çapında sansür) çalışmanız gerekiyor. DPI araçları OpenVPN trafiğini tespit edip engelleyebiliyor. Bu durumda tls-crypt birinci savunma hattıdır.

tls-crypt ile kontrol kanalı şifrelendiğinden dışarıdan bakıldığında bu trafik OpenVPN olarak tanımlanamaz. Bununla birlikte obfs4 veya benzeri obfuscation araçlarıyla kombinlemek daha güçlü bir çözüm sunar.

Mevcut Kuruluma Geçiş

Elinizde çalışan bir OpenVPN kurulumu varsa ve tls-auth veya tls-crypt eklemek istiyorsanız dikkatli bir planlama gerekir. Tüm istemcileri aynı anda güncellemek mümkün olmayabilir.

# Mevcut sunucu yapılandırmasını yedekle
cp /etc/openvpn/server.conf /etc/openvpn/server.conf.backup.$(date +%Y%m%d)

# Yeni anahtar oluştur
openvpn --genkey --secret /etc/openvpn/tls-crypt.key
chmod 600 /etc/openvpn/tls-crypt.key

# Sunucu.conf'a ekle
echo "tls-crypt /etc/openvpn/tls-crypt.key" >> /etc/openvpn/server.conf

# Servisi yeniden başlat
systemctl restart openvpn@server

# Durumu kontrol et
systemctl status openvpn@server
journalctl -u openvpn@server -n 50

Geçiş sürecinde önemli bir not: tls-crypt eklediğiniz anda eski istemciler bağlanamaz. Bu yüzden bakım penceresi planlayın ve tüm istemcilere yeni yapılandırmayı gönderin.

Yapılandırma Doğrulama ve Test

Yeni yapılandırmayı canlıya almadan önce test etmek şart.

# Sunucu yapılandırmasını syntax açısından test et
openvpn --config /etc/openvpn/server.conf --verb 4 --test-crypto

# Bağlantıyı debug modda test et
openvpn --config /etc/openvpn/client.conf --verb 6 2>&1 | head -100

# tls-crypt'in aktif olduğunu log'dan doğrula
journalctl -u openvpn@server | grep -i "tls-crypt|tls-auth"
# Nmap ile dışarıdan kontrol - tls-crypt aktifken
# Sunucuya port tarama yap ve yanıt incele
nmap -sV -p 1194 --script openvpn-info vpn.sirketim.com

# tls-crypt aktifken nmap servisi tanımlayamaz
# Çıktıda "unrecognized service" veya benzeri görmek beklenir

Güvenlik Sertleştirmede Dikkat Edilecekler

Anahtar Dağıtımı

tls-auth ve tls-crypt anahtarlarının güvenli dağıtımı kritiktir. Bu anahtarlar ele geçirilirse, ön kimlik doğrulama katmanınız değersiz hale gelir.

Güvenli dağıtım yöntemleri:

  • Şifreli e-posta (S/MIME veya PGP ile)
  • Şifre yöneticisi paylaşım özelliği (Bitwarden, 1Password)
  • SFTP ile doğrudan aktarım
  • Ansible veya Puppet gibi yapılandırma yönetim araçlarıyla otomatik dağıtım
  • Git şifreleme araçları (git-crypt, SOPS)

Kesinlikle yapılmaması gerekenler:

  • Anahtarı düz metin e-posta ile göndermek
  • Ağ paylaşımında açık bırakmak
  • Kaynak kontrolüne (GitHub, GitLab) commit etmek
  • Herkese açık bir yerde depolamak

Anahtar Rotasyonu

Anahtarlarınızı periyodik olarak değiştirin. Şirket politikanıza göre 6 ay veya 1 yıllık rotasyon döngüsü makul bir yaklaşımdır. Bir güvenlik ihlali şüphesi varsa hemen yenileyin.

# Eski anahtarı arşivle
mv /etc/openvpn/tls-crypt.key /etc/openvpn/archive/tls-crypt.key.$(date +%Y%m%d)

# Yeni anahtar oluştur
openvpn --genkey --secret /etc/openvpn/tls-crypt.key
chmod 600 /etc/openvpn/tls-crypt.key

# Servisi yeniden başlat
systemctl reload openvpn@server || systemctl restart openvpn@server

Ek Güvenlik Direktifleri

tls-auth veya tls-crypt ile birlikte kullanılması gereken diğer güvenlik direktifleri:

remote-cert-tls server: İstemcinin sunucu sertifikasının gerçekten bir sunucu sertifikası olduğunu doğrulamasını sağlar. MITM saldırılarına karşı kritik.

verify-x509-name: Bağlanılan sunucunun CN (Common Name) değerini doğrular. Sertifika çalınmalarına karşı ek koruma.

tls-version-min 1.2: Eski ve güvensiz TLS sürümlerini devre dışı bırakır. TLS 1.0 ve 1.1 artık güvensiz kabul edilmektedir.

cipher AES-256-GCM: GCM modu hem şifreleme hem de bütünlük doğrulama sağlar. CBC moduna göre daha güvenli ve genellikle daha hızlıdır.

# Önerilen tam güvenlik yapılandırması bloğu
# server.conf'a ekleyin

tls-crypt /etc/openvpn/tls-crypt.key
tls-version-min 1.2
tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384
cipher AES-256-GCM
auth SHA256
remote-cert-tls client
verify-x509-name client_common_name name

# client.conf'a ekleyin
tls-crypt tls-crypt.key
tls-version-min 1.2
cipher AES-256-GCM
auth SHA256
remote-cert-tls server

Sık Yapılan Hatalar ve Çözümleri

Hata: “tls-auth packet authentication failed”

Bu hata sunucu ve istemcinin farklı anahtarlar veya farklı yön parametreleri kullandığını gösterir.

  • Sunucuda 0, istemcide 1 parametresinin olduğunu kontrol edin
  • Her iki tarafta da aynı ta.key dosyasının kullanıldığını doğrulayın

Hata: “tls-crypt unwrap error”

tls-crypt anahtarlarının eşleşmediğini gösterir.

  • İstemcideki anahtar dosyasının sunucudakiyle birebir aynı olduğunu kontrol edin
  • md5sum ile iki taraftaki dosyayı karşılaştırın

Hata: İstemciler bağlanıyor ama tls-crypt aktif değil gibi görünüyor

Log seviyesini artırıp kontrol edin:

# Sunucu loglarında tls-crypt aktivasyonunu kontrol et
journalctl -u openvpn@server | grep -E "tls-crypt|TLS"

# Verb seviyesini geçici olarak artır
# server.conf'ta: verb 6
# Sonra servisi yeniden başlat ve logları izle
systemctl restart openvpn@server
journalctl -u openvpn@server -f

Sonuç

tls-auth ve tls-crypt, OpenVPN güvenliğini standart sertifika altyapısının ötesine taşıyan kritik direktiflerdir. Her ikisi de HMAC tabanlı ön kimlik doğrulama sağlar ancak tls-crypt kontrol kanalını şifreleyerek çok daha kapsamlı koruma sunar.

Yeni bir kurulum yapıyorsanız doğrudan tls-crypt ile başlayın. OpenVPN 2.4 ve üzeri kullanıyorsanız tls-auth‘a dönmenizin hiçbir nedeni yok. Büyük ölçekli veya yüksek güvenlik gereksinimleri olan bir ortamdaysanız tls-crypt-v2‘yi değerlendirin.

Mevcut kurulumlarınızı güncelliyorsanız bir bakım penceresi planlayın, anahtarları güvenli dağıtın ve geçiş öncesinde test ortamında doğrulama yapın. Bu direktifleri doğru şifreleme algoritmaları ve sertifika doğrulama ayarlarıyla birlikte kullandığınızda, OpenVPN kurulumunuz ciddi saldırı senaryolarına karşı son derece dirençli bir hale gelecektir.

Güvenlik tek seferlik bir iş değil. Anahtarlarınızı periyodik olarak rotasyona sokun, güncellemeleri takip edin ve loglarınızı düzenli gözden geçirin.

Yorum yapın