OpenVPN Easy-RSA ile Sertifika Yönetimi

Güvenli bir VPN altyapısı kurmanın en kritik adımı, sertifika yönetimini doğru yapmaktır. OpenVPN, kimlik doğrulama için PKI (Public Key Infrastructure) kullanır ve bu altyapıyı yönetmek için Easy-RSA aracı neredeyse standart haline gelmiştir. Yanlış yapılandırılmış bir sertifika altyapısı, tüm VPN güvenliğini tehlikeye atabilir. Bu yazıda Easy-RSA ile sertifika yönetimini baştan sona ele alacağız.

Easy-RSA Nedir ve Neden Kullanıyoruz?

Easy-RSA, OpenSSL üzerine inşa edilmiş bir PKI yönetim aracıdır. Kendi CA (Certificate Authority) sunucunuzu oluşturmanıza, sunucu ve istemci sertifikaları üretmenize, sertifikaları iptal etmenize olanak tanır. OpenVPN ile birlikte gelir ama bağımsız olarak da kullanılabilir.

Neden OpenSSL komutlarını elle yazmak yerine Easy-RSA kullanıyoruz? Çünkü OpenSSL komutları karmaşık, hata yapmaya açık ve yönetmesi zordur. Easy-RSA bu süreci standartlaştırır ve tekrarlanabilir hale getirir. Özellikle onlarca istemcisi olan bir ortamda bu fark çok belirginleşir.

Easy-RSA 3.x ile Easy-RSA 2.x arasında önemli farklar var. Eski sürüm bir dizi bash scriptten oluşurken, yeni sürüm daha temiz bir CLI arayüzüne sahip. Bu yazıda 3.x sürümünü kullanacağız.

Kurulum

Ubuntu/Debian sistemlerde kurulum oldukça basit:

sudo apt update
sudo apt install easy-rsa

# Veya doğrudan GitHub'dan son sürümü çekmek için:
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.1.7/EasyRSA-3.1.7.tgz
tar xvf EasyRSA-3.1.7.tgz
mv EasyRSA-3.1.7 /etc/easy-rsa

RHEL/CentOS sistemlerde:

sudo dnf install easy-rsa
# veya
sudo yum install easy-rsa

Kurulumdan sonra PKI dizinimizi oluşturacağımız çalışma alanını hazırlayalım. CA sunucusunu OpenVPN sunucusundan ayrı tutmanızı şiddetle tavsiye ederim. Gerçek dünyada CA anahtarı ayrı, internete bağlı olmayan bir makinede tutulur. Biz bu yazıda demo amaçlı aynı makinede devam edeceğiz ama bunu aklınızdan çıkarmayın.

mkdir -p /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa

vars Dosyasını Yapılandırma

Easy-RSA, vars adlı bir konfigürasyon dosyası kullanır. Bu dosya olmadan da çalışır ama varsayılan değerler genellikle production ortamı için yeterli değildir.

cp vars.example vars
nano vars

Vars dosyasında değiştirmeniz gereken kritik parametreler:

# Organizasyon bilgileri
set_var EASYRSA_REQ_COUNTRY    "TR"
set_var EASYRSA_REQ_PROVINCE   "Istanbul"
set_var EASYRSA_REQ_CITY       "Istanbul"
set_var EASYRSA_REQ_ORG        "Sirket Adi"
set_var EASYRSA_REQ_EMAIL      "[email protected]"
set_var EASYRSA_REQ_OU         "IT Department"

# Sertifika geçerlilik süreleri
set_var EASYRSA_CA_EXPIRE      3650    # CA sertifikası 10 yıl
set_var EASYRSA_CERT_EXPIRE    825     # İstemci/sunucu sertifikaları ~2.5 yıl
set_var EASYRSA_CRL_DAYS       180     # CRL geçerlilik süresi

# Anahtar boyutu - 2048 minimum, 4096 daha güvenli ama yavaş
set_var EASYRSA_KEY_SIZE       4096

# Digest algoritması
set_var EASYRSA_DIGEST         "sha512"

EASYRSA_CERT_EXPIRE için 825 gün seçmemizin sebebi, Apple’ın iOS ve macOS’ta 2 yıldan uzun TLS sertifikalarını reddetmesi. Mobil istemcileriniz varsa bu sınırı göz önünde bulundurun.

PKI Altyapısını Oluşturma

Şimdi asıl işe başlıyoruz. PKI dizinini başlatıp CA sertifikamızı oluşturacağız.

cd /etc/openvpn/easy-rsa

# PKI dizinini başlat
./easyrsa init-pki

# CA oluştur - parolayı unutmayın!
./easyrsa build-ca

build-ca komutu çalıştırıldığında sizden bir passphrase isteyecek. Bu parolayı asla kaybetmeyin. CA anahtarını imzalamak için her seferinde bu parolaya ihtiyaç duyacaksınız. Güvenli bir parola yöneticisinde saklayın.

Komut tamamlandığında /etc/openvpn/easy-rsa/pki/ altında şunlar oluşur:

  • ca.crt: CA’nın public sertifikası, herkesle paylaşılabilir
  • private/ca.key: CA’nın özel anahtarı, asla paylaşılmaz
  • serial: Sertifika seri numarası takibi
  • index.txt: Verilen sertifikaların veritabanı

Sunucu Sertifikası Oluşturma

CA hazır olduğuna göre OpenVPN sunucusu için sertifika oluşturabiliriz.

# Sunucu için anahtar çifti ve CSR oluştur
./easyrsa gen-req server nopass

# Sunucu sertifikasını CA ile imzala
./easyrsa sign-req server server

nopass parametresi sunucu sertifikasında parola korumasını devre dışı bırakır. Sunucu her yeniden başladığında parola sormadan sertifikayı yükleyebilmesi için bu gereklidir. İstemci sertifikalarında ise parola kullanmak iyi bir pratiktir.

İmzalama adımında CA parolanızı girmeniz istenecek ve sertifika detaylarını onaylamanız gerekecek. “yes” yazarak onaylayın.

Şimdi Diffie-Hellman parametrelerini oluşturalım. Bu işlem uzun sürebilir, 4096 bit için 10-15 dakika bekleyebilirsiniz:

./easyrsa gen-dh

TLS-Auth veya TLS-Crypt için ek bir HMAC anahtarı oluşturalım. Bu, DoS saldırılarına ve port taramasına karşı ek koruma sağlar:

openvpn --genkey secret /etc/openvpn/easy-rsa/pki/ta.key

İstemci Sertifikası Oluşturma

Her VPN kullanıcısı için ayrı sertifika oluşturmanız gerekir. Sertifikaları kullanıcı adlarıyla eşleştirmenizi öneririm, ilerleyen dönemde yönetimi kolaylaşır.

# Ali için sertifika oluştur (parolasız)
./easyrsa gen-req ali nopass
./easyrsa sign-req client ali

# Ayse için sertifika oluştur (parolalı - daha güvenli)
./easyrsa gen-req ayse
./easyrsa sign-req client ayse

Birden fazla istemci sertifikası oluşturmak için basit bir döngü yazabilirsiniz:

#!/bin/bash
# Toplu istemci sertifikası oluşturma scripti

EASYRSA_DIR="/etc/openvpn/easy-rsa"
USERS=("mehmet" "fatma" "kemal" "zeynep" "burak")

cd $EASYRSA_DIR

for user in "${USERS[@]}"; do
    echo "=== $user için sertifika oluşturuluyor ==="
    ./easyrsa gen-req "$user" nopass
    echo "yes" | ./easyrsa sign-req client "$user"
    echo "=== $user sertifikası tamamlandı ==="
done

echo "Tüm sertifikalar oluşturuldu."
ls pki/issued/

Bu scripti çalıştırmadan önce CA parolanızı girmeye hazır olun, her imzalama için isteyecek.

Sertifika Dosyalarını Düzenleme

OpenVPN sunucusuna kopyalanması gereken dosyalar:

# Sunucu dosyalarını OpenVPN dizinine kopyala
cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/server/
cp /etc/openvpn/easy-rsa/pki/issued/server.crt /etc/openvpn/server/
cp /etc/openvpn/easy-rsa/pki/private/server.key /etc/openvpn/server/
cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/server/
cp /etc/openvpn/easy-rsa/pki/ta.key /etc/openvpn/server/

# İzinleri düzenle
chmod 600 /etc/openvpn/server/server.key
chmod 600 /etc/openvpn/server/ta.key
chmod 644 /etc/openvpn/server/ca.crt
chmod 644 /etc/openvpn/server/server.crt
chown -R root:root /etc/openvpn/server/

İstemci için gerekli dosyalar:

  • ca.crt: CA sertifikası
  • ali.crt: İstemci sertifikası
  • ali.key: İstemci özel anahtarı
  • ta.key: TLS auth anahtarı

OVPN Profil Dosyası Oluşturma

İstemci konfigürasyonunu tek bir .ovpn dosyasında toplamak, dağıtımı çok kolaylaştırır. Sertifikaları inline olarak gömeriz:

#!/bin/bash
# İstemci için inline OVPN profili oluştur

CLIENT=$1
SERVER_IP="vpn.sirket.com"
SERVER_PORT="1194"
EASYRSA_DIR="/etc/openvpn/easy-rsa"
OUTPUT_DIR="/etc/openvpn/clients"

if [ -z "$CLIENT" ]; then
    echo "Kullanim: $0 <istemci-adi>"
    exit 1
fi

mkdir -p $OUTPUT_DIR

cat > "$OUTPUT_DIR/$CLIENT.ovpn" <<EOF
client
dev tun
proto udp
remote $SERVER_IP $SERVER_PORT
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-GCM
auth SHA512
tls-client
key-direction 1
verb 3

<ca>
$(cat $EASYRSA_DIR/pki/ca.crt)
</ca>

<cert>
$(cat $EASYRSA_DIR/pki/issued/$CLIENT.crt)
</cert>

<key>
$(cat $EASYRSA_DIR/pki/private/$CLIENT.key)
</key>

<tls-auth>
$(cat $EASYRSA_DIR/pki/ta.key)
</tls-auth>
EOF

chmod 600 "$OUTPUT_DIR/$CLIENT.ovpn"
echo "$CLIENT.ovpn dosyasi olusturuldu: $OUTPUT_DIR/$CLIENT.ovpn"

Bu scripti çalıştırmak için:

chmod +x /usr/local/bin/create-ovpn.sh
/usr/local/bin/create-ovpn.sh ali
/usr/local/bin/create-ovpn.sh ayse

Sertifika İptali (Revocation)

Gerçek dünya senaryosu: Bir çalışan işten ayrıldı veya laptopunu kaybetti. O kişinin VPN erişimini hemen kesmek için sertifikasını iptal etmeniz gerekiyor.

# Sertifikayı iptal et
cd /etc/openvpn/easy-rsa
./easyrsa revoke ali

# Yeni CRL (Certificate Revocation List) oluştur
./easyrsa gen-crl

# CRL'yi OpenVPN dizinine kopyala
cp pki/crl.pem /etc/openvpn/server/
chmod 644 /etc/openvpn/server/crl.pem

OpenVPN sunucu konfigürasyonuna CRL’yi eklediğinizden emin olun:

# /etc/openvpn/server/server.conf içine ekleyin:
crl-verify /etc/openvpn/server/crl.pem

Önemli uyarı: CRL’nin EASYRSA_CRL_DAYS değerinde belirlediğiniz gün sayısı sonunda süresi dolar. Süresini dolmuş bir CRL kullanıyorsanız OpenVPN tüm bağlantıları reddeder! CRL’yi düzenli olarak yenilemeniz gerekir. Bunun için bir cron job kurun:

# Her 60 günde bir CRL yenile
echo "0 2 */60 * * root cd /etc/openvpn/easy-rsa && ./easyrsa gen-crl && cp pki/crl.pem /etc/openvpn/server/ && systemctl reload openvpn-server@server" >> /etc/cron.d/openvpn-crl

Sertifika Durumunu Kontrol Etme

PKI altyapınızın sağlığını kontrol etmek için bazı faydalı komutlar:

# Tüm sertifikaları listele
cd /etc/openvpn/easy-rsa
cat pki/index.txt

# index.txt formatı:
# V = Valid (geçerli)
# R = Revoked (iptal edilmiş)
# E = Expired (süresi dolmuş)

# Belirli bir sertifikanın detaylarını görüntüle
openssl x509 -in pki/issued/ali.crt -text -noout | grep -A2 "Validity"

# Sertifikanın ne zaman dolacağını kontrol et
openssl x509 -in pki/issued/ali.crt -noout -enddate

# Tüm sertifikaların dolum tarihlerini listele
for cert in pki/issued/*.crt; do
    echo -n "$cert: "
    openssl x509 -in "$cert" -noout -enddate
done

# CA sertifikasının durumunu kontrol et
openssl x509 -in pki/ca.crt -noout -text | grep -E "Not Before|Not After"

Sertifika Yenileme

Süresi dolmak üzere olan sertifikaları yenilemek için:

# Eski sertifikayı iptal et
./easyrsa revoke ali

# Yeni sertifika oluştur
./easyrsa gen-req ali nopass
./easyrsa sign-req client ali

# CRL güncelle
./easyrsa gen-crl
cp pki/crl.pem /etc/openvpn/server/

# Yeni OVPN profili oluştur
/usr/local/bin/create-ovpn.sh ali

Sertifika İzleme Scripti

Production ortamında süresi dolmak üzere olan sertifikaları otomatik olarak tespit eden bir script yazalım:

#!/bin/bash
# Sertifika son kullanma tarihi kontrolü
# /usr/local/bin/check-certs.sh

EASYRSA_DIR="/etc/openvpn/easy-rsa"
WARNING_DAYS=30
ADMIN_EMAIL="[email protected]"
LOG_FILE="/var/log/openvpn-cert-check.log"

echo "=== Sertifika Kontrol Raporu - $(date) ===" | tee -a $LOG_FILE

EXPIRING=""
EXPIRED=""

for cert in $EASYRSA_DIR/pki/issued/*.crt; do
    cert_name=$(basename "$cert" .crt)
    expiry_date=$(openssl x509 -in "$cert" -noout -enddate | cut -d= -f2)
    expiry_epoch=$(date -d "$expiry_date" +%s)
    current_epoch=$(date +%s)
    days_left=$(( (expiry_epoch - current_epoch) / 86400 ))

    if [ $days_left -lt 0 ]; then
        EXPIRED+="$cert_name ($days_left gun gecti)n"
        echo "SURESI DOLMUS: $cert_name" | tee -a $LOG_FILE
    elif [ $days_left -lt $WARNING_DAYS ]; then
        EXPIRING+="$cert_name ($days_left gun kaldi)n"
        echo "UYARI: $cert_name - $days_left gun kaldi" | tee -a $LOG_FILE
    else
        echo "OK: $cert_name - $days_left gun kaldi" | tee -a $LOG_FILE
    fi
done

# E-posta bildirimi
if [ -n "$EXPIRED" ] || [ -n "$EXPIRING" ]; then
    MESSAGE="OpenVPN Sertifika Uyarisinn"
    [ -n "$EXPIRED" ] && MESSAGE+="SURESI DOLAN SERTIFIKALAR:n$EXPIREDn"
    [ -n "$EXPIRING" ] && MESSAGE+="YAKINDA DOLACAK SERTIFIKALAR:n$EXPIRINGn"
    echo -e "$MESSAGE" | mail -s "OpenVPN Sertifika Uyarisi" $ADMIN_EMAIL
fi

Bu scripti cron’a ekleyin:

chmod +x /usr/local/bin/check-certs.sh
echo "0 8 * * 1 root /usr/local/bin/check-certs.sh" > /etc/cron.d/cert-check

Yedekleme Stratejisi

PKI altyapısını kaybetmek felaket olur. Düzenli yedekleme zorunludur:

#!/bin/bash
# PKI yedekleme scripti

EASYRSA_DIR="/etc/openvpn/easy-rsa/pki"
BACKUP_DIR="/backup/openvpn-pki"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/pki-backup-$DATE.tar.gz"

mkdir -p $BACKUP_DIR

# Şifreli yedek oluştur
tar czf - $EASYRSA_DIR | openssl enc -aes-256-cbc -pbkdf2 -out $BACKUP_FILE

echo "Yedek olusturuldu: $BACKUP_FILE"
ls -lh $BACKUP_FILE

# 30 günden eski yedekleri sil
find $BACKUP_DIR -name "pki-backup-*.tar.gz" -mtime +30 -delete
echo "Eski yedekler temizlendi."

Yedeği geri yüklemek için:

openssl enc -d -aes-256-cbc -pbkdf2 -in pki-backup-20240115.tar.gz | tar xzf - -C /

Sık Yapılan Hatalar

1. CA anahtarını sunucuda bırakmak: CA özel anahtarı (ca.key) ele geçirilirse saldırgan istediği kadar geçerli sertifika üretebilir. Offline CA kullanın.

2. CRL’yi güncellemeyi unutmak: CRL süresi dolduğunda OpenVPN çalışmaz. Mutlaka monitoring kurun.

3. Sertifikaları paylaşmak: Her istemci için ayrı sertifika oluşturun. Tek bir sertifikayı birden fazla kişiyle paylaşmak, iptal etmeniz gerektiğinde hepsini etkiler.

4. Zayıf şifreleme: Hala 1024 bit RSA veya MD5 kullanan eski konfigürasyonlar görüyorum. Minimum 2048 bit, tercihen 4096 bit ve SHA-256 veya üstü kullanın.

5. vars dosyasını düzenlememek: Default değerlerle üretilen sertifikalarda organizasyon bilgileri “ChangeMe” olarak kalır. Küçük bir detay gibi görünse de kurumsal ortamlarda sorun çıkarır.

Sonuç

Easy-RSA ile OpenVPN sertifika yönetimi, ilk kurulumdan sonra oldukça sistematik bir hal alıyor. Kritik noktaları özetlemek gerekirse:

  • CA anahtarını mümkünse ayrı, offline bir makinede tutun
  • Her kullanıcı için ayrı sertifika üretin ve isimlendirmeye dikkat edin
  • CRL’yi periyodik olarak yenileyin ve monitoring kurun
  • Sertifika dolum tarihlerini takip eden bir script çalıştırın
  • PKI dizinini düzenli olarak şifreli olarak yedekleyin
  • İşten ayrılan çalışanların sertifikalarını anında iptal edin

Sertifika yönetimi sıkıcı gibi görünebilir ama bir güvenlik ihlalinin ardından “keşke daha dikkatli olsaydım” demek çok daha sıkıcı. Altyapınızı sağlam kurun, süreçleri otomatize edin ve uyku düzeninizi koruyun.

Yorum yapın