Hootan Alghaspour
Hootan Alghaspour
خواندن ۵ دقیقه·۴ سال پیش

فعال کردن Alerting در ElasticSearch

خلاصه قضیه به اینصورت است که می خواهیم فرآیند Watch -> Trigger -> Action روی داده ها و رکوردهای ذخیره شده در الاستیک سرچ فعال شود و مثلاً اگر براساس قوائد مشخصی در بازه زمانی مشخص محتوی با شرایط تعیین شده ای در پایگاه داده دیده شد عملی بصورت خودکار انجام شود.

اصل داستان به سناریوی استفاده از الاستیک سرچ بعنوان SIEM/SOAR برمی گردد که می خواستم در یک مقاله جامع توضیح دهم اما با توجه به اینکه مراحل و اعمال مختلفی باید انجام شود ، در چند مقاله مجزا این مراحل را توضیح می دهم تا بعد در یک مقاله کلی موضوع را جمع بندی کنیم.

در همین راستا مقاله "تجمیع لاگ ها با rsyslog و لاگ کاوی با ELK و داشبورد وب" قبلاً منتشر شده و نسخه "تجمیع لاگ ها و متریک ها با Beatهای الاستیک سرچ" نیز احتمالاً یکی دو مقاله بعد از همین نوشته منتشر خواهد شد.

قابلیت Alerting در kibana بصورت پیش فرض جزو امکانات لایسنس Basic هست که به راحتی می توانید فعال نمایید، البته این alerting خیلی کارا و جامع نیست و باید به لایسنس های حرفه ای تر رجوع کنید، اما ابزار سورس باز و بسیار قدرتمند ElastAlert بدون نیاز به فعال کردن لایسنس و x-pack و ... امکان برقراری راحت و پیشرفته و بهینه Alerting را براساس قوائدی که شما تعریف کرده اید فراهم می کند.

مقایسه امکانات لایسنس های الاستیک سرچ را اینجا ببینید.

امکانات و توضیحات ElastAlert را اینجا ببینید.

Several rule types with common monitoring paradigms are included with ElastAlert:

  • Match where there are at least X events in Y time" (frequency type)
  • Match when the rate of events increases or decreases" (spike type)
  • Match when there are less than X events in Y time" (flatline type)
  • Match when a certain field matches a blacklist/whitelist" (blacklist and whitelist type)
  • Match on any event matching a given filter" (any type)
  • Match when a field has two different values within some time" (change type)
  • Match when a never before seen term appears in a field" (new_term type)
  • Match when the number of unique values for a field is above or below a threshold (cardinality type)

Currently, we have built-in support for the following alert types:

Email, JIRA, OpsGenie, Commands, HipChat, MS Teams, Slack, Telegram, GoogleChat, AWS, SNS, VictorOps, PagerDuty, PagerTree, Exotel, Twilio, Gitter, Line Notify, Zabbix

نصب ElastAlert بسیار ساده است، هم بصورت دستی با clone کردن و setup.py و هم با pip میتوانید نصب بفرمایید، من با توجه به تعدد نسخه های python و تنظیمات سیستم با دستور ذیل نصب کردم:

pip3 install --no-cache-dir elastalert

برای اجرایش هم اگر با دستور مستقیم elastalert به مشکل برخوردید (احتمالاً بخاطر همان تعدد نسخ و تنظیمات پایتون) کافیست از روش ذیل بسادگی اجرا بفرمایید:

python3 -m elastalert.elastalert --verbose --config elastalert/config.yaml --rule elastalert/example_rules/example_frequency.yaml

اگر مشکلی نداشتید که مستقیماً دستور elastalert را بزنید معادل همان عبارت بالاست.

خیلی مشخص هست، یک فایل config معرفی می کنید (config--) که مثلاً مشخصات ارتباط با الاستیک سرچ و تنظیمات کلی در آن است، یک فایل rule معرفی می کنید (rule--) که قوائد تعریف شده شما برای alerting است.

دقت بفرمایید elastalert/config.yaml مسیر نسبی از محل اجرا است، مثلاً من پوشه elastalert را دارم که به فایل config.yaml درون آن براساس path متناسب با path اجرا ارجاع داده ام.

>> مستندات کامل ElastAlert را اینجا مطالعه بفرمایید.

یک نمونه فایل config.yaml که توضیحات مناسبی هم دارد و اگر با ادبیات الاستیک سرچ آشنا باشید برای شما کاملاً مفهوم است در اینجا هست.

پس از نصب و تغییرات فایل config.yaml ، باید دستور ذیل را اجرا کنید که ایندکس خودش را در الاستیک سرچ بسازد :

elastalert-create-index --config elastalert/config.yaml

تعدادی rule نمونه نیز در اینجا هست که مثال های خوبی هستند.

من یک مثال ساده خدمتتون عرض می کنم و تحقیق مابقی داستان برای شما که alerting در الاستیک سرچ و مباحث مشابه موضوع جستجو و مطالعه تون هست کار سختی نیست.

در این مثال می خواهم اگر در طول 4 ساعت، 5 بار عبارت "This is Alerting Test" در ایندکس معرفی شده تکرار شد یک ایمیل به root@localhost یا هر ایمیل دیگری ارسال کند.

قبل از آن دقت بفرمایید sendmail را نصب کرده باشید.

این تنظیمات فایل rule.yaml است، اگر https روی الاستیک سرچ شما فعال نیست نیازی به تعریف بخش SSL ندارید :

# Alert when the rate of events exceeds a threshold es_host: elksiem es_port: 9200 es_username: elastic es_password: ***** # SSL/Certs use_ssl: True verify_certs: True ca_certs: /root/certs/ca/ca.crt client_cert: /root/certs/ELKSIEM/ELKSIEM.crt client_key: /root/certs/ELKSIEM/ELKSIEM.key #name, type, index name: Example frequency rule1 type: frequency index: filebeat-* # Alert when this many documents matching the query occur within a timeframe num_events: 5 # num_events must occur within this amount of time to trigger an alert timeframe: hours: 4 # A list of Elasticsearch filters used for find events # These filters are joined with AND and nested in a filtered query filter: - query: query_string: query: 'message : &quotThis is Alerting Test&quot' # The alert is use when a match is found alert: - &quotemail&quot from_addr: &quotelastalert@ELKSIEM&quot # a list of email addresses to send alerts to email: - &quotroot@ELKSIEM&quot

نوع rule در بخش type ذکر می شود که مثلاً به تواتر (frequency) یا تغییر یا مقدار یا ... حساس باشد. انواع rule types را در elastalert اینجا ببینید.

حالا با دستور ذیل اجرا می کنم و البته می تونم بصورت job به background بفرستم و خروجی اش را هم حواله کنم به dev/null/ و ...

python3 -m elastalert.elastalert --verbose --config elastalert/config.yaml --rule elastalert/rule1.yaml

من اینجا ایندکس filebeat را بعنوان منظر انتخاب کرده ام که لاگ های سیستم ها را جمع می کند بنابراین با logger می توان بسادگی rule بالا را تست کرد،

برای تست rule ها می توانید از دستور ذیل استفاده بفرمایید:

elastalert-test-rule --config elastalert/config.yaml elastalert/rule1.yaml

و با اجرای elastalert نتیجه هم که مشخص است.

با دستور mail و یا در فایل var/spool/mail/root/ ایمیل ارسال شده را ببینید.


در سناریوی راه اندازی SIEM/SOAR با ELK (یا هر مورد مشابه) با توجه به اینکه می توانید انواع queryها و regex ها را روی ایندکس ها و فیلدهای مختلف تعریف کنید تا براساس تواتر یا تغییر یا مقدار یا ... آن ها در بازه زمانی مشخص alertی صادر شود و برمبنای آن کاری انجام شود، استفاده از ElastAlert بسیار متداول و کارگشا است. قابلیت های زیادی دارد که در مستندات و مثال هایش پیدا می کنید.

الاستیک سرچelasticsearchsiemلینوکس
هوتن القاس پور
شاید از این پست‌ها خوشتان بیاید