Veeam Loglarını Wazuh’a Entegre Etme Rehberi

1. Veeam Tarafında Syslog Ayarı

  1. Veeam Backup & Replication KonsoluOptionsEvent Forwarding
  2. Syslog Server olarak Wazuh Manager IP adresini ekleyin:
  • Port: 514
  • Protokol: UDP

ApplyOKKonfigürasyon değişikliği logu üretilir

2. Wazuh Manager’da Syslog Kabulü

Dosya Konumları
Kurulum TürüDosya Yolu
Normal/var/ossec/etc/ossec.conf
Docker/wazuh-docker/single-node/config/wazuh_cluster/wazuh_manager.conf
<remote> Bloğu Ekle
<remote>
  <connection>syslog</connection>
  <port>514</port>
  <protocol>udp</protocol>
  <allowed-ips>192.168.1.0/24</allowed-ips> <!-- Veeam subnet -->
</remote>
<global> Bloğunda JSON Çıktısı Aktif Et
<global>
  <jsonout_output>yes</jsonout_output>
  <alerts_log>yes</alerts_log>
  <logall>yes</logall>
  <logall_json>yes</logall_json>
</global>
Yeniden Başlat (Docker)
docker restart single-node-wazuh.manager-1

3. Logların Wazuh’a Gelip Gelmediğini Kontrol Et

docker exec -it single-node-wazuh.manager-1 bash
tail -f /var/ossec/logs/archives/archives.json

Test: Veeam’de Options → Apply yapın → Log düşmeli.

Veeam Event ID Listesi (Resmi Doküman)

Veeam’den gelen logları iki aşamada parse edeceğiz. Öncelikle decoder yazmamız gerekiyor. Sonrasında ise rule oluşturuacağız.

https://helpcenter.veeam.com/docs/backup/events/event_id_list.html?ver=120

Yukarıdaki linkte veeam’in gönderdiği logların event id’leri bulunuyor. Herhangi bir eventid’ye tıkladığınızda veeam’in göndereceği log’un bir örneğini görebiliyorsunuz. Örneğin, eventId’si 150 olan log’a bakalım.

İlgili sayfaya tıkladığınızda hangi parametlerin geleceğini görebiliyorsunuz. Aynı zamanda örnek bir log’da veriyor. Bu şekilde veeam üzerinden log üretmeye gerek kalmadan decoder ve rule setlerimizi oluşturabiliriz.
İşte instanceid’si 150 olan örnek log:

1 2025-03-20T14:36:09.190062+02:00 VBRSRV01 Veeam_MP - - [origin enterpriseId="31023"] [categoryId=0 instanceId=150 JobSessionID="c0d93abe-3adf-4397-b762-351b73acf7e1" JobID="c4415b30-de82-4403-8816-ea66636356e8" JobType="0" TaskSessionID="5005b373-ad69-4081-a50a-835387c66824" OibID="35503d1d-28f9-49ed-82d5-b81c33f9d978" OriginalOibID="35503d1d-28f9-49ed-82d5-b81c33f9d978" CreationTime="03/20/2025 12:34:03" Status="0" JobDescription="Created by Powershell at 03/20/2025 8:56:14 AM." SourceHostName="pdc01.tech.local" VmRef="vm-01" VmName="VM01" TransferredGb="12.731" Platform="0" IsRetry="False" SourceType="2" VbrHostName="vbrsrv01.tech.local" VbrVersion="12.3.1.1139" Version="1" Description="VM01 task has finished with 'Success' state."]

Decoder’ları cli üzerinden oluşturabileceğiniz gibi arayüzdende yapabilirsiniz. Bunun için Server management > Decoder yolunu takip edin. Açılan sayfada Manage decoders files butonuna tıklayın. Burada wazuh üzerinde oluşturulan defaultda gelen decoder xml’lerine görebilirisiniz. Veeam için ayrı bir decoder oluşturalım. Add new decoder file butonuna tıklayın.

Dosya adına istediğinizi verebilirsiniz. Şimdi instance id 150 için örnek bir decoder yazalım.

<decoder name="veeam-150">
  <prematch>instanceId=150</prematch>
  <regex type="pcre2">.*categoryId=(\d+).*instanceId=(\d+).*JobDescription=\\?"([^"]+)"\\?.*SourceHostName=\\?"([^"]+)"\\?.*VmName=\\?"([^"]+)"\\?.*Description=\\?"([^"]+)"\\?</regex>
  <order>veeam.categoryid, veeam.instanceid, veeam.vmip, veeam.esxiname, veeam.vmname, veeam.description</order>
</decoder>

<prematch>instanceId=150</prematch> bu kısım eğer bir logda intanceID=150 geçerse bu decoder’in çalışacağı anlamına geliyor.

<regex type="pcre2">.*categoryId=(\d+).*instanceId=(\d+).*JobDescription=\\?"([^"]+)"\\?.*SourceHostName=\\?"([^"]+)"\\?.*VmName=\\?"([^"]+)"\\?.*Description=\\?"([^"]+)"\\?</regex>

Burası ise asıl olayın döndüğü nokta. .* karakteri regex’de veya anlamına geliyor. (\d+) ise integer değerleri yakalıyor. "([^"]+)" kısmı string değerleri yakalarken başlarındaki \\? karakteri eğer logda \ varsa bunu kaçış karakteri olarak kullanıyor. Sonlarındaki \\? ise string ifadenin sonunda \ varsa bundan kaçıyor. Buralardaki ? işareti ise \ varsa kaç yoksa kaçma anlamında kullanıyoruz.
Önemli nokta bu ifadeleri sırayla yazmakta. Asıl log’a bakarsanız, categoryId’den sonra instanceId geliyor. Bizde regex’i buna göre yapıyoruz.

Order kısmında ise regex ile yakaladığımız değerlerin hangi alan adlarına atayacağımızı seçiyoruz. Bu alan adlarını sonrada rule’lar üzerinde kullanacağız. Yani burada istediğiniz gibi isimlendirme yapabilirisiniz.

Bir örnek daha yapalım. Örneğin instanceid’si 23010 olan veeam dokümantasyonunda yayınlanan örnek logu inceleyelim:

1 2025-03-23T22:42:03.314729+02:00 VBRSRV01 Veeam_MP - - [origin enterpriseId="31023"] [categoryId=0 instanceId=23010 JobID="71f36762-01bd-44a8-8422-29b9bc70183e" JobType="0" Platform="0" JobName="Backup Job 01" ChangesXML="<changes><object id="71f36762-01bd-44a8-8422-29b9bc70183e" /></changes>" UserName="TECH\user1" VbrHostName="vbrsrv01.tech.local" VbrVersion="12.3.1.1139" Version="1" Description="Backup job 'Backup Job 01' has been created."]

Bunun içinde decoder şöyle olmalı:

<decoder name="veeam-23010">
  <prematch>instanceId=23010</prematch>
  <regex type="pcre2">categoryId=(\d+).*instanceId=(\d+).*JobName=\\?"([^"]+)"\\?.*UserName=\\?"([^"]+)"\\?.*Description=\\?"([^"]+)"\\?</regex> 
  <order>veeam.categoryid, veeam.instanceid, veeam.jobname, veeam.username, veeam.Description</order>
</decoder>

Instance ID’si 190 için log şöyle:

1 2025-03-20T14:36:16.008569+02:00 VBRSRV01 Veeam_MP - - [origin enterpriseId="31023"] [categoryId=0 instanceId=190 JobSessionID="c0d93abe-3adf-4397-b762-351b73acf7e1" JobID="c4415b30-de82-4403-8816-ea66636356e8" JobResult="0" JobType="0" Platform="0" WillBeRetried="False" JobName="VMware Production servers backup" SourceType="2" VbrHostName="vbrsrv01.tech.local" VbrVersion="12.3.1.1139" Version="1" Description="Backup job 'VMware Production servers backup' finished with Success. All objects have been backed up successfully."]

Bunun decoder’ide şöyle olmalı:

<decoder name="veeam-190">
  <prematch>instanceId=190</prematch>
  <regex type="pcre2">categoryId=(\d+).*instanceId=(\d+).*JobName=\\?"([^"]+)"\\?.*Description=\\?"([^"]+)"\\?</regex> 
  <order>veeam.categoryid, veeam.instanceid, veeam.JobName, veeam.Description</order>
</decoder>

Decoder’leri yazdık, şimdi rule oluşturmamız gerekiyor. Rule’lar ile wazuhta decoder’lerin yakaladığı anlamlı alanları (instanceid gibi mesela) alarak bu verilere göre önem derecesi atayabilir, anlam verebilir, sınıflandırabilirisiniz.

Web üzerinden bunu yapabilmek için Server Management > Rules yolunu takip edin. Açılan sayfada Manage Rules Files tıklayın. Burada wazuh’ta kullanılan ve default gelen rule’ları görebilirsiniz. Add New Rules File‘a tıklayın ve yeni veeam için yeni rule’larımızı oluşturalım.

<group name="veeam">
  <rule id="300001" level="7">    
    <field name="veeam.instanceid">150</field>
    <description>Veeam Backup Task Success: VM "$(veeam.vmname)" on "$(veeam.esxiname)" completed successfully.</description>
    <group>backup_task_success,</group>
  </rule>  
  <rule id="300002" level="7">    
    <field name="veeam.instanceid">190</field>
    <description>Veeam Backup Job Success: VM "$(veeam.vmname)" on "$(veeam.esxiname)" completed successfully.</description>
    <group>backup_job_success,</group>
  </rule>

  <rule id="300003" level="7">    
    <field name="veeam.instanceid">23010</field>
    <description>Veeam Backup Job VM "$(veeam.jobname)" has created by "$(veeam.username)"</description>
    <group>backup_job_create,</group>
  </rule>
</group>

1. Kural ID 300001: Tekil Görev Başarısı

<rule id="300001" level="7"> 
  <field name="veeam.instanceid">150</field>
  <description>Veeam Backup Task Success: VM "$(veeam.vmname)" on "$(veeam.esxiname)" completed successfully.</description>
  <group>backup_task_success,</group>
</rule>
  • Amaç: veeam.instanceid değeri 150 olan logları yakalar. Bu ID, Veeam’de genellikle tek bir VM’e ait yedekleme görevinin başarıyla tamamlanmasını temsil eder.
  • Level (7): Orta seviyeli bir olaydır. Başarı olayları genellikle uyarı seviyesinde (Level 7) tutulur.
  • Description: Ayrıştırıcıdan gelen VM adı ($(veeam.vmname)) ve host adı ($(veeam.esxiname)) bilgilerini kullanarak kural açıklamasını dinamik olarak oluşturur.
  • Group: Olayı backup_task_success grubu altına etiketler.

2. Kural ID 300002: Genel İş Başarısı

<rule id="300002" level="7"> 
  <field name="veeam.instanceid">190</field>
  <description>Veeam Backup Job Success: VM "$(veeam.vmname)" on "$(veeam.esxiname)" completed successfully.</description>
  <group>backup_job_success,</group>
</rule>
  • Amaç: veeam.instanceid değeri 190 olan logları yakalar. Bu ID, Veeam’de büyük bir yedekleme işinin (Job) başarıyla tamamlandığını belirtir.
  • Level (7): Orta seviyeli başarı olayı.
  • Description: 300001 ile benzer şekilde dinamik VM ve host adı kullanır. Logun içeriğine göre, bu olay tüm işin tamamlanmasını, 300001 ise işin içindeki tek bir adımın tamamlanmasını temsil edebilir.

3. Kural ID 300003: Yeni İş Oluşturma

<rule id="300003" level="7"> 
  <field name="veeam.instanceid">23010</field>
  <description>Veeam Backup Job VM "$(veeam.jobname)" has created by "$(veeam.username)"</description>
  <group>backup_job_create,</group>
</rule>
  • Amaç: veeam.instanceid değeri 23010 olan logları yakalar. Bu ID, bir kullanıcının Veeam arayüzünden veya komut satırından yeni bir yedekleme işi oluşturduğunu gösterir.
  • Level (7): Yeni bir yapılandırma değişikliği olduğu için bilgi verici bir seviyedir.
  • Description: Hangi işin ($(veeam.jobname)) hangi kullanıcı ($(veeam.username)) tarafından oluşturulduğunu dinamik olarak belirtir. Bu, yetkilendirme ve izleme açısından önemli bir bilgidir.

Şimdi oluşturduğumuz bu kuralları nasıl test ederiz ? Bunun için arayüzden Server Management > Ruleset Test'e gidin.
İlk alana veeam üzerinden aldığınız örnek logu yapıştırın. Ve Test butonuna tıklayın.

Çıktı şöyle birşey olmalı:

**Phase 1: Completed pre-decoding.
    full event: '1 2025-03-20T14:36:09.190062+02:00 VBRSRV01 Veeam_MP - - [origin enterpriseId="31023"] [categoryId=0 instanceId=150 JobSessionID="c0d93abe-3adf-4397-b762-351b73acf7e1" JobID="c4415b30-de82-4403-8816-ea66636356e8" JobType="0" TaskSessionID="5005b373-ad69-4081-a50a-835387c66824" OibID="35503d1d-28f9-49ed-82d5-b81c33f9d978" OriginalOibID="35503d1d-28f9-49ed-82d5-b81c33f9d978" CreationTime="03/20/2025 12:34:03" Status="0" JobDescription="Created by Powershell at 03/20/2025 8:56:14 AM." SourceHostName="pdc01.tech.local" VmRef="vm-01" VmName="VM01" TransferredGb="12.731" Platform="0" IsRetry="False" SourceType="2" VbrHostName="vbrsrv01.tech.local" VbrVersion="12.3.1.1139" Version="1" Description="VM01 task has finished with 'Success' state."]'

**Phase 2: Completed decoding.
    name: 'veeam-150'
    veeam.categoryid: '0'
    veeam.description: 'VM01 task has finished with 'Success' state.'
    veeam.esxiname: 'pdc01.tech.local'
    veeam.instanceid: '150'
    veeam.vmip: 'Created by Powershell at 03/20/2025 8:56:14 AM.'
    veeam.vmname: 'VM01'

**Phase 3: Completed filtering (rules).
    id: '300001'
    level: '7'
    description: 'Veeam Backup Task Success: VM "VM01" on "pdc01.tech.local" completed successfully.'
    groups: '["veeambackup_task_success"]'
    firedtimes: '1'
    mail: 'false'
**Alert to be generated.

Peki ne anlama geliyor bunlar ?

bu test sonucu, sağlanan Veeam logunun Wazuh kurallar dizisi tarafından başarıyla çözüldüğünü, ayrıştırıldığını ve kritik bir kuralı tetiklediğini göstermektedir.

1. Aşama: Ön Çözümleme (Phase 1: Completed pre-decoding)

Wazuh, logu ham biçimde okur. Bu aşamada, logun kaynağı ve ilk yapısal bilgileri belirlenir.

  • full event: Olayın, Wazuh tarafından okunan orijinal ham metnidir. Log, Syslog benzeri bir formattadır ve sunucu adı (VBRSRV01), zaman damgası ve anahtar-değer (key=value) çiftlerinden oluşan Veeam verilerini içerir.

2. Aşama: Çözümleme (Phase 2: Completed decoding)

Bu aşamada, özel olarak tanımladığınız veeam-150 çözücüsü (decoder) devreye girer ve logdaki spesifik alanları ayırır.

  • name: 'veeam-150': Logun, sizin özel olarak tanımladığınız çözücü tarafından başarıyla işlendiğini gösterir.
  • Ayrıştırılan Alanlar: Regex’inizdeki yakalama grupları, <order> etiketi ile atanan alan adlarına atanmıştır:
    • veeam.instanceid: '150'
    • veeam.vmname: 'VM01'
    • veeam.esxiname: 'pdc01.tech.local' (Bu, logdaki SourceHostName değeridir.)

3. Aşama: Kural Filtreleme (Phase 3: Completed filtering (rules))

Çözümleme aşamasından gelen ayrıştırılmış veriler, tanımlanan kurallarla eşleştirilir.

  • id: '300001': Log, kurallar dizinizdeki ID 300001 ile eşleşmiştir. Bu, logun veeam.instanceid: 150 koşulunu sağladığı anlamına gelir.
  • level: '7': Kural, olaya Seviye 7 (Uyarı/Başarı) önem derecesini atamıştır.
  • description: 'Veeam Backup Task Success: VM "VM01" on "pdc01.tech.local" completed successfully.': Kural, dinamik değişkenleri ($(veeam.vmname), $(veeam.esxiname)) kullanarak olayın ne olduğunu açıkça belirtmiştir.
  • groups: '["veeambackup_task_success"]': Olay, yedekleme görevi başarısı kategorisi altında etiketlenmiştir.
  • Alert to be generated.: Sonuç, bu olayın Wazuh konsolunda bir alarm olarak listeleneceği ve kural ayarlarına bağlı olarak bildirim gönderilebileceği anlamına gelir.

Bu şekilde veeam için ilgili logları wazuh üzerinde parse edebilirsiniz.

Leave a Reply

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