OpenVAS ile Zafiyet Tarama ve Raporlama Rehberi

Ağ güvenliğinde en sık yapılan hatalardan biri, sistemi bir kez tarayıp “temiz” damgası vurmak ve bir daha bakmamaktır. Oysa zafiyetler her gün değişiyor, yeni CVE’ler yayınlanıyor, sistemler güncelleniyor ya da güncellenmeyip geride kalıyor. OpenVAS tam da bu döngüyü otomatize etmek, görünürlük kazandırmak ve raporlanabilir hale getirmek için var olan güçlü bir araç. Bu yazıda OpenVAS’ı sıfırdan kurarak gerçek bir ağ ortamında nasıl tarama yapacağınızı, sonuçları nasıl yorumlayacağınızı ve raporları nasıl anlamlı hale getireceğinizi adım adım ele alacağım.

OpenVAS Nedir ve Neden Kullanmalısınız

OpenVAS (Open Vulnerability Assessment System), Greenbone Networks tarafından geliştirilen ve açık kaynaklı olarak sunulan kapsamlı bir zafiyet tarama çerçevesidir. Arkasında on binlerce NVT (Network Vulnerability Test) barındırır ve bu testler sürekli güncellenir. Ticari alternatifi olan Nessus ile karşılaştırıldığında, kurumsal ortamlarda ücretsiz kullanılabilmesi ve özelleştirilebilir yapısı büyük avantaj sağlar.

Greenbone Community Edition (GCE) adıyla da bilinen bu yapı, aşağıdaki bileşenlerden oluşur:

  • GSA (Greenbone Security Assistant): Web tabanlı kullanıcı arayüzü
  • GVM (Greenbone Vulnerability Manager): Tarama motorunu yöneten servis katmanı
  • OpenVAS Scanner: Asıl taramayı gerçekleştiren motor
  • GVMD: Veri yönetimi ve raporlama için arka plan servisi
  • PostgreSQL: Tarama sonuçlarının saklandığı veritabanı

Bir pentest ekibinde ya da SOC ortamında OpenVAS’ı düzenli zafiyet yönetimi sürecine entegre ettiğinizde, manuel tarama yorgunluğundan kurtulur ve takip edilebilir bir süreç inşa edersiniz.

Kurulum: Ubuntu 22.04 Üzerinde GVM

Kurulumu Ubuntu 22.04 LTS üzerinde anlatacağım çünkü topluluk desteği en güçlü dağıtım bu. Minimum 8 GB RAM ve 40 GB disk alanı önerilir; NVT veritabanı oldukça büyük.

sudo apt update && sudo apt upgrade -y
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:mrazavi/gvm
sudo apt update
sudo apt install -y gvm

Kurulumdan sonra kurulum betiğini çalıştırarak tüm bileşenleri yapılandırın:

sudo gvm-setup

Bu betik çalışırken PostgreSQL veritabanını oluşturur, NVT feed’lerini indirir (bu işlem 20-30 dakika sürebilir), sertifikaları üretir ve servisleri başlatır. Betik tamamlandığında size admin şifresi verecek, bunu mutlaka not edin.

Kurulumun başarılı olup olmadığını kontrol etmek için:

sudo gvm-check-setup

Bu komut size eksik bileşenleri ve yapılandırma hatalarını listeler. Çıktıda “ERROR” görürseniz, komutun önerdiği düzeltmeleri uygulayın.

Servislerin durumunu kontrol edin:

sudo systemctl status gvmd
sudo systemctl status gsad
sudo systemctl status ospd-openvas

Web arayüzüne https://localhost:9392 adresinden erişebilirsiniz. Self-signed sertifika uyarısını geçin ve admin kullanıcısıyla giriş yapın.

Feed Güncellemesi ve Zamanlanmış Senkronizasyon

OpenVAS’ın değeri büyük ölçüde NVT feed’lerinin güncelliğine bağlıdır. Kurulum sonrası ilk güncellemeyi manuel yapmanız gerekebilir:

sudo runuser -u _gvm -- greenbone-nvt-sync
sudo runuser -u _gvm -- greenbone-feed-sync --type GVMD_DATA
sudo runuser -u _gvm -- greenbone-feed-sync --type SCAP
sudo runuser -u _gvm -- greenbone-feed-sync --type CERT

Bu işlemlerin ardından GVMD’yi yeniden başlatın:

sudo systemctl restart gvmd

Feed güncellemesini her gece otomatik olarak yapmak için cron job ekleyin:

sudo crontab -e -u _gvm

Açılan editöre şunu ekleyin:

0 2 * * * /usr/sbin/greenbone-nvt-sync >> /var/log/gvm/nvt-sync.log 2>&1
30 2 * * * /usr/sbin/greenbone-feed-sync --type SCAP >> /var/log/gvm/scap-sync.log 2>&1

İlk Tarama Konfigürasyonu

Web arayüzüne giriş yaptıktan sonra tarama yapmadan önce bazı temel yapılandırmaları tamamlamanız gerekiyor.

Hedef Tanımlama

Önce hedef sistemlerinizi tanımlayın. Configuration > Targets menüsüne gidin ve yeni hedef oluşturun. Bir kurumsal ortamda hedef olarak genellikle IP aralıkları kullanırsınız:

  • Sunucu segmenti: 192.168.10.0/24
  • DMZ: 10.0.0.1-10.0.0.50
  • Kritik sistemler: 192.168.10.1, 192.168.10.5, 192.168.10.10

Eğer SSH ya da SMB kimlik bilgileri eklemeyi planlıyorsanız, Credentials bölümünden önce bunları tanımlayın. Kimlik doğrulamalı taramalar çok daha derin sonuçlar verir; yerel kullanıcı hesapları, kurulu yazılım versiyonları ve yapılandırma hataları bu sayede tespit edilebilir.

Tarama Politikası Seçimi

OpenVAS birkaç hazır tarama politikası sunar:

  • Full and Fast: Genel kullanım için dengelenmiş seçenek, başlangıç noktanız bu olmalı
  • Full and Very Deep: Daha kapsamlı ama çok daha yavaş, üretim sistemlerinde dikkatli kullanın
  • Host Discovery: Sadece ağda hangi sistemlerin aktif olduğunu keşfeder
  • System Discovery: Aktif sistemlerin işletim sistemi ve servis bilgilerini toplar

Üretim ortamında ilk taramayı mesai dışı saatlerde yapmayı ihmal etmeyin. Bazı agresif testler servisleri geçici olarak etkileyebilir.

Komut Satırından Tarama: gvm-cli Kullanımı

Web arayüzü işleri kolaylaştırsa da otomasyon için gvm-cli vazgeçilmezdir. Kurulumu:

sudo apt install -y python3-gvm python3-pip
pip3 install gvm-tools

Bağlantı testi:

gvm-cli --gmp-username admin --gmp-password 'SifreNiz' socket --socketpath /run/gvmd/gvmd.sock --xml "<get_version/>"

Mevcut görevleri listeleyin:

gvm-cli --gmp-username admin --gmp-password 'SifreNiz' 
  socket --socketpath /run/gvmd/gvmd.sock 
  --xml "<get_tasks/>"

Yeni bir tarama görevi oluşturun ve başlatın (hedef ve config ID’lerini kendi ortamınızdaki değerlerle değiştirin):

gvm-cli --gmp-username admin --gmp-password 'SifreNiz' 
  socket --socketpath /run/gvmd/gvmd.sock 
  --xml "<create_task>
    <name>Haftalik Sunucu Taramasi</name>
    <target id='HEDEF-UUID-BURAYA'/>
    <config id='KONFIG-UUID-BURAYA'/>
    <scanner id='TARAYICI-UUID-BURAYA'/>
  </create_task>"

Python ile daha esnek bir otomasyon için GVM Python kütüphanesini kullanabilirsiniz:

#!/usr/bin/env python3
from gvm.connections import UnixSocketConnection
from gvm.protocols.gmp import Gmp
from gvm.transforms import EtreeTransform

connection = UnixSocketConnection(path='/run/gvmd/gvmd.sock')
transform = EtreeTransform()

with Gmp(connection, transform=transform) as gmp:
    gmp.authenticate('admin', 'SifreNiz')
    
    # Tüm görevleri listele
    tasks = gmp.get_tasks()
    for task in tasks.findall('task'):
        task_id = task.get('id')
        task_name = task.find('name').text
        status = task.find('status').text
        print(f"[{status}] {task_name} - ID: {task_id}")

Bu betiği cron’a ekleyerek haftalık tarama durumu raporları alabilirsiniz.

Kimlik Doğrulamalı Tarama: Gerçek Dünya Senaryosu

Bir kurumsal ortamda en değerli taramalar kimlik doğrulamalı olanlardır. Diyelim ki 30 Linux sunucunuzu yönetiyorsunuz ve bunların yamalı olup olmadığını kontrol etmek istiyorsunuz.

Önce SSH için ayrı bir servis hesabı oluşturun:

sudo useradd -m -s /bin/bash openvas-scanner
sudo passwd openvas-scanner
# Ya da SSH anahtar tabanlı kimlik doğrulama için:
sudo -u openvas-scanner ssh-keygen -t ed25519 -f /home/openvas-scanner/.ssh/id_ed25519 -N ""

Bu kullanıcıya sudo yetkisini kısıtlı şekilde verin:

sudo visudo
# Şunu ekleyin:
openvas-scanner ALL=(ALL) NOPASSWD: /usr/bin/dpkg, /usr/bin/rpm, /bin/cat /etc/*, /usr/bin/find

OpenVAS web arayüzünde Configuration > Credentials altında yeni SSH credential oluşturarak bu kullanıcının özel anahtarını yükleyin. Ardından hedef tanımlarken bu credential’ı ilişkilendirin.

Kimlik doğrulamalı tarama sonucunda göreceğiniz ekstra bilgiler şunlardır:

  • Kurulu paket versiyonları ve güvenlik açıkları
  • Yerel kullanıcı hesapları ve parola politikaları
  • Dosya sistemi izinleri
  • Çalışan servisler ve konfigürasyonları
  • Log dosyası analizleri

Tarama Sonuçlarının Yorumlanması

Tarama tamamlandığında sonuçlar CVSS (Common Vulnerability Scoring System) skoruna göre derecelendirilir:

  • Critical (9.0-10.0): Hemen aksiyon alınmalı, exploit edilebilir zafiyetler
  • High (7.0-8.9): Öncelikli yama gerektiren sorunlar
  • Medium (4.0-6.9): Planlı döngüde ele alınmalı
  • Low (0.1-3.9): Risk değerlendirmesi yapılarak yönetilmeli
  • Log: Zafiyet değil, bilgi niteliğinde bulgu

Gerçek bir senaryoda karşılaşacağınız tipik bulgular şunlardır:

  • OpenSSH eski versiyon: CVE bazlı açıklar, servis yeniden başlatılmadan yama uygulanamıyor
  • Apache/Nginx yanlış konfigürasyonu: Server banner bilgisi, dizin listeleme aktif
  • SSL/TLS zayıf cipher suite’leri: SWEET32, POODLE gibi eski açıklar
  • SMB imzalama devre dışı: Man-in-the-middle saldırılarına açık
  • Default credential’lar: Özellikle ağ cihazlarında kritik risk

Her bulgu için OpenVAS size CVE numarası, CVSS skoru, etkilenen komponent, çözüm önerisi ve referans bağlantıları sunar. Bu bilgileri ihmal etmeyin; özellikle “Solution” ve “References” kısmı aksiyon planı oluştururken çok değerlidir.

Otomatik Raporlama ve Entegrasyon

OpenVAS raporları XML, PDF, HTML ve CSV formatlarında dışa aktarabilir. Komut satırından rapor almak için:

#!/bin/bash
# Son tamamlanan taramanın raporunu PDF olarak indir

GVM_SOCKET="/run/gvmd/gvmd.sock"
GVM_USER="admin"
GVM_PASS="SifreNiz"
RAPOR_DIZIN="/opt/openvas-raporlar"
TARIH=$(date +%Y%m%d)

mkdir -p $RAPOR_DIZIN

# Rapor ID'sini al (son tarama)
RAPOR_ID=$(gvm-cli --gmp-username $GVM_USER 
  --gmp-password $GVM_PASS 
  socket --socketpath $GVM_SOCKET 
  --xml "<get_reports/>" | 
  python3 -c "
import sys
from xml.etree import ElementTree as ET
tree = ET.parse(sys.stdin)
reports = tree.findall('.//report')
if reports:
    print(reports[0].get('id'))
")

# PDF olarak dışa aktar
gvm-cli --gmp-username $GVM_USER 
  --gmp-password $GVM_PASS 
  socket --socketpath $GVM_SOCKET 
  --xml "<get_reports report_id='$RAPOR_ID' format_id='c402cc3e-b531-11e1-9163-406186ea4fc5'/>" 
  > $RAPOR_DIZIN/tarama-$TARIH.pdf

echo "Rapor kaydedildi: $RAPOR_DIZIN/tarama-$TARIH.pdf"

Bu betiği her tarama sonrası çalışacak şekilde otomatize edin. Raporları bir merkezi konumda saklayıp zaman içindeki trend değişimlerini takip etmek çok değerli bir pratik.

Tarama Performansını Optimize Etme

Büyük ağlarda tarama saatlerce sürebilir. Bunu yönetilebilir kılmak için birkaç öneri:

Tarayıcı ayarlarını optimize edin. /etc/openvas/openvas.conf dosyasını düzenleyin:

sudo nano /etc/openvas/openvas.conf

Şu değerleri gözden geçirin:

# Paralel tarama sayısı (RAM ve CPU'ya göre ayarlayın)
max_hosts = 20
max_checks = 4

# Zaman aşımı değerleri
timeout = 30

# Port tarama hızı
open_sock_max_attempts = 5
time_between_request = 0

Ağı segmentlere bölerek tarayın. Tüm ağı tek seferde değil, kritiklik sırasına göre segmentler halinde taramak hem sonuçları daha hızlı almanızı sağlar hem de ağ üzerindeki yükü azaltır.

Ayrıca zaten güvenli olduğunu bildiğiniz sistemler için false positive yönetimi yapın. OpenVAS “Override” özelliği sayesinde belirli bulgular için notlar ekleyebilir ya da önem seviyesini değiştirebilirsiniz.

False Positive Yönetimi

Zafiyet tarayıcılarının en büyük sorunu false positive oranıdır. OpenVAS bunu minimize etmek için iyi bir iş çıkarsa da sıfıra indiremez. Karşılaşacağınız yaygın false positive senaryolar:

  • Yamalı ama banner’ı güncellenmemiş servisler (Apache eski versiyon gösteriyor ama aslında backport yama uygulanmış)
  • Kompanzasyonu olan kontroller (firewall engellediği için ulaşılamayan servis açıklığı)
  • Özelleştirilmiş konfigürasyonlar (güvenlik için kasıtlı kapatılmış özellikler)

Bu durumları OpenVAS arayüzünden “Suppress Result” ya da “Add Note” ile kayıt altına alın. Bir yıl sonra neden bu bulgunun kabul edildiğini hatırlamak zorunda kalacaksınız; açıklama yazmayı ihmal etmeyin.

Ekip Süreçlerine Entegrasyon

OpenVAS’ı ticketing sisteminize entegre etmek uzun vadede çok değer katıyor. Basit bir örnek olarak, tarama sonuçlarını Jira ya da Gitlab Issues’a aktaracak bir Python betiği yazabilirsiniz:

#!/usr/bin/env python3
import requests
import json
from gvm.connections import UnixSocketConnection
from gvm.protocols.gmp import Gmp
from gvm.transforms import EtreeTransform

JIRA_URL = "https://jira.sirketiniz.com"
JIRA_USER = "openvas-bot"
JIRA_TOKEN = "jira-api-token-buraya"
PROJE_KEY = "SEC"
CVSS_ESIGI = 7.0  # Bu skorun üzerindeki bulgular için ticket aç

connection = UnixSocketConnection(path='/run/gvmd/gvmd.sock')

with Gmp(connection, transform=EtreeTransform()) as gmp:
    gmp.authenticate('admin', 'SifreNiz')
    results = gmp.get_results(filter_string=f'min_cvss_base={CVSS_ESIGI} rows=100')
    
    for result in results.findall('result'):
        name = result.find('name').text
        host = result.find('host').text
        severity = result.find('severity').text
        description = result.find('description').text
        
        ticket_data = {
            "fields": {
                "project": {"key": PROJE_KEY},
                "summary": f"[OpenVAS] {name} - {host}",
                "description": f"**CVSS Skoru:** {severity}nn{description}",
                "issuetype": {"name": "Bug"},
                "priority": {"name": "High" if float(severity) >= 9 else "Medium"}
            }
        }
        
        response = requests.post(
            f"{JIRA_URL}/rest/api/2/issue",
            headers={"Authorization": f"Bearer {JIRA_TOKEN}", "Content-Type": "application/json"},
            data=json.dumps(ticket_data)
        )
        
        if response.status_code == 201:
            print(f"Ticket oluşturuldu: {name} ({host})")

Bu yaklaşım sayesinde güvenlik ekibi tarama sonuçlarına bakmak zorunda kalmaz; kritik bulgular otomatik olarak ilgili ekiplere atanır.

Düzenli Tarama Takvimi ve Politikası

Tek seferlik tarama yapmak anlamsız. Bir zafiyet yönetimi olgunluk modeli için şu takvimi öneririm:

  • Günlük: Host discovery taraması, yeni sistemlerin ağa katılıp katılmadığını kontrol et
  • Haftalık: Kritik sistemler üzerinde hızlı tarama (High ve Critical bulgulara odaklı)
  • Aylık: Tüm ağ üzerinde kapsamlı tarama, trend raporu üret
  • Değişiklik sonrası: Yeni bir sistem devreye alındığında ya da büyük güncelleme yapıldığında anlık tarama

Her tarama döngüsünde önceki taramayla karşılaştırma yapın. “Delta report” özelliği sayesinde yeni ortaya çıkan bulgular ile kapatılan bulgular ayrı ayrı görülebilir. Bu, yamalamanızın gerçekten işe yarayıp yaramadığını doğrulamanın en iyi yolu.

Sonuç

OpenVAS, doğru yapılandırıldığında ve süreçlere entegre edildiğinde kurumunuzun zafiyet yönetimi olgunluğunu önemli ölçüde artıran güçlü bir araçtır. Ancak şunu unutmamak gerekiyor: Araç tek başına bir anlam ifade etmez. Tarama yapıp raporu çekmecede bırakmak, hiç tarama yapmamaktan pek farkı yoktur.

Önemli olan bulguları önceliklendirmek, aksiyon almak, yamalamanın etkisini doğrulamak ve bu döngüyü sürdürülebilir kılmaktır. Feed güncellemelerini otomatize edin, taramaları düzenli tutun, false positive’leri kayıt altına alın ve bulguları ticketing sisteminize bağlayın. Bu alışkanlıkları oturttuğunuzda OpenVAS sizi gerçek bir saldırı olmadan önce uyaran güvenilir bir erken uyarı sistemine dönüşür.

Başlangıç için tüm ağı kapsamlı taramak yerine en kritik 10 sunucunuzdan başlayın. Süreci öğrenin, çıktıları anlayın, ekibinizin güvenini kazanın. Sonra ağı genişletin. Küçük başlayıp büyümeyi başaran zafiyet yönetimi programları, tüm ağı birden kavramaya çalışıp çöküp giden programlardan çok daha değerli.

Bir yanıt yazın

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