OpenVAS ile Kapsamlı Zafiyet Taraması
Bir gün production ortamında çalışan bir sunucunun, aylardır kimsenin fark etmediği bir servis üzerinden dışarıya veri sızdırdığını öğrenince “keşke düzenli tarama yapsaydık” diye düşünmüşsünüzdür. Ben bu dersi acı bir şekilde öğrendim. O günden sonra zafiyet taraması benim için bir “iyi olur” değil, “olmazsa olmaz” haline geldi. OpenVAS da bu süreçte en güvendiğim araçlardan biri oldu.
OpenVAS Nedir ve Neden Kullanmalısınız
OpenVAS (Open Vulnerability Assessment System), Greenbone’un geliştirip açık kaynak olarak sunduğu kapsamlı bir zafiyet tarama çerçevesidir. Basit bir port tarayıcı değil; binlerce NVT (Network Vulnerability Test) ile ağınızdaki sistemleri derinlemesine analiz eden, CVE tabanlı raporlar üreten, gerçek anlamda profesyonel bir araçtır.
Piyasada Nessus, Qualys gibi alternatifler var, evet. Ama OpenVAS’ın topluluk sürümü olan Greenbone Community Edition, küçük ve orta ölçekli kurumlar için son derece yeterli bir çözüm sunuyor. Üstelik lisans maliyeti sıfır.
OpenVAS’ı özellikle tercih ediyorum çünkü:
- NVT veritabanı düzenli olarak güncelleniyor ve güncel CVE’leri takip ediyor
- Kimlik doğrulama destekli tarama yapabiliyor, yani hedefe SSH veya SMB ile bağlanıp içeriden kontrol edebiliyor
- Raporlama sistemi son derece detaylı; kritikten bilgiye kadar derecelendirme yapıyor
- GVM (Greenbone Vulnerability Management) web arayüzü ile merkezi yönetim imkânı sunuyor
- API desteği sayesinde CI/CD pipeline’larına entegre edilebiliyor
Kurulum: Debian/Ubuntu Üzerinde GVM
Kurulum süreci biraz uzun ama bir kere düzgün kurduğunuzda yıllarca sorunsuz çalışıyor. Ben her zaman ayrı bir VM veya konteyner üzerinde kuruyorum, production sunucuya kesinlikle kurmayın.
# Sistem güncellemesi ve gerekli bağımlılıklar
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl gnupg2 apt-transport-https software-properties-common
# Greenbone topluluk feed anahtarını ekle
curl -fsSL https://www.greenbone.net/GBCEdition/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/greenbone.gpg
# GVM paket deposunu ekle
echo "deb [signed-by=/usr/share/keyrings/greenbone.gpg] https://ppa.launchpad.net/mrazavi/gvm/ubuntu focal main" |
sudo tee /etc/apt/sources.list.d/greenbone.list
# Alternatif olarak script tabanlı kurulum (önerilen yol)
sudo apt install -y gvm
sudo gvm-setup
Script kurulum sırasında uzun sürebilir çünkü NVT, SCAP ve CERT veritabanlarını indiriyor. Bağlantı hızınıza göre 30-60 dakika arası bekleyebilirsiniz. Bu normal, paniklemeyip beklemenizi tavsiye ederim.
# Kurulum sonrası durum kontrolü
sudo gvm-check-setup
# Servis başlatma
sudo systemctl start gvmd
sudo systemctl start gsad
sudo systemctl start ospd-openvas
sudo systemctl enable gvmd gsad ospd-openvas
# Admin şifresini güncelleme
sudo runuser -u _gvm -- gvmd --user=admin --new-password='GucluBirSifre123!'
Kurulum tamamlandığında https://localhost:9392 adresinden web arayüzüne erişebilirsiniz. İlk girişte SSL sertifikası uyarısı verecek, bunu geçin.
Feed Güncellemesi ve Senkronizasyon
En sık yapılan hata, kurulum sonrası feed güncellemesini ihmal etmek. Eski NVT veritabanıyla tarama yapmak, güncel zafiyetlerin büyük çoğunluğunu kaçırmanız anlamına gelir.
# Feed güncellemesini manuel tetikleme
sudo runuser -u _gvm -- greenbone-nvt-sync
sudo runuser -u _gvm -- greenbone-scapdata-sync
sudo runuser -u _gvm -- greenbone-certdata-sync
# Güncelleme durumunu kontrol et
sudo runuser -u _gvm -- gvmd --get-feeds
Ben bu senkronizasyonu cron ile otomatize ettim:
# /etc/cron.d/gvm-feed-update dosyasını oluştur
cat << 'EOF' | sudo tee /etc/cron.d/gvm-feed-update
# Her gece 02:00'de feed güncelle
0 2 * * * _gvm /usr/sbin/greenbone-nvt-sync >> /var/log/gvm/feed-update.log 2>&1
30 2 * * * _gvm /usr/sbin/greenbone-scapdata-sync >> /var/log/gvm/feed-update.log 2>&1
0 3 * * * _gvm /usr/sbin/greenbone-certdata-sync >> /var/log/gvm/feed-update.log 2>&1
EOF
İlk Taramanızı Oluşturmak: gvm-cli ile Komut Satırından
Web arayüzü güzel ama asıl güç komut satırında. Özellikle otomasyona taşıdığınızda gvm-cli aracı hayat kurtarıyor.
# gvm-tools kurulumu
pip3 install gvm-tools
# Bağlantı testi
gvm-cli --gmp-username admin --gmp-password 'GucluBirSifre123!'
socket --socketpath /var/run/gvmd/gvmd.sock
--xml "<get_version/>"
# Mevcut tarama konfigürasyonlarını listele
gvm-cli --gmp-username admin --gmp-password 'GucluBirSifre123!'
socket --socketpath /var/run/gvmd/gvmd.sock
--xml "<get_configs/>"
Çıktıda göreceğiniz konfigürasyon ID’lerini not edin. Full and Fast genellikle en iyi başlangıç noktasıdır.
# Hedef oluşturma
gvm-cli --gmp-username admin --gmp-password 'GucluBirSifre123!'
socket --socketpath /var/run/gvmd/gvmd.sock
--xml "<create_target>
<name>Prod Network Tarama</name>
<hosts>192.168.1.0/24</hosts>
<port_list id='730ef368-57e2-11e1-a90f-406186ea4fc5'/>
</create_target>"
Kimlik Doğrulama Destekli (Credentialed) Tarama
Bu kısım çok önemli. Kimlik doğrulamasız tarama sadece dışarıdan görünen açıkları tespit eder. Ama sistem içindeki zaafiyetlerin büyük çoğunluğu, ancak sisteme bağlanarak bulunabilir. Örneğin yüklü paketlerin güncel olup olmadığı, servis konfigürasyon hataları, zayıf dosya izinleri.
Önce bir SSH credential oluşturun:
# SSH anahtar çiftini oluştur (sadece tarama için)
ssh-keygen -t ed25519 -f /home/gvmuser/.ssh/scan_key -C "openvas-scan" -N ""
# Hedef sunuculara public key'i dağıt
ssh-copy-id -i /home/gvmuser/.ssh/scan_key.pub [email protected]
# GVM'e credential ekle (web arayüzü üzerinden de yapılabilir)
gvm-cli --gmp-username admin --gmp-password 'GucluBirSifre123!'
socket --socketpath /var/run/gvmd/gvmd.sock
--xml "<create_credential>
<name>Linux SSH Key</name>
<type>usk</type>
<login>scanuser</login>
<key>
<private>$(cat /home/gvmuser/.ssh/scan_key)</private>
</key>
</create_credential>"
Pratik bir not: Tarama için kullandığım SSH kullanıcısına sudo yetkisi veriyorum ama sadece okuma gerektiren komutlar için. /etc/sudoers.d/openvas-scan dosyasına şunu ekliyorum:
# Tarama kullanıcısı için minimal sudo izinleri
scanuser ALL=(ALL) NOPASSWD: /usr/bin/dpkg, /bin/rpm, /usr/bin/apt, /usr/bin/yum
Gerçek Dünya Senaryosu: Kurumsal Ağ Taraması
Geçen ay bir müşterinin DMZ ağını taradım. 47 sunucu, karışık bir ortam: Ubuntu, CentOS, birkaç tane Windows Server. İşte yaklaşımım:
1. Kapsam Belirleme
Önce neyi tarayacağımı netleştirdim. Tüm ağı körü körüne taramak hem zaman kaybı hem de karışıklığa yol açar. CMDB’den aktif sunucu listesini çektim, bir IP listesi oluşturdum.
2. Tarama Zamanlaması
Production ortamında tarama yaparken zamanlama kritik. Yüksek yoğunluklu tarama, düşük bantlıklı sunucularda servis kesintisine yol açabilir. Ben genellikle gece 01:00-05:00 arasını tercih ediyorum.
3. Aşamalı Tarama Yaklaşımı
Hepsini bir anda taramak yerine önce kritik sunucuları, sonra ikincil sistemleri taradım. Bu sayede kritik bulgulara daha hızlı ulaştım.
# Kritik sunucular için ayrı hedef oluştur
cat > kritik_sunucular.txt << EOF
192.168.1.10
192.168.1.15
192.168.1.20
192.168.1.25
EOF
# Python ile otomatik tarama görevi oluşturma
python3 << 'PYEOF'
from gvm.connections import UnixSocketConnection
from gvm.protocols.gmp import Gmp
from gvm.transforms import EtreeResultTransform
connection = UnixSocketConnection(path='/var/run/gvmd/gvmd.sock')
transform = EtreeResultTransform()
with Gmp(connection, transform=transform) as gmp:
gmp.authenticate('admin', 'GucluBirSifre123!')
# Tarama görevi oluştur
res = gmp.create_task(
name='Kritik Sunucu Taramasi',
config_id='daba56c8-73ec-11df-a475-002264764cea', # Full and Fast
target_id='hedef_id_buraya',
scanner_id='08b69003-5fc2-4037-a479-93b440211c73'
)
print(f"Task ID: {res.find('task').get('id')}")
PYEOF
Rapor Analizi ve Önceliklendirme
Tarama sonuçları geldiğinde yüzlerce bulgu görmek sizi bunaltmasın. Sistematik bir yaklaşım şart.
Önem sırası:
- Critical (CVSS 9.0-10.0): 24 saat içinde aksiyon
- High (CVSS 7.0-8.9): 7 gün içinde aksiyon
- Medium (CVSS 4.0-6.9): 30 gün içinde aksiyon
- Low (CVSS 0.1-3.9): Sonraki bakım penceresi
Raporu XML formatında dışa aktarıp işlemek çok daha verimli:
# Raporu XML olarak dışa aktar
gvm-cli --gmp-username admin --gmp-password 'GucluBirSifre123!'
socket --socketpath /var/run/gvmd/gvmd.sock
--xml "<get_reports report_id='RAPOR_ID' format_id='a994b278-1f62-11e1-96ac-406186ea4fc5'/>"
> /tmp/tarama_raporu.xml
# XML'den kritik zafiyetleri filtrele
python3 << 'PYEOF'
import xml.etree.ElementTree as ET
tree = ET.parse('/tmp/tarama_raporu.xml')
root = tree.getroot()
kritik_bulgular = []
for result in root.iter('result'):
severity = result.find('.//severity')
if severity is not None and float(severity.text) >= 7.0:
host = result.find('.//host')
name = result.find('.//name')
nvt_oid = result.find('.//nvt')
kritik_bulgular.append({
'host': host.text if host is not None else 'Bilinmiyor',
'zafiyet': name.text if name is not None else 'Bilinmiyor',
'severity': severity.text
})
# Severity'e göre sırala
kritik_bulgular.sort(key=lambda x: float(x['severity']), reverse=True)
print(f"Toplam Kritik/Yüksek Bulgu: {len(kritik_bulgular)}")
for bulgu in kritik_bulgular[:10]:
print(f"[{bulgu['severity']}] {bulgu['host']} - {bulgu['zafiyet']}")
PYEOF
False Positive Yönetimi
OpenVAS zaman zaman yanlış pozitif sonuçlar üretir. Bu gerçekçi bir problem ve bununla nasıl başa çıkacağınızı bilmek önemli.
Örneğin, bir keresinde tüm Ubuntu 20.04 sunucularımda aynı OpenSSL zafiyeti işaretlendi. Oysa ilgili patch zaten uygulanmıştı, sadece OpenVAS sürüm tespitini yanlış yapıyordu. Bu durumda yapmanız gerekenler:
# İlgili CVE'yi manuel doğrula
dpkg -l | grep openssl
openssl version -a
# Exploit-db veya NIST üzerinden CVE detaylarını kontrol et
# Sonra GVM'de ilgili bulguyu "false positive" olarak işaretle
gvm-cli --gmp-username admin --gmp-password 'GucluBirSifre123!'
socket --socketpath /var/run/gvmd/gvmd.sock
--xml "<create_override>
<nvt oid='ZAFİYET_OID'/>
<hosts>192.168.1.10</hosts>
<new_severity>-1</new_severity>
<text>Patch uygulandı, dpkg ile doğrulandı. False positive.</text>
</create_override>"
Otomasyona Entegrasyon: CI/CD Pipeline
Modern DevOps ortamında zafiyet taraması sadece aylık bir aktivite değil, deployment sürecinin bir parçası olmalı. Jenkinsfile ile basit bir entegrasyon:
#!/bin/bash
# openvas_scan.sh - Pipeline için tarama betiği
TARGET_IP=$1
SCAN_CONFIG="daba56c8-73ec-11df-a475-002264764cea"
SCANNER_ID="08b69003-5fc2-4037-a479-93b440211c73"
echo "[*] ${TARGET_IP} için tarama başlatılıyor..."
# Hedef oluştur
TARGET_ID=$(gvm-cli --gmp-username admin --gmp-password "${GVM_PASS}"
socket --socketpath /var/run/gvmd/gvmd.sock
--xml "<create_target><name>CI-${TARGET_IP}-$(date +%s)</name><hosts>${TARGET_IP}</hosts><port_list id='730ef368-57e2-11e1-a90f-406186ea4fc5'/></create_target>"
| grep -oP 'id="K[^"]+' | head -1)
# Görev oluştur ve başlat
TASK_ID=$(gvm-cli --gmp-username admin --gmp-password "${GVM_PASS}"
socket --socketpath /var/run/gvmd/gvmd.sock
--xml "<create_task><name>CI-Scan-${TARGET_IP}</name><config id='${SCAN_CONFIG}'/><target id='${TARGET_ID}'/><scanner id='${SCANNER_ID}'/></create_task>"
| grep -oP 'id="K[^"]+' | head -1)
gvm-cli --gmp-username admin --gmp-password "${GVM_PASS}"
socket --socketpath /var/run/gvmd/gvmd.sock
--xml "<start_task task_id='${TASK_ID}'/>"
echo "[*] Task ID: ${TASK_ID} - Tarama başladı"
# Tarama tamamlanana kadar bekle
while true; do
STATUS=$(gvm-cli --gmp-username admin --gmp-password "${GVM_PASS}"
socket --socketpath /var/run/gvmd/gvmd.sock
--xml "<get_tasks task_id='${TASK_ID}'/>"
| grep -oP '<status>K[^<]+' | head -1)
echo "[*] Durum: ${STATUS}"
if [ "${STATUS}" = "Done" ]; then
break
fi
sleep 60
done
# Kritik bulgu var mı kontrol et
CRITICAL_COUNT=$(gvm-cli --gmp-username admin --gmp-password "${GVM_PASS}"
socket --socketpath /var/run/gvmd/gvmd.sock
--xml "<get_tasks task_id='${TASK_ID}'/>"
| grep -oP 'severity_filtered="K[^"]+' | head -1)
echo "[*] Kritik bulgu sayısı: ${CRITICAL_COUNT}"
if [ "${CRITICAL_COUNT}" -gt "0" ]; then
echo "[!] KRİTİK ZAFİYETLER TESPİT EDİLDİ - Pipeline durduruluyor!"
exit 1
fi
echo "[+] Tarama tamamlandı, kritik bulgu yok."
exit 0
Performans Optimizasyonu
Büyük ağlarda tarama yavaş olabilir. Birkaç ince ayar:
# gvmd konfigürasyonu için /etc/default/gvmd dosyasını düzenle
GVMD_ARGS="--max-ips-per-target=65536 --max-email-attachment-size=0 --listen=127.0.0.1 --port=9390"
# ospd-openvas için performans ayarları
cat >> /etc/openvas/openvas.conf << EOF
# Paralel NVT sayısını artır (dikkatli kullanın)
max_hosts = 30
max_checks = 10
# Ağ zaman aşımı
checks_read_timeout = 120
EOF
sudo systemctl restart ospd-openvas gvmd
max_hosts değerini artırmak hızı artırır ama aynı zamanda hedef sistemlere yük bindirmeyi de artırır. Production ortamında bu değeri 5-10 arasında tutmanızı öneririm.
Log Takibi ve Sorun Giderme
# GVM servis logları
sudo journalctl -u gvmd -f
sudo journalctl -u ospd-openvas -f
sudo journalctl -u gsad -f
# OpenVAS'ın kendi log dosyaları
tail -f /var/log/gvm/gvmd.log
tail -f /var/log/gvm/openvas.log
# Yaygın sorun: Feed güncelleme başarısız
# Kontrol komutu:
sudo runuser -u _gvm -- gvmd --get-feeds | grep -E "(NVT|SCAP|CERT)"
# Socket izin sorunu yaşıyorsanız
ls -la /var/run/gvmd/
sudo chmod 660 /var/run/gvmd/gvmd.sock
sudo chown _gvm:_gvm /var/run/gvmd/gvmd.sock
Sonuç
OpenVAS, doğru kurulduğunda ve düzenli kullanıldığında gerçekten değer katan bir araç. Ama şunu açıkça söylemeliyim: Zafiyet taraması güvenliğin yalnızca bir parçası. Tarama yapıp raporu çekmeziseniz ve raporları okuyup aksiyon almazsanız, tüm bu kurulum çabası boşa gider.
Benim önerim şu: Önce iç ağınızda küçük bir scope ile başlayın. 10-20 sunucu. Raporları okuyun, ne çıkıyor görün, false positive’leri ayıklayın. Sonra kademeli olarak kapsamı genişletin. Aylık değil, haftalık tarama döngüsü oluşturun. Ve tarama sonuçlarını bir ticket sistemine (Jira, Redmine, ne kullanıyorsanız) bağlayın ki bulgular kaybolmasın.
Son olarak şunu hatırlatayım: OpenVAS’ı yalnızca kendi sistemlerinize veya yasal olarak izninizin olduğu sistemlere karşı kullanın. İzinsiz tarama hem etik değil hem de yasal açıdan ciddi sonuçlar doğurabilir. Güvenli taramalar.
