Skip to content
Siber Vatan

Wazuh ve YARA ile Zararlı Tespit ve Karantina

Berra Söyler · @berriesyl

Wazuh ve YARA birlikte kullanıldığında yeni veya değişen dosyalar event-driven olarak taranabilir. Bu çalışmada Wazuh File Integrity Monitoring (FIM) ile değişikliği yakalıyor, Active Response üzerinden YARA taramasını başlatıyor, sonucu alerta dönüştürüyor ve pozitif eşleşen dosyayı kontrollü bir dizine taşıyoruz.

Wazuh FIM, YARA taraması ve karantina akışı

Bileşenler

BileşenGörevi
Wazuh FIMİzlenen dizindeki dosya ekleme ve değişikliklerini algılar
Wazuh Active ResponseBelirli bir rule eşleştiğinde endpoint üzerinde script çalıştırır
YARADosyayı tanımlı metin veya binary kalıplarıyla eşleştirir
Decoder ve local rulesYARA çıktısını parse eder ve alerta dönüştürür
Karantina diziniYARA rule'u ile eşleşen dosyayı normal çalışma yolundan ayırır

1. Endpoint Hazırlığı

Ubuntu üzerinde Wazuh agent'ın kurulu ve manager'a bağlı olduğu bir lab kullanıyoruz. Gerekli paketleri kurup çalışma dizinlerini hazırlıyoruz:

bash
sudo apt update
sudo apt install -y yara jq

sudo install -d -m 0750 /tmp/yara/rules
sudo install -d -m 0750 /tmp/yara/malware
sudo install -d -m 0700 /var/ossec/quarantine

yara --version

YARA rule'larını sürümlüyor, imza ve hash değerlerini doğruluyoruz.

Zararsız test rule'u

Akışı gerçek zararlı örnek indirmeden sınamak için yalnızca belirli bir test işaretini arayan local bir YARA rule'u kullanıyoruz:

text
rule Altay_Yara_Lab_Test
{
    meta:
        description = "Wazuh-YARA entegrasyonu icin zararsiz test kurali"
        author = "Altay"

    strings:
        $marker = "ALTAY_YARA_TEST_2026" ascii wide

    condition:
        $marker
}

Rule'u /tmp/yara/rules/altay-lab.yar olarak kaydedip syntax'ı doğruluyoruz:

bash
sudo yara -w /tmp/yara/rules/altay-lab.yar /dev/null

2. FIM Event'ini Active Response'a Bağlama

Wazuh agent üzerindeki /var/ossec/etc/ossec.conf dosyasının <syscheck> bölümüne izleyeceğimiz dizini ekliyoruz:

xml
<directories realtime="yes">/tmp/yara/malware</directories>

Wazuh agent ossec.conf dosyasında gerçek zamanlı FIM dizini

Ardından agent'ı yeniden başlatıyoruz:

bash
sudo systemctl restart wazuh-agent

Manager üzerindeki /var/ossec/etc/rules/local_rules.xml dosyasına lab dizinini izleyen iki local rule ekliyoruz:

xml
<group name="syscheck,">
  <rule id="100300" level="7">
    <if_sid>550</if_sid>
    <field name="file" type="pcre2">^/tmp/yara/malware/</field>
    <description>File modified in /tmp/yara/malware.</description>
  </rule>

  <rule id="100301" level="7">
    <if_sid>554</if_sid>
    <field name="file" type="pcre2">^/tmp/yara/malware/</field>
    <description>File added to /tmp/yara/malware.</description>
  </rule>
</group>

FIM değişikliklerini yakalayan Wazuh local rules

Rule ID'lerin başka local rule'larla çakışmadığını kontrol ediyoruz. 100300 veya 100301 zaten kullanılıyorsa boş bir custom rule aralığı seçiyoruz.

3. YARA Active Response Betiği

Aşağıdaki betik Wazuh'un gönderdiği JSON içinden dosya yolunu ve YARA parametrelerini alır. Dosyanın yalnızca lab dizini altında olduğunu doğrular, YARA'yı çalıştırır ve eşleşme varsa dosyayı root erişimli karantina dizinine taşır.

Betiği /var/ossec/active-response/bin/yara.sh yolunda oluşturuyoruz:

bash
#!/usr/bin/env bash
set -u

LOG_FILE="/var/ossec/logs/active-responses.log"
QUARANTINE_PATH="/var/ossec/quarantine"
MONITORED_PREFIX="/tmp/yara/malware/"

read -r INPUT_JSON

YARA_PATH=$(jq -er '.parameters.extra_args[1]' <<<"$INPUT_JSON") || exit 1
YARA_RULES=$(jq -er '.parameters.extra_args[3]' <<<"$INPUT_JSON") || exit 1
FILENAME=$(jq -er '.parameters.alert.syscheck.path' <<<"$INPUT_JSON") || exit 1

case "$FILENAME" in
  "$MONITORED_PREFIX"*) ;;
  *)
    printf 'wazuh-yara: ERROR - Path outside monitored directory: %s\n' \
      "$FILENAME" >>"$LOG_FILE"
    exit 1
    ;;
esac

if [[ ! -x "$YARA_PATH/yara" || ! -r "$YARA_RULES" || ! -f "$FILENAME" ]]; then
  printf 'wazuh-yara: ERROR - Invalid executable, rules, or target file.\n' \
    >>"$LOG_FILE"
  exit 1
fi

# Yazımı süren dosyanın boyutu sabitlenene kadar en fazla 10 saniye bekle.
previous_size=-1
for _ in {1..10}; do
  current_size=$(stat -c '%s' -- "$FILENAME") || exit 1
  [[ "$current_size" == "$previous_size" ]] && break
  previous_size="$current_size"
  sleep 1
done

yara_output=$("$YARA_PATH/yara" -w -r "$YARA_RULES" "$FILENAME" 2>&1)
yara_status=$?

if (( yara_status > 1 )); then
  printf 'wazuh-yara: ERROR - Scan failed: %s\n' "$yara_output" >>"$LOG_FILE"
  exit "$yara_status"
fi

if [[ -n "$yara_output" ]]; then
  while IFS= read -r line; do
    printf 'wazuh-yara: INFO - Scan result: %s\n' "$line" >>"$LOG_FILE"
  done <<<"$yara_output"

  install -d -m 0700 "$QUARANTINE_PATH"
  destination="$QUARANTINE_PATH/$(date -u +%Y%m%dT%H%M%SZ)-$(basename -- "$FILENAME")"
  mv -- "$FILENAME" "$destination"
  chmod 000 "$destination"
  printf 'wazuh-yara: INFO - File quarantined: %s -> %s\n' \
    "$FILENAME" "$destination" >>"$LOG_FILE"
fi

exit 0

Betik izinlerini ayarlıyoruz:

bash
sudo chown root:wazuh /var/ossec/active-response/bin/yara.sh
sudo chmod 750 /var/ossec/active-response/bin/yara.sh

4. Manager Active Response Yapılandırması

Wazuh manager üzerindeki /var/ossec/etc/ossec.conf dosyasına komut ve onu çalıştıracak Rule ID'leri ekliyoruz:

xml
<command>
  <name>yara_linux</name>
  <executable>yara.sh</executable>
  <extra_args>-yara_path /usr/bin -yara_rules /tmp/yara/rules/altay-lab.yar</extra_args>
  <timeout_allowed>no</timeout_allowed>
</command>

<active-response>
  <command>yara_linux</command>
  <location>local</location>
  <rules_id>100300,100301</rules_id>
</active-response>

YARA betiğini çağıran Wazuh Active Response yapılandırması

location değerini local vererek komutun olayı üreten agent üzerinde çalışmasını sağlıyoruz.

5. Decoder ve Alert Kuralı

Manager üzerindeki /var/ossec/etc/decoders/local_decoder.xml dosyasına şu decoder'ları ekliyoruz:

xml
<decoder name="yara_decoder">
  <prematch>wazuh-yara:</prematch>
</decoder>

<decoder name="yara_decoder1">
  <parent>yara_decoder</parent>
  <regex>wazuh-yara: (\S+) - Scan result: (\S+) (\S+)</regex>
  <order>log_type, yara_rule, yara_scanned_file</order>
</decoder>

Manager üzerindeki /var/ossec/etc/rules/local_rules.xml dosyasına alert kurallarını ekliyoruz:

xml
<group name="yara,">
  <rule id="108000" level="0">
    <decoded_as>yara_decoder</decoded_as>
    <description>YARA grouping rule</description>
  </rule>

  <rule id="108001" level="12">
    <if_sid>108000</if_sid>
    <match type="pcre2">wazuh-yara: INFO - Scan result: </match>
    <description>File "$(yara_scanned_file)" matched YARA rule "$(yara_rule)".</description>
  </rule>
</group>

YARA çıktısını alerta dönüştüren Wazuh kuralı

Bu basit decoder boşluk içermeyen lab yolları için uygundur. Üretimde boşluk, Unicode ve farklı YARA çıktı biçimleri içeren gerçek loglarla test edilerek regex ifadesini genişletiyoruz.

Değişiklikleri doğrulayıp manager'ı yeniden başlatıyoruz:

bash
sudo /var/ossec/bin/wazuh-analysisd -t
sudo systemctl restart wazuh-manager

6. Zararsız Test

Gerçek zararlı indirmek yerine YARA rule'undaki işareti taşıyan plain text dosyası oluşturuyoruz:

bash
printf '%s\n' 'ALTAY_YARA_TEST_2026' | \
  sudo tee /tmp/yara/malware/altay-test.txt >/dev/null

Beklenen zincir:

  1. FIM yeni dosyayı görür ve event 100301 numaralı local rule ile eşleşir.
  2. Active Response, endpoint üzerindeki yara.sh betiğini çalıştırır.
  3. Dosya Altay_Yara_Lab_Test rule'u ile eşleşir.
  4. Sonuç active-responses.log dosyasına yazılır.
  5. Dosya /var/ossec/quarantine altına taşınır ve erişim izinleri kapatılır.
  6. Manager 108001 seviyesinde alert üretir.

Endpoint üzerinde:

bash
sudo tail -n 20 /var/ossec/logs/active-responses.log
sudo ls -la /var/ossec/quarantine

Test bittikten sonra karantinadaki dosyayı silmeden veya geri yüklemeden önce hash ve alert kaydını saklıyoruz.

Üretimde Uyguladığımız Kontroller

  • YARA kural paketini sürüm ve hash ile sabitliyoruz.
  • Kural güncellemelerini ayrı bir CI ve onay akışından geçiriyoruz.
  • Karantina dizinini ayrı disk kotası ve yalnızca root erişimiyle koruyoruz.
  • Yanlış pozitifler için allowlist ve geri yükleme adımlarını tanımlıyoruz.
  • Active Response olaylarını ayrıca izliyor, beklenmeyen betik çalıştırmalarını kritik alert olarak ele alıyoruz.
  • Kuralları önce gözlem, sonra manuel onay, en son kontrollü otomasyon aşamasında devreye alıyoruz.

Kaynakça

Wazuh ve YARA İçin Kaynakça