CyberFlow Logo CyberFlow BLOG
Soc L3 Cloud Security

Sigma Kurallarını ML ile Otomatik Üretme

✍️ Ahmet BİRKAN 📂 Soc L3 Cloud Security

Sigma Kurallarını ML ile Otomatik Üretme konusunu SOC L3 - İleri Tehdit Avcılığı - Veri Madenciliği ve Modelleme baglaminda blog formatinda ogrenin. Temel akis, kavram eslestirmeleri ve analiz mantigi tek bir yapida birlestirildi.

Sigma Kurallarını ML ile Otomatik Üretme

Sigma kuralları platform bağımsız SIEM tespit kurallarıdır. YAML formatında yazılır ve sigmac aracıyla Splunk, Elastic, QRadar gibi SIEM'lere dönüştürülür. Temel Sigma kural yapısı ve Python ile oluşturma: import yaml import uuid from datetime import datetime def create_sigma_rule(title, description, logsource, detection, mitre_tags, level='high'): rule = { 'title': title, 'id': str(uuid.uuid4()), 'status': 'experimental', 'description': description, 'references': [], 'author': 'SOC L3 Auto-Generator', 'date': datetime.now().strftime('%Y/%m/%d'), 'modified': datetime.now().strftime('%Y/%m/%d'), 'tags': [f'attack.{t}' for t in mitre_tags], 'logsource': logsource, 'detection': detection, 'falsepositives': ['Legitimate admin activity'], 'level': level } rule = create_sigma_rule( title='Suspicious PowerShell Encoded Command Execution', description='Detects PowerShell execution with encoded command from Office applications', logsource={'category': 'process_creation', 'product': 'windows'}, detection={ 'selection': { 'Image|endswith': ['\powershell.exe','\pwsh.exe'], 'CommandLine|contains': ['-EncodedCommand','-enc ','-e '] }, 'parent_filter': {'ParentImage|contains': ['winword','excel','outlook','chrome']}, 'condition': 'selection and parent_filter' }, mitre_tags=['execution','t1059.001'], level='critical' ) print(rule)

Giris ve Temel Akis

Sigma kuralları platform bağımsız SIEM tespit kurallarıdır. YAML formatında yazılır ve sigmac aracıyla Splunk, Elastic, QRadar gibi SIEM'lere dönüştürülür. Temel Sigma kural yapısı ve Python ile oluşturma: import yaml import uuid from datetime import datetime def create_sigma_rule(title, description, logsource, detection, mitre_tags, level='high'): rule = { 'title': title, 'id': str(uuid.uuid4()), 'status': 'experimental', 'description': description, 'references': [], 'author': 'SOC L3 Auto-Generator', 'date': datetime.now().strftime('%Y/%m/%d'), 'modified': datetime.now().strftime('%Y/%m/%d'), 'tags': [f'attack.{t}' for t in mitre_tags], 'logsource': logsource, 'detection': detection, 'falsepositives': ['Legitimate admin activity'], 'level': level } rule = create_sigma_rule( title='Suspicious PowerShell Encoded Command Execution', description='Detects PowerShell execution with encoded command from Office applications', logsource={'category': 'process_creation', 'product': 'windows'}, detection={ 'selection': { 'Image|endswith': ['\powershell.exe','\pwsh.exe'], 'CommandLine|contains': ['-EncodedCommand','-enc ','-e '] }, 'parent_filter': {'ParentImage|contains': ['winword','excel','outlook','chrome']}, 'condition': 'selection and parent_filter' }, mitre_tags=['execution','t1059.001'], level='critical' ) print(rule)

Bu bölümün pratik akışı şu sırayla ilerler:

  • rule = {'title': title, 'id': str(uuid.uuid4()), 'status': 'experimental'}
  • rule['tags'] = [f'attack.{t}' for t in mitre_tags]
  • rule['logsource'] = {'category': 'process_creation', 'product': 'windows'}
  • rule['detection'] = {'selection': {'Image|endswith': ['\powershell.exe'], 'CommandLine|contains': ['-EncodedCommand']}, 'condition': 'selection'}
  • rule['falsepositives'] = ['Legitimate admin activity']
  • rule['level'] = level
  • return yaml.dump(rule, default_flow_style=False, allow_unicode=True)

Temel Kavram Eslesmeleri

Sigma kural bileşenleri her birinin spesifik bir rolü olan hiyerarşik yapıya sahiptir. Kural kalitesi bu bileşenlerin doğru tanımlanmasına bağlıdır. Örnek kural anatomisi: - logsource: hangi log kaynağından ve hangi üründen - detection: selection, filter ve condition bloklarından oluşur - condition: selection AND NOT filter_legitmate - falsepositives: bilinen FP kaynakları - level: informational, low, medium, high, critical

  • logsource: Hangi log kategorisi ve ürünün hedeflendiğini belirtir
  • detection.condition: Selection ve filter bloklarını mantıksal birleştirir
  • falsepositives: Bilinen FP kaynaklarını dokümante eder
  • level: Alarmın aciliyet ve öncelik seviyesini belirler

Ilk Cekirdek Kavram

Bu bölümde öne çıkan çekirdek kavram export_text olarak verilir. ML ile Sigma kural üretimi için önce pozitif (saldırı) ve negatif (normal) örnekler toplanır. Decision Tree modelinin karar dalları Sigma detection bloğuna dönüştürülür: import pandas as pd from sklearn.tree import DecisionTreeClassifier, export_text from sklearn.preprocessing import LabelEncoder import numpy as np features = ['parent_process','child_process','has_network','has_file_write','cmd_len','cmd_entropy'] X = df[features].copy() le_parent = LabelEncoder() le_child = LabelEncoder() X['parent_process'] = le_parent.fit_transform(X['parent_process'].fillna('unknown')) X['child_process'] = le_child.fit_transform(X['child_process'].fillna('unknown')) y = df['is_malicious'] model = DecisionTreeClassifier( max_depth=4, min_samples_leaf=10, class_weight='balanced', random_state=42 ) model.fit(X, y) tree_rules = export_text(model, feature_names=features) print('Decision Tree Kuralları:') print(tree_rules) print(f'\nModel Accuracy: {model.score(X, y):.3f}')

Arac, Komut veya Inceleme Akisi

Decision Tree karar dallarını otomatik olarak Sigma YAML formatına dönüştüren parser. ML modelinden kural üretme: import yaml import uuid from sklearn.tree import _tree def tree_to_sigma_rules(model, feature_names, class_names, le_dict, min_samples=10): rules = [] def recurse(node, conditions): if tree.feature[node] == _tree.TREE_UNDEFINED: if malicious_ratio > 0.8 and tree.n_node_samples[node] >= min_samples: detection = {} for feat, op, val in conditions: if feat in le_dict: decoded_val = le_dict[feat].inverse_transform([int(val)])[0] detection[feat] = decoded_val else: detection[feat] = float(val) rules.append({ 'id': str(uuid.uuid4()), 'confidence': round(malicious_ratio, 3), 'samples': int(tree.n_node_samples[node]), 'detection': detection }) return feat = feature_names[tree.feature[node]] threshold = tree.threshold[node] le_dict = {'parent_process': le_parent, 'child_process': le_child} rules = tree_to_sigma_rules(model, features, ['benign','malicious'], le_dict) print(f'Üretilen kural sayısı: {len(rules)}') for r in rules[:3]: print(yaml.dump(r, allow_unicode=True))

Bu bölümün pratik akışı şu sırayla ilerler:

  • tree = model.tree_
  • def recurse(node, conditions): if tree.feature[node] == _tree.TREE_UNDEFINED:
  • malicious_ratio = tree.value[node][0][1] / tree.value[node][0].sum()
  • if malicious_ratio > 0.8 and tree.n_node_samples[node] >= min_samples: rules.append({'detection': detection})
  • recurse(tree.children_left[node], conditions + [(feat,'<=',threshold)])
  • recurse(tree.children_right[node], conditions + [(feat,'>',threshold)])
  • recurse(0, [])
  • return rules

Kanit ve Bilesen Iliskileri

Sigma kurallarının SIEM'e dönüştürülmesi sigmac ve sigma-cli araçlarıyla yapılır. Her hedef SIEM için farklı backend kullanılır. Örnek sigma-cli kullanımı: sigma convert -t splunk rule.yml sigma convert -t elasticsearch rule.yml sigma convert -t qradar rule.yml sigma convert -t microsoft365defender rule.yml

  • splunk backend: SPL sorgusu üretir — index ve sourcetype filtreli
  • elasticsearch backend: Lucene veya EQL sorgusu üretir
  • qradar backend: AQL sorgusu üretir — IBM QRadar için
  • microsoft365defender: KQL sorgusu üretir — Sentinel ve MDE için

Ikincil Odak Noktasi

Bu bölümde öne çıkan çekirdek kavram recall olarak verilir. Sigma kural kalitesini otomatik değerlendiren pipeline. FP oranı, kapsam ve MITRE etiket doğruluğunu ölçme: import yaml import pandas as pd from pathlib import Path def evaluate_sigma_rule(rule_path, df_benign, df_malicious): with open(rule_path) as f: rule = yaml.safe_load(f) detection = rule.get('detection', {}) selection = detection.get('selection', {}) def matches_selection(row, selection): for field, value in selection.items(): field_clean = field.split('|')[0] modifier = field.split('|')[1] if '|' in field else 'equals' row_val = str(row.get(field_clean, '')).lower() if isinstance(value, list): vals = [str(v).lower() for v in value] if modifier == 'contains': if not any(v in row_val for v in vals): return False elif modifier == 'endswith': if not any(row_val.endswith(v) for v in vals): return False elif modifier == 'contains': if str(value).lower() not in row_val: return False return True tp = sum(1 for _, row in df_malicious.iterrows() if matches_selection(row, selection)) fp = sum(1 for _, row in df_benign.iterrows() if matches_selection(row, selection)) recall = tp / len(df_malicious) if len(df_malicious) > 0 else 0 precision = tp / (tp + fp) if (tp + fp) > 0 else 0 return {'rule': rule['title'], 'TP': tp, 'FP': fp, 'precision': round(precision,3), 'recall': round(recall,3)} result = evaluate_sigma_rule('rules/ps_encoded.yml', df_benign, df_malicious) print(result)

Operasyonel Dogrulama ve Raporlama

LLM (Large Language Model) API ile threat intel raporundan otomatik Sigma kural üretme. OpenAI veya yerel model ile NLP tabanlı kural sentezi: import openai import yaml import json client = openai.OpenAI(api_key='your_api_key') def generate_sigma_from_report(threat_report_text): prompt = f""" Aşağıdaki tehdit istihbarat raporunu analiz et ve MITRE ATT&CK etiketli geçerli bir Sigma YAML kuralı üret. Kural şu alanları içermeli: title, id (uuid4), status, description, tags, logsource, detection, falsepositives, level Yalnızca geçerli YAML döndür, başka açıklama ekleme. Rapor: {threat_report_text} """ response = client.chat.completions.create( model='gpt-4', messages=[{'role':'user','content':prompt}], temperature=0.1 ) raw_yaml = response.choices[0].message.content raw_yaml = raw_yaml.replace('yaml','').replace('','').strip() try: rule = yaml.safe_load(raw_yaml) print(f'Kural üretildi: {rule["title"]}') print(f'MITRE tags: {rule.get("tags","")}') return rule except yaml.YAMLError as e: print(f'YAML parse hatası: {e}') return None report = open('apt29_report.txt').read() rule = generate_sigma_from_report(report) if rule: with open(f'rules/auto_{rule["id"][:8]}.yml','w') as f: yaml.dump(rule, f, allow_unicode=True)

Bu bölümün pratik akışı şu sırayla ilerler:

  • replace

Cikti ve Kullanım Amaci

Otomatik üretilen Sigma kurallarının production'a alınması için kalite kapısı (quality gate) süreci tanımlanmalıdır. Her adım kuralın güvenilirliğini artırır. Örnek CI/CD pipeline: ML model → Kural üret → Syntax validate → FP test → Peer review → Staging SIEM → Production

  • Syntax validasyon: sigma-cli check ile YAML yapısını doğrula
  • FP testi: Benign log seti üzerinde çalıştır ve FP oranını ölç
  • Peer review: İkinci analist kural mantığını ve MITRE etiketini doğrular
  • Staging SIEM: Production öncesi 1 hafta gerçek veriyle gözlemle

Son Kavram ve Cikis

Bu bölümde öne çıkan çekirdek kavram secrets olarak verilir. Sigma kural deposunu Git ile yönetme ve otomatik SIEM'e deploy etme. GitHub Actions ile CI/CD pipeline: # .github/workflows/sigma_deploy.yml name: Sigma Rule Deploy on: push: paths: ['rules//*.yml'] branches: [main] jobs: validate_and_deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Install sigma-cli run: pip install sigma-cli - name: Validate rules run: | for rule in rules//*.yml; do sigma check $rule || exit 1 done - name: Convert to Splunk run: | sigma convert -t splunk rules/ > splunk_rules.conf - name: Deploy to Splunk env: SPLUNK_TOKEN: ${{ secrets.SPLUNK_TOKEN }} run: | curl -X POST https://splunk:8089/services/saved/searches \ -H "Authorization: Bearer $SPLUNK_TOKEN" \ --data-urlencode @splunk_rules.conf GitHub Actions'ta gizli değerlere ${{ secrets.SPLUNK_TOKEN }} sözdizimi ile erişilir.

Bu Egitimden Ne Kazanirsiniz?

Bu icerik, Sigma Kurallarını ML ile Otomatik Üretme konusunu SOC L3 - İleri Tehdit Avcılığı - Veri Madenciliği ve Modelleme baglaminda parcali degil, butunlu bir ogrenme akisina donusturur. Yalnizca kavramlari ezberlemek yerine surec sirasini, bilesenler arasi iliskiyi ve hangi kanitin neden onemli oldugunu kavramayi hedefler.

Ozet

Bu ders kapsaminda one cikan basliklar: logsource, detection.condition, falsepositives, level, splunk backend, elasticsearch backend, qradar backend, microsoft365defender, Syntax validasyon, FP testi. Egitimin mantigi; once temel akis kurmak, sonra eslestirme ve kavram netlestirme yapmak, en sonda ise bulguyu operasyonel bir sonuca baglamaktir.