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.