معرفی

در این آموزش شما نحوه پیکربندی حالت داخلی سیستم پیشگیری از نفوذ (IPS) Suricata را در دبیان 11 خواهید آموخت. به طور پیش فرض Suricata به گونه ای پیکربندی شده است که به عنوان یک سیستم تشخیص نفوذ (IDS) اجرا شود، که فقط هشدارها را تولید می کند و ترافیک مشکوک را ثبت می کند. هنگامی که حالت IPS را فعال می کنید، Suricata می تواند به طور فعال ترافیک شبکه مشکوک را علاوه بر ایجاد هشدار برای تجزیه و تحلیل بیشتر، حذف کند.

قبل از فعال کردن حالت IPS، مهم است که بررسی کنید کدام امضاها را فعال کرده‌اید و اقدامات پیش‌فرض آنها را بررسی کنید. امضای پیکربندی نادرست یا امضای بیش از حد گسترده ممکن است منجر به کاهش ترافیک قانونی به شبکه شما شود یا حتی دسترسی شما به سرورهای خود را از طریق SSH و سایر پروتکل های مدیریتی مسدود کند.

در قسمت اول این آموزش، امضاهایی را که نصب و فعال کرده اید بررسی می کنید. همچنین یاد خواهید گرفت که چگونه امضاهای خود را وارد کنید. هنگامی که بدانید از کدام امضاها می خواهید در حالت IPS استفاده کنید، عملکرد پیش فرض آنها را به حذف یا رد ترافیک تبدیل می کنید. با امضای خود، یاد خواهید گرفت که چگونه ترافیک شبکه را از طریق Suricata با استفاده از netfilter NFQUEUE iptables target ارسال کنید و سپس مقداری ترافیک شبکه نامعتبر ایجاد کنید تا اطمینان حاصل کنید که Suricata آن را همانطور که انتظار می رود حذف می کند.

پیش نیازها

اگر این مجموعه آموزشی را دنبال کرده اید، باید Suricata را از قبل روی سرور اجرا کنید. اگر هنوز نیاز به نصب Suricata دارید، می توانید بسته به سیستم عامل سرور خود یکی از این آموزش ها را دنبال کنید:

  • نحوه نصب Suricata در Debian 11
  • همچنین باید مجموعه قوانین باز ET را با استفاده از دستور suricata-update دانلود کرده و در امضاهای Suricata خود قرار دهید.
  • خط فرمان jq ابزار پردازش JSON. اگر آن را از آموزش قبلی نصب نکرده اید، می توانید با استفاده از دستور apt این کار را انجام دهید:

sudo apt update
sudo apt install jq

مرحله 1 – شامل امضاهای سفارشی

آموزش های قبلی در این مجموعه به بررسی نحوه نصب و پیکربندی Suricata و همچنین نحوه درک امضاها پرداخته است. اگر می‌خواهید امضاهای خود را ایجاد و اضافه کنید، باید فایل /etc/suricata/suricata.yaml Suricata را ویرایش کنید تا آنها را اضافه کنید.

ابتدا، بیایید IP های عمومی سرور خود را پیدا کنیم تا بتوانید از آنها در امضاهای سفارشی خود استفاده کنید. برای پیدا کردن IP های خود می توانید از دستور ip استفاده کنید:

ip -brief address show

شما باید خروجی هایی مانند زیر دریافت کنید:

Output
lo               UNKNOWN        127.0.0.1/8 ::1/128 
eth0             UP             203.0.113.0.5/20 10.20.0.5/16 2604:a880:cad:d0::dc8:4001/64 fe80::94ad:d4ff:fef9:cee0/64 
eth1             UP             10.137.0.2/16 fe80::44a2:ebff:fe91:5187/64

آدرس(های) IP عمومی شما مشابه آی پی های هایلایت شده 203.0.113.0.5 و 2604:a880:cad:d0::dc8:4001/64 در خروجی خواهد بود.

اکنون اجازه دهید امضای سفارشی زیر را برای اسکن ترافیک SSH به پورت های غیر SSH ایجاد کنیم و آن را در فایلی به نام /etc/suricata/rules/local.rules قرار دهیم. فایل را با nano یا ویرایشگر دلخواه خود باز کنید:

sudo nano /etc/suricata/rules/local.rules

امضای زیر را کپی و پیست کنید:

Invalid SSH Traffic Signature
alert ssh any any -> 203.0.113.0.5 !22 (msg:"SSH TRAFFIC on non-SSH port"; flow:to_client, not_established; classtype: misc-attack; target: dest_ip; sid:1000000;)
alert ssh any any -> 2604:a880:cad:d0::dc8:4001/64 !22 (msg:"SSH TRAFFIC on non-SSH port"; flow:to_client, not_established; classtype: misc-attack; target: dest_ip; sid:1000001;)

آدرس IP عمومی سرور خود را به جای آدرس های 203.0.113.5 و 2604:a880:cad:d0::dc8:4001/64 در قانون جایگزین کنید. اگر از IPv6 استفاده نمی کنید، می توانید از اضافه کردن آن امضا در این قوانین و قوانین زیر صرف نظر کنید.

بسته به شبکه و برنامه های خود می توانید به افزودن امضاهای سفارشی به این فایل local.rules ادامه دهید. به عنوان مثال، اگر می خواهید در مورد ترافیک HTTP به پورت های غیر استاندارد هشدار دهید، می توانید از امضاهای زیر استفاده کنید:

HTTP traffic on non-standard port signature
alert http any any -> 203.0.113.0.5 !80 (msg:"HTTP REQUEST on non-HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000002;)
alert http any any -> 2604:a880:cad:d0::dc8:4001/64 !80 (msg:"HTTP REQUEST on non-HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000003;)

برای افزودن امضایی که ترافیک TLS را به پورت هایی غیر از 443 پیش فرض برای سرورهای وب بررسی می کند، موارد زیر را اضافه کنید:

TLS traffic on non-standard port signature
alert tls any any -> 203.0.113.0.5 !443 (msg:"TLS TRAFFIC on non-TLS HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000004;)
alert tls any any -> 2604:a880:cad:d0::dc8:4001/64 !443 (msg:"TLS TRAFFIC on non-TLS HTTP port"; flow:to_client, not_established; classtype:misc-activity; sid:1000005;)

پس از تکمیل امضا، فایل را ذخیره کرده و ببندید. اگر از نانو استفاده می‌کنید، می‌توانید این کار را با CTRL+X انجام دهید، سپس Y و ENTER را تأیید کنید. اگر از vi استفاده می کنید، ESC و سپس : x و سپس ENTER را برای ذخیره و خروج فشار دهید.

اکنون که تعدادی امضای سفارشی تعریف کرده‌اید، فایل پیکربندی Suricata /etc/suricata/suricata.yaml را با استفاده از nano یا ویرایشگر دلخواه خود ویرایش کنید تا آنها را در بر بگیرد:

sudo nano /etc/suricata/suricata.yaml

فایل های قانون را پیدا کنید: بخشی از پیکربندی. اگر از nano استفاده می کنید از CTRL+_ استفاده کنید و سپس شماره خط 1879 را وارد کنید. اگر از vi استفاده می کنید 1879gg را وارد کنید تا به خط بروید.

بخش را ویرایش کنید و خط برجسته شده زیر را اضافه کنید – local.rules:

/etc/suricata/suricata.yaml
. . .
rule-files:
  - suricata.rules
  - local.rules
. . .

فایل را ذخیره کرده و از آن خارج شوید. مطمئن شوید که پیکربندی Suricata را پس از افزودن قوانین خود تأیید کنید. برای این کار دستور زیر را اجرا کنید:

sudo suricata -T -c /etc/suricata/suricata.yaml -v

بسته به تعداد قوانینی که در فایل پیش‌فرض suricata.rules بارگیری کرده‌اید، آزمایش ممکن است کمی طول بکشد. اگر متوجه شدید که آزمایش خیلی طول می کشد، می توانید با اضافه کردن یک # به ابتدای خط، روی خط – suricata.rules در تنظیمات نظر دهید و سپس دوباره تست پیکربندی خود را اجرا کنید.

هنگامی که از امضاهایی که با استفاده از ابزار suricata-update ایجاد یا اضافه کرده اید راضی شدید، می توانید به مرحله بعدی بروید، جایی که عملکرد پیش فرض امضاهای خود را از هشدار یا ثبت به حذف فعال ترافیک تغییر دهید.

مرحله 2 – پیکربندی اقدامات امضا

اکنون که امضاهای سفارشی خود را آزمایش کرده‌اید و با Suricata کار می‌کنید، می‌توانید عمل را به حذف یا رد تغییر دهید. وقتی Suricata در حالت IPS کار می کند، این اقدامات به طور فعال ترافیک نامعتبر را برای هر امضای منطبق مسدود می کند.

این دو عمل در آموزش قبلی این مجموعه، درک امضای سوریکاتا توضیح داده شده است. انتخاب این که از کدام عمل استفاده کنید به شما بستگی دارد. یک عمل رها کردن بلافاصله یک بسته و هر بسته بعدی را که به جریان شبکه تعلق دارد دور می اندازد. اگر ترافیک مبتنی بر TCP باشد، یک اقدام رد برای مشتری و سرور یک بسته بازنشانی و یک بسته خطای ICMP برای هر پروتکل دیگری ارسال می‌کند.

بیایید از قوانین سفارشی بخش قبل استفاده کنیم و آنها را به استفاده از اکشن drop تبدیل کنیم، زیرا ترافیکی که آنها مطابقت دارند احتمالاً یک اسکن شبکه یا یک اتصال نامعتبر دیگر است.

فایل /etc/suricata/rules/local.rules خود را با استفاده از nano یا ویرایشگر دلخواه خود باز کنید و عمل هشدار را در ابتدای هر خط در فایل تغییر دهید تا رها شود:

/etc/suricata/rules/local.rules
drop ssh any any -> 203.0.113.0.5 !22 (msg:"SSH TRAFFIC on non-SSH port"; classtype: misc-attack; target: dest_ip; sid:1000000;)
drop ssh any any -> 2604:a880:cad:d0::dc8:4001/64 !22 (msg:"SSH TRAFFIC on non-SSH port"; classtype: misc-attack; target: dest_ip; sid:1000001;)

مرحله بالا را برای هر گونه امضا در /etc/suricata/rules/suricata.rules که می خواهید به حالت drop یا reject تبدیل کنید، تکرار کنید.

هنگامی که تمام امضاها را با عملکردی که می خواهید انجام دهند پیکربندی کردید، مرحله بعدی پیکربندی مجدد و سپس راه اندازی مجدد Suricata در حالت IPS است.

مرحله 3 – فعال کردن حالت nfqueue

Suricata به طور پیش فرض در حالت IDS اجرا می شود، به این معنی که به طور فعال ترافیک شبکه را مسدود نمی کند. برای تغییر حالت IPS، باید تنظیمات پیش‌فرض Suricata را تغییر دهید.

از دستور systemctl edit برای ایجاد یک فایل جایگزین systemd جدید استفاده کنید:

sudo systemctl edit suricata.service

خطوط هایلایت شده زیر را در ابتدای فایل، بین نظرات اضافه کنید:

systemctl edit suricata.service
### Editing /etc/systemd/system/suricata.service.d/override.conf
### Anything between here and the comment below will become the new contents of the file

[Service]
ExecStart=
ExecStart=/usr/bin/suricata -c /etc/suricata/suricata.yaml --pidfile /run/suricata.pid -q 0 -vvv
Type=simple

### Lines below this comment will be discarded
. . .
  • خط ExecStart= دستور systemd پیش فرض را که یک سرویس را راه اندازی می کند پاک می کند. خط بعدی دستور ExecStart جدید را برای استفاده تعریف می کند.
  • خط Type=simple تضمین می کند که systemd می تواند فرآیند Suricata را هنگامی که در حالت IPS اجرا می شود مدیریت کند.
    ذخیره کنید و فایل را ببندید. اگر از نانو استفاده می‌کنید، می‌توانید این کار را با CTRL+X انجام دهید، سپس Y و ENTER را تأیید کنید. اگر از vi استفاده می کنید، ESC و سپس : x و سپس ENTER را برای ذخیره و خروج فشار دهید.

اکنون systemd را دوباره بارگیری کنید تا تنظیمات Suricata جدید را شناسایی کند:

sudo systemctl daemon-reload

اکنون می توانید Suricata را با استفاده از systemctl مجددا راه اندازی کنید:

sudo systemctl restart suricata.service

وضعیت Suricata را با استفاده از systemctl بررسی کنید:

sudo systemctl status suricata.service

شما باید خروجی هایی مانند زیر دریافت کنید:

Output
● suricata.service - Suricata IDS/IDP daemon
     Loaded: loaded (/lib/systemd/system/suricata.service; enabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/suricata.service.d
             └─override.conf
     Active: active (running) since Wed 2021-12-15 14:35:21 UTC; 38s ago
       Docs: man:suricata(8)
             man:suricatasc(8)
             https://suricata-ids.org/docs/
   Main PID: 29890 (Suricata-Main)
      Tasks: 10 (limit: 2340)
     Memory: 54.9M
        CPU: 3.957s
     CGroup: /system.slice/suricata.service
             └─29890 /usr/bin/suricata -c /etc/suricata/suricata.yaml --pidfile /run/suricata.pid -q 0 -vvv

. . .
Dec 15 14:35:21 suricata suricata[29890]: 15/12/2021 -- 14:35:21 - <Notice> - all 4 packet processing threads, 4 management threads initialized, engine started

به خط فعال (در حال اجرا) برجسته شده توجه کنید که نشان می دهد Suricata با موفقیت مجدد راه اندازی شده است.

با این تغییر اکنون آماده ارسال ترافیک به Suricata با استفاده از فایروال UFW در مرحله بعد هستید.

مرحله 4 – پیکربندی UFW برای ارسال ترافیک به Suricata

اکنون که Suricata را برای پردازش ترافیک در حالت IPS پیکربندی کرده اید، گام بعدی هدایت بسته های ورودی به Suricata است. اگر آموزش های پیش نیاز این سری را دنبال کرده اید و از سیستم اوبونتو 20.04 استفاده می کنید، باید فایروال بدون عارضه (UFW) را به طور پیش فرض نصب و فعال کنید.

برای افزودن قوانین لازم برای Suricata به UFW، باید فایل های فایروال را در /etc/ufw/before.rules و /etc/ufw/before6.rules مستقیماً ویرایش کنید.

اولین فایل را با استفاده از nano یا ویرایشگر دلخواه خود باز کنید:

sudo nano /etc/ufw/before.rules

نزدیک ابتدای فایل، خطوط برجسته زیر را وارد کنید:

/etc/ufw/before.rules
. . .
# Don't delete these required lines, otherwise there will be errors
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
# End required lines

## Start Suricata NFQUEUE rules
-I INPUT 1 -p tcp --dport 22 -j NFQUEUE --queue-bypass
-I OUTPUT 1 -p tcp --sport 22 -j NFQUEUE --queue-bypass
-I FORWARD -j NFQUEUE
-I INPUT 2 -j NFQUEUE
-I OUTPUT 2 -j NFQUEUE
## End Suricata NFQUEUE rules

# allow all on loopback
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-output -o lo -j ACCEPT
. . .

پس از اتمام ویرایش فایل، آن را ذخیره کرده و از آن خارج شوید. حالا همان خطوط را به همان بخش در فایل /etc/ufw/before6.rules اضافه کنید.

دو قانون اول INPUT و OUTPUT برای دور زدن Suricata استفاده می شود تا بتوانید با استفاده از SSH به سرور خود متصل شوید، حتی زمانی که Suricata در حال اجرا نیست. بدون این قوانین، یک امضای نادرست یا بیش از حد گسترده می تواند دسترسی SSH شما را مسدود کند. علاوه بر این، اگر Suricata متوقف شود، تمام ترافیک به هدف NFQUEUE ارسال می شود و سپس از آنجایی که Suricata در حال اجرا نیست، حذف می شود.

قانون FORWARD بعدی تضمین می کند که اگر سرور شما به عنوان دروازه ای برای سیستم های دیگر عمل می کند، تمام آن ترافیک نیز برای پردازش به Suricata می رود.

دو قانون نهایی INPUT و OUTPUT تمام ترافیک باقیمانده را که ترافیک SSH نیست برای پردازش به Suricata ارسال می کند.

برای بارگیری قوانین جدید، UFW را مجددا راه اندازی کنید:

sudo systemctl restart ufw.service

در این مرحله از آموزش شما Suricata را برای اجرا در حالت IPS پیکربندی کرده اید و ترافیک شبکه شما به طور پیش فرض به Suricata ارسال می شود. شما می توانید سرور خود را در هر زمانی راه اندازی مجدد کنید و قوانین Suricata و فایروال شما پایدار خواهند بود.

آخرین مرحله در این آموزش این است که تأیید کنید Suricata ترافیک را به درستی حذف می کند.

مرحله 5 – تست ترافیک نامعتبر

اکنون که Suricata و فایروال خود را برای پردازش ترافیک شبکه پیکربندی کرده‌اید، می‌توانید آزمایش کنید که آیا Suricata بسته‌هایی را که با امضاهای سفارشی شما و سایر امضاهای موجود مطابقت دارند را حذف می‌کند یا خیر.

sid:2100498
drop ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)

قانون را در فایل /etc/suricata/rules/suricata.rules خود پیدا کرده و ویرایش کنید تا در صورتی که امضا در آن گنجانده شده است، از عمل drop استفاده کنید. در غیر این صورت، قانون را به فایل /etc/suricata/rules/local.rules خود اضافه کنید.

سیگنال SIGUSR2 را برای Suricata ارسال کنید تا امضاهایش را دوباره بارگیری کند:

sudo kill -usr2 $(pidof suricata)

حالا قانون را با استفاده از curl تست کنید:

curl –max-time 5 http://testmynids.org/uid/index.html

باید خطایی دریافت کنید که زمان درخواست به پایان رسیده است، که نشان می دهد Suricata پاسخ HTTP را مسدود کرده است:

Output
curl: (28) Operation timed out after 5000 milliseconds with 0 out of 39 bytes received

می‌توانید تأیید کنید که Suricata پاسخ HTTP را با استفاده از jq برای بررسی فایل eve.log حذف کرده است:

jq ‘select(.alert .signature_id==2100498)’ /var/log/suricata/eve.json

شما باید خروجی هایی مانند زیر دریافت کنید:

Output
{
. . .
  "community_id": "1:Z+RcUB32putNzIZ38V/kEzZbWmQ=",
  "alert": {
    "action": "blocked",
    "gid": 1,
    "signature_id": 2100498,
    "rev": 7,
    "signature": "GPL ATTACK_RESPONSE id check returned root",
    "category": "Potentially Bad Traffic",
    "severity": 2,
    "metadata": {
      "created_at": [
        "2010_09_23"
      ],
      "updated_at": [
        "2010_09_23"
      ]
    }
  },
  "http": {
    "hostname": "testmynids.org",
    "url": "/uid/index.html",
    "http_user_agent": "curl/7.68.0",
    "http_content_type": "text/html",
    "http_method": "GET",
    "protocol": "HTTP/1.1",
    "status": 200,
    "length": 39
  },
. . .

خط برجسته “اقدام”: “blocked” تأیید می کند که امضا مطابقت دارد و Suricata درخواست HTTP آزمایشی را رد یا رد کرده است.

نتیجه

در این آموزش شما Suricata را برای مسدود کردن ترافیک شبکه مشکوک با استفاده از حالت IPS داخلی خود پیکربندی کرده اید. همچنین برای بررسی و مسدود کردن ترافیک SSH، HTTP، و TLS در پورت‌های غیر استاندارد، امضاهای سفارشی اضافه کرده‌اید. برای گره زدن همه چیز به هم، قوانین فایروال را نیز اضافه کردید که ترافیک را از طریق Suricata برای پردازش هدایت می کند.

اکنون که Suricata را در حالت IPS نصب و پیکربندی کرده‌اید و می‌توانید امضاهای خود را بنویسید که ترافیک مشکوک را هشدار می‌دهد یا آن را رها می‌کند، می‌توانید به نظارت بر سرورها و شبکه‌های خود ادامه دهید و امضاهای خود را اصلاح کنید.

هنگامی که از امضاها و پیکربندی Suricata خود راضی شدید، می‌توانید آخرین آموزش این مجموعه را ادامه دهید، که شما را از طریق ارسال گزارش‌ها از Suricata به سیستم مدیریت رویداد امنیتی و اطلاعات (SIEM) که با استفاده از Elastic Stack ساخته شده است، راهنمایی می‌کند.


سرور مجازی آلمان

سرور مجازی آمریکا

سرور مجازی فرانسه

سرور مجازی کانادا

سرور مجازی لهستان

سرور مجازی هلند

سرور مجازی انگلیس

برچسب‌ها:, , , , , , , , ,