اتصال Threat Intelligence در Splunk ES به پورتال شاخصهای آلودگی AFTA: راهنمای جامع و عملیاتی
در عصر امنیت سایبری مدرن، تشخیص تهدیدهای شبکهای و پاسخ سریع به آنها به منابع دقیق و قابل اعتماد نیاز دارد. یکی از منابع اصلی برای شناسایی حملات و نفوذها، شاخصهای آلودگی (Indicators of Compromise یا IOC) هستند. این شاخصها شامل IPها، دامنهها، URLها و هشهای فایل هستند که توسط مراکز ملی و سازمانهای معتبر منتشر میشوند.
پورتال شاخصهای آلودگی AFTA یک منبع رسمی و قابل اعتماد در ایران است که مجموعهای از شاخصهای آلودگی شبکه را ارائه میدهد. اتصال این منابع به Splunk Enterprise Security (ES) به تیمهای امنیتی امکان میدهد دادههای تهدید را به صورت خودکار وارد سیستم کرده و با دادههای موجود correlation و تحلیل کنند.
1. آمادهسازی منبع داده
فایل شاخصهای آلودگی AFTA به شکل زیر است:
94.182.152.203
73.6.159.60
188.121.104.31
5.201.161.134
87.107.79.83
94.182.152.196
94.182.152.198
46.209.152.14
179.43.125.236
185.206.231.145
193.151.142.159
193.151.149.228
37.32.24.201
84.47.176.115
ویژگیهای فایل:
- هر خط تنها یک IP است.
- فاقد header و توضیحات اضافی است.
- متن ساده و line-delimited دارد.
این ساختار ساده اجازه میدهد دادهها به راحتی در Splunk ES ingest شوند، مشروط بر اینکه parser و فیلدها به درستی تنظیم شوند.
2. ایجاد Threat Intelligence Source در Splunk ES

برای افزودن TI feed:
- مسیر UI :
- در Splunk ES 7.X
- Configure → Data Enrichment → Threat Intelligence Downloads → New Threat Intelligence Source
- در Splunk ES 8.X
- Configure → Threat Intelligence Downloads → New Threat Intelligence Source
- Configure → All Configuration → Intelligence → New Threat Intelligence Source
- در Splunk ES 7.X
- پر کردن فیلدهای پایه

| فیلد | مقدار پیشنهادی | توضیح |
| Name | AFTA_IOC | نام feed |
| Description | Afta IOC ip | توضیحات |
| Type | threatlist | نوع feed؛ محدود به مقادیر استاندارد: malware، ttxi، threatlist (Splunk Docs) |
| URL | https://afta.gov.ir/uploads/Shakhes/AFTA_IOC.txt | لینک مستقیم فایل |
| Interval | 3600 | زمان بروزرسانی خودکار (ثانیه) |
| Skip header lines | 0 | فایل فاقد header است |
نکته مهم: انتخاب صحیح Type برای ingest موفق و correlation ضروری است.
3. پیکربندی Parser
3.1 فیلدهای UI واقعی
در تب Parser، سه فیلد اصلی وجود دارد:
- Delimiting regular expression
- Extracting regular expression
- Fields
برای فایل AFTA که هر خط یک IP است، توصیه میشود:
- File Parser: auto
- Delimiting regular expression: \n
- Extracting regular expression: خالی
- Fields: ip,description
دلیل انتخاب: فیلد description در Splunk ES اجباری است و باید حداقل دو field تعریف شود. مقدار اول هر خط وارد فیلد ip میشود و description خالی میماند.
3.2 جایگزین Regex (در صورت نیاز)
اگر UI خطا داد که تعداد fieldها با داده مطابقت ندارد:
- File Parser: auto
- Extracting regular expression: ^(\d{1,3}(?:\.\d{1,3}){3})$
- Fields: ip:$1,description:AFTA_IP_Feed
- Delimiting regular expression: خالی
طبق مستندات رسمی Splunk ES، باید یا Delimiting regex داشته باشی یا Extracting regex، نه هر دو. Fields باید با capture groupها یا line-delimited data مطابقت داشته باشد.

4. قوانین کلیدی ingest و نکات عملیاتی
-
حداقل یک فیلد indicator باید تعریف شود.
-
Fields باید با capture groupها یا delimiterها سازگار باشد.
-
Type باید با محتوای feed مطابقت داشته باشد و از مقادیر استاندارد باشد.
-
دادهها باید UTF-8 یا ASCII باشند.
-
برای فایلهای line-delimited بدون header، گزینه Has Header خاموش شود.
-
خطای رایج No observables or indicators found in file ناشی از اشتباه در Parser یا Type است.
5. تست و دیباگ
- مشاهده lookup:
- | inputlookup ip_intel max=10000 where * | search threat_key=Afta_IOC
- `all_threat_intel_by_threat_key(Afta_IOC)`
- مشاهده وضعیت دانلود:
- | rest splunk_server=local count=0 /services/data/inputs/threatlist | search disabled=0 | rename title as stanza | table stanza,disabled,type,description,url,weight | join type=outer stanza [| rest splunk_server=local count=0 /services/admin/inputstatus/ModularInputs%3Amodular%20input%20commands | transpose | rex field=column “\(threatlist:\/\/(?<stanza>[^\)]+)” | search stanza=* | eval _time=strptime(‘row 1’,”%Y-%m-%dT%H:%M:%S%z”) | eval exit_status=if(column LIKE “%exit status description”,replace(‘row 1’,”exited\s+with\s+code\s+(\d+)”,”\1″),null()) | eventstats first(exit_status) as exit_status by stanza | stats first(exit_status) as exit_status,min(_time) as firstTime,max(_time) as lastTime by stanza | eval run_duration=round(lastTime-firstTime,1)] | join type=outer stanza [search index=_internal sourcetype=threatintel:download file=”threatlist.py:download_*” earliest=-24h@h latest=now | stats latest(status) as download_status by stanza] | rename lastTime as _time | search stanza=”Afta_IOC”
- اطمینان از اینکه IPها در فیلد ip درج شدهاند.
- بررسی مقدار type و threat_collection برای تطابق با feed.
6.نکات پیشرفته
- در صورت feedهای چند مقدار در یک خط، Regex با REPEAT_MATCH استفاده شود.
- برای دادههای غیر IP (دامنه، URL، hash)، parser متفاوت لازم است.
7.جمعبندی
اتصال TI feed از پورتال شاخصهای آلودگی AFTA به Splunk ES یک فرآیند استراتژیک و قابل اعتماد برای افزایش توانمندیهای تشخیص و پاسخ به تهدیدها است. رعایت مراحل زیر تضمین میکند که دادهها صحیح ingest شده و آماده تحلیل و correlation هستند:
- بررسی و آمادهسازی فایل feed.
- ایجاد Threat Intelligence Source و پر کردن فیلدهای پایه.
- پیکربندی Parser مطابق UI واقعی با Delimiting یا Extracting regex و تعریف Fields.
- مقداردهی به فیلدهای تکمیلی (type, threat_collection, threat_key, description).
- رعایت قوانین ingest و تست Preview.
- دیباگ و بررسی دادههای ingest شده در lookup و Threat Match.
جدول جامع فیلدها و مقادیر مهم در Threat Intelligence Source (Splunk ES)
| فیلد UI | مقادیر استاندارد / انتخابی | توضیح کاربردی | الزامی |
| Name | هر نام دلخواه (مثال: AFTA_IOC) | نام داخلی feed برای شناسایی در Splunk | بله |
| URL | URL مستقیم فایل feed (مثال: https://afta.gov.ir/uploads/Shakhes/AFTA_IOC.txt) | محل دانلود دادهها | بله |
| Type | malware / ttxi / threatlist / vulnerability | نوع شاخص، محدود به مقادیر استاندارد (Splunk Docs) | بله |
| Interval | عدد صحیح ثانیه (مثال: 3600) | زمانبندی بروزرسانی خودکار | اختیاری، پیشفرض 3600 |
| Format | Delimited / JSON / XML | فرمت فایل feed | بله |
| Has Header | Yes / No | آیا فایل دارای header است یا خیر | بله |
| Delimiting regular expression | \n یا دلخواه بر اساس delimiter | جداکننده خطوط یا ستونها | بله اگر از Delimited استفاده شود |
| Extracting regular expression | مثال: ^(\d{1,3}(?:\.\d{1,3}){3})$ | Regex برای استخراج فیلدها از هر خط | بله اگر از Regex استفاده شود |
| Fields | ip,description / domain,description / hash,description | نام فیلدهایی که دادهها داخل آنها ذخیره میشوند. description اجباری است | بله |
| Eval Expression | مثال: eval type=”threatlist” eval threat_collection=”AFTA” eval threat_key=ip eval description=”AFTA IOC Feed” | مقداردهی تکمیلی فیلدها برای lookup و correlation | اختیاری اما توصیهشده |
| threat_collection | هر نام دلخواه برای گروهبندی feedها | استفاده در correlation و Notable Eventها | اختیاری |
| threat_key | فیلد indicator اصلی (مثلاً ip) | کلید اصلی lookup و correlation | بله |
| description | متن دلخواه توضیح feed | برای مستندسازی و گزارشها | بله، باید حداقل یک field تعریف شود |
| Encoding | UTF-8 / ASCII | نوع encoding فایل feed | بله |
مثالهای رایج ترکیب فیلدها و مقادیر
| سناریو | Delimiting regex | Extracting regex | Fields | Eval type | توضیح |
| فایل line-based IP | \n | خالی | ip,description | threatlist | سادهترین حالت برای AFTA IOC، هر خط یک IP |
| فایل line-based domain | \n | خالی | domain,description | threatlist | برای دامنههای شاخص آلودگی |
| فایل hash | \n | ^([a-fA-F0-9]{32,64})$ | hash | malware | برای hash فایلهای مخرب |
| چند مقدار در یک خط | , | ^(\d{1,3}(?:\.\d{1,3}){3}),(.+)$ | ip,description | threatlist | برای فایلهایی که توضیح یا metadata در همان خط دارند |
| JSON feed | خالی | JSON Path | ip,description | threatlist | برای feedهای JSON، Regex لازم نیست، از JSON Path استفاده میشود |
نکته: طبق مستندات Splunk، هر feed باید حداقل یک field indicator و یک field description داشته باشد. در feedهایی که فقط یک مقدار دارند، فیلد دوم میتواند خالی باشد.
نکات مهم عملیاتی
- برای فایلهای line-delimited بدون header، گزینه Has Header را خاموش کنید.
- اگر خطا No observables or indicators found in file رخ داد:
- parser یا Fields اشتباه است
- Type اشتباه انتخاب شده
- فایل encoding درست نیست
- Type feed باید با محتوا مطابقت داشته باشد:
- IP → threatlist یا ttxi
- دامنه → threatlist
- Hash → malware
- Delimiting regex و Extracting regex نباید همزمان مقادیر متناقض داشته باشند؛ یکی کافی است.
- بررسی ingest با inputlookup و threatintel الزامی است.
لینک کانال:
دیدگاهتان را بنویسید