📖 مقدمه: شناخت Splunk و مفاهیم لاگ
Splunk یک پلتفرم جامع برای جمعآوری، نمایهسازی (Indexing) و تحلیل دادههای ماشین (Machine Data) در مقیاس بزرگ است. برخلاف پایگاههای داده سنتی که نیازمند تعریف پیشینی طرح (Schema) هستند، Splunk عمدتاً از رویکرد Schema-on-the-Fly بهره میگیرد: بخش عمدهای از استخراج فیلدها هنگام جستجو (Search Time) انجام میشود، اگرچه برخی استخراجها نیز میتوانند در زمان ایندکس (Index Time) صورت پذیرند. این انعطافپذیری باعث میشود Splunk برای محیطهای چندمنبعی و نامتجانس مانند مراکز عملیات امنیت (SOC) ابزاری ایدهآل باشد.
خط لوله پردازش داده در Splunk از مراحل اصلی زیر تشکیل میشود:
- ورودی (Input): دریافت جریان داده از Forwarderها، پورتهای شبکه (مثلاً Syslog روی TCP/UDP)، اسکریپتها یا HTTP Event Collector (HEC).
- تجزیه (Parsing): شکستن جریان به رخدادهای منفرد، شناسایی sourcetype، استخراج زمان (Timestamp Extraction) و اعمال قوانین شکست خط (Line Breaking).
- نوعبندی (Typing): اعمال قوانین استخراج فیلد از پیش تعریفشده (مانند transforms.conf) برای غنیسازی رخدادها قبل از ذخیرهسازی.
- نمایهسازی (Indexing): ذخیرهسازی رخدادها در ساختار اختصاصی ایندکس (شامل bucketها با فایلهای فشرده داده خام و واژهنامههای بهینه) که جستجوهای بلادرنگ را ممکن میسازد.
- جستجو (Searching): بازیابی و تحلیل رخدادها با زبان SPL که قابلیت فیلتر، تجمیع، همبستگی و مصورسازی را فراهم میکند.
هسته جستجو در Splunk زبان خطلولهای SPL (Search Processing Language) است که مجموعه بزرگی از دستورات را برای کاوش، تبدیل و تحلیل دادهها در اختیار تحلیلگر قرار میدهد. با SPL میتوان پرسشهای پیچیده امنیتی را در میان میلیاردها رخداد در کسری از ثانیه پاسخ داد.
اما پیش از هر تحلیلی باید لاگ (Log) را به درستی شناخت. لاگ یک رکورد خودکار از رویدادهای سیستم است که توسط سیستمعاملها، برنامهها، تجهیزات شبکه (مانند فایروال FortiGate) و سایر مؤلفههای دیجیتال تولید میشود. هر رخداد لاگ استاندارد از چند مؤلفه کلیدی تشکیل شده است:
- Timestamp: زمان دقیق وقوع رویداد که مبنای تحلیلهای زمانی قرار میگیرد.
- Host: نام یا آدرس IP دستگاهی که رویداد را تولید کرده است.
- Source: منبعی که رخداد از آن خوانده شده است. این منبع میتواند یک فایل، یک پورت شبکه (TCP/UDP)، یک جریان HEC، یا حتی یک اسکریپت سفارشی باشد.
- Sourcetype: یک برچسب منطقی که قالب رویداد را مشخص میکند. تنظیم نادرست آن باعث تحلیلهای اشتباه میشود.
- _raw: محتوای اصلی رویداد به صورت متن خام، پیش از هرگونه استخراج.
لاگها در قالبهای متنوعی تولید میشوند: Syslog (RFC3164/RFC5424)، JSON، CSV، Key-Value (مانند FortiGate) و XML. اَدآنهای Splunk برای تجهیزات شناختهشده – از جمله FortiGate – فیلدهایی مانند srcip، dstip، action، service و ... را بهطور خودکار استخراج میکنند.
چالش بزرگ در محیطهای واقعی، ناهمگونی (Heterogeneity) لاگهاست. یک مفهوم واحد مانند «کشور مبدأ» ممکن است در FortiGate srccountry، در روتر Cisco source_country و در ابزاری دیگر country نامیده شود. بدون عادیسازی (Normalization) – شامل Field Aliases، Calculated Fields و یکسانسازی sourcetype – جستجوهای امنیتی ناقص میمانند.
در این پلیبوک، با استفاده از دادههای واقعی یک FortiGate 400F که از طریق اَدآن رسمی وارد Splunk شده، مفاهیم عادیسازی، Field Alias، فیلدهای محاسباتی و Workflow Actions را به صورت عملی فرا میگیریم.
🎓 بخش اول: مباحث تدریس
۱. عادیسازی (Normalization)
در مراکز عملیات امنیت (SOC)، لاگها از منابع مختلف با قالبهای متفاوت جمعآوری میشوند. عادیسازی یعنی یکسانسازی نام فیلدها، نوع مقادیر و ساختار دادهها تا تحلیل، جستجو و هشدارها سریعتر و دقیقتر اجرا شوند.
۲. نامهای مستعار فیلد (Field Aliases)
تعریف: نگاشتی از چند نام مختلف فیلد به یک نام واحد.
کاربرد: در سازمان ممکن است کشور مبدأ گاهی با country و گاهی با srccountry ظاهر شود. با تعریف Alias با نام src_country، همهی رویدادها تحت یک نام تحلیل میشوند.
اهمیت: بدون Alias، کوئری stats count by country تنها بخشی از دادهها را پوشش میدهد و باعث تحلیل ناقص میشود.
۳. فیلدهای محاسباتی (Calculated Fields)
تعریف: فیلدی که مستقیماً در لاگ خام وجود ندارد و با eval ساخته میشود.
مثال: total_bytes = sentbyte + rcvdbyte حجم کل ترافیک یک نشست را نشان میدهد.
۴. استخراج فیلد (Field Extraction)
تعریف: جداسازی فیلدهای معنیدار از متن خام رویداد (_raw).
اَدآن رسمی FortiGate بیشتر فیلدها را بهطور خودکار استخراج میکند. درک این فرآیند برای عیبیابی ضروری است.
۵. تغییر نام sourcetype (Source Type Renaming)
مسئله: ممکن است لاگهای یک دستگاه با sourcetype اشتباه یا قدیمی (مثلاً fortigate_old) ایندکس شده باشند.
راهکار موقت: eval sourcetype = "fortigate"
راهکار دائمی: تنظیم rename در فایل props.conf.
۶. کنشهای گردش کار (Workflow Actions)
تعریف: دکمهای قابل کلیک در نتایج جستجو که روی مقدار یک فیلد (مثلاً srcip) عملی مانند باز کردن URL خارجی را انجام میدهد.
مثال: جستجوی Whois با کلیک روی IP.
🚨 بخش دوم: سناریوی عملی
شرح مأموریت
شما تحلیلگر تیم امنیت هستید. مدیر متوجه افزایش ترافیک فورتیگیت ۴۰۰F شده، اما گزارشها ناقص است. بررسی اولیه نشان میدهد:
- برخی رویدادها با
sourcetype=fortigateو برخی باfortigate_oldایندکس شدهاند. - کشور مبدأ گاهی
countryو گاهیsrccountryنام دارد. - نیاز به محاسبه مجموع بایتهای هر نشست و امکان Whois سریع روی IPهای مشکوک دارید.
دادههای نمونه (فایل week1_fortigate.log)
2024-06-15 02:14:23 srcip=192.168.10.5 dstip=10.0.0.1 action=accept service=DNS srccountry="South Korea" ... sourcetype=fortigate 2024-06-15 02:14:25 srcip=10.10.10.99 dstip=10.0.0.1 action=timeout service=Email_PORT_587 srccountry="Iran" ... sourcetype=fortigate_old ... (حدود ۱۰۰ رخداد)📌 فایل کامل شامل ۱۰۰ رویداد با کشورهای مختلف و سه مقدار action است.
🧭 گامهای عملی
index=main sourcetype=fortigate OR sourcetype=fortigate_old | head 20
index=main (sourcetype=fortigate OR sourcetype=fortigate_old) | eval sourcetype = "fortigate"
Settings → Fields → Field aliases → New: src_country شامل country و srccountry.
... | eval total_bytes = sentbyte + rcvdbyte
... | stats count by src_country | sort - count
... | stats sum(total_bytes) as bytes_total by srcip | sort - bytes_total | head 5
... | stats count by src_country, action
Settings → Fields → Workflow actions: Whois_SrcIP با لینک https://who.is/whois-ip/ip-address/$srcip$
🎯 سه چالش ارزیابی
🕵️ چالش اول – تفسیر کوئری
کوئری زیر را تفسیر کنید و بگویید چرا src_country حیاتی است:
index=main sourcetype=fortigate | eval total_bytes = sentbyte + rcvdbyte | stats sum(total_bytes) as bytes, dc(dstip) as unique_dest by srcip, src_country | where bytes > 10000 AND unique_dest > 3 | sort - bytes
🛠️ چالش دوم – تغییر کوئری
درصد اتصالات timeout هر IP را محاسبه کنید و IPهایی با نسبت بالای ۵۰٪ و حداقل ۱۰ اتصال را نمایش دهید.
🧠 چالش سوم – پرسش مفهومی
چرا عدم تعریف Field Alias در محیطهای چنددستگاهی باعث تحلیل ناقص میشود؟ با مثال از سناریو توضیح دهید.
📅 برنامه تمرینی هفتگی – بر اساس همین پلیبوک
این برنامه برای ۵ روز کاری طراحی شده و فعالیتهای عملی مورد انتظار از هر دانشجو در طول هفته را مشخص میکند.
🗓️ شنبه – آشنایی با Splunk و لاگ FortiGate
⏱ ۳ ساعت
- مطالعه مقدمه پلیبوک
- ورود به Splunk و بارگذاری فایل لاگ
- اجرای
index=main sourcetype=fortigateو بررسی فیلدهای استخراجشده
🗓️ یکشنبه – عادیسازی Sourcetype و Field Alias
⏱ ۳ ساعت
- اجرای گامهای ۱ تا ۳ سناریو
- ساخت Field Alias با نام
src_country - تست با
stats count by src_country
🗓️ دوشنبه – فیلدهای محاسباتی و تحلیل ترافیک
⏱ ۳ ساعت
- اجرای گام ۴ و ۵ سناریو
- یافتن ۵ IP پرحجم و محاسبه میانگین ترافیک هر کشور
🗓️ سهشنبه – Workflow Actions و واکنش سریع
⏱ ۲.۵ ساعت
- ساخت Workflow Action برای Whois
- تست روی IPهای مشکوک و مستندسازی
🗓️ چهارشنبه – چالشهای سهگانه و ارزیابی
⏱ ۳ ساعت
- حل کتبی چالش اول و دوم
- پاسخ تحلیلی به چالش سوم
- مرور و رفع اشکال