← شروع آموزش

WIUNIX ACADEMY

آموزش CrowdSec و Nginx؛ لاگ معتبر، LAPI خصوصی و مسدودسازی قابل‌بازگشت

صفحهٔ 4 از 5؛ مراحل قبلی و پیش‌نیازها را پیش از ادامه مرور کن.

آموزش متناسب با محیط تو

کجا اجرا می‌کنی؟

سیستم‌عامل و نسخه را انتخاب کن تا مراحل، دستورها و راه‌حل‌ها برای همان محیط نمایش داده شوند.

Debian13بررسی‌شده با مستندات رسمی ·

آموزش متناسب با مقادیر تو

تنظیمات این آموزش

مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر می‌کنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری می‌شوند و به سرور یا لینک اشتراک‌گذاری فرستاده نمی‌شوند. پیش از اجرا، DNS، گواهی‌ها و سیاست شبکهٔ واقعی را بررسی کن.

آی‌پی، دامنه یا پورت مثال‌ها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای به‌روز‌شده را کپی کن.

تنظیم مقادیر برای محیط من7 مقدار قابل‌تغییر
11

قدم بعدی

خواندن لاگ، پارسر و احراز هویت bouncer را ببینید

اول درخواست بسازید و سپس خروجی را ببینید. رویداد loopback ممکن است در کالکشن مجاز شناخته شود؛ این به معنی خرابی پارسر نیست. explain سرریز سناریو را آزمایش نمی‌کند. ثبت نام bouncer کافی نیست؛ دریافت احرازشدهٔ اخیر و پاسخ واقعی403 نیز لازم است.

bash

ترمینال ماشین آزمایشگاهی مستقل

curl --noproxy '*' --interface '127.0.0.2' --fail http://127.0.0.1:18080/index.html
sleep 1
sudo '/srv/academy-crowdsec/crowdsec-v1.8.1/cmd/crowdsec-cli/cscli' -c '/srv/academy-crowdsec/config/engine.yaml' explain --crowdsec '/srv/academy-crowdsec/crowdsec-v1.8.1/cmd/crowdsec/crowdsec' --file '/srv/academy-crowdsec/logs/access.log' --type nginx
sudo '/srv/academy-crowdsec/crowdsec-v1.8.1/cmd/crowdsec-cli/cscli' -c '/srv/academy-crowdsec/config/engine.yaml' metrics --url 'http://127.0.0.1:18082/metrics' show acquisition
sudo '/srv/academy-crowdsec/crowdsec-v1.8.1/cmd/crowdsec-cli/cscli' -c '/srv/academy-crowdsec/config/engine.yaml' bouncers list
از کجا بدانم درست انجام شد؟

مسیر لاگ در معیارهای acquisition، پارسر Nginx در explain و درخواست bouncer به API دیده می‌شود.

12

قدم بعدی

فقط IP محلی تحت‌کنترل را موقتاً مسدود کنید

یک تصمیم۳۰ثانیه‌ای بسازید و بیش از کش یک‌ثانیه‌ای صبر کنید. درخواست دوم عمداً دو هدر رایج IP را جعل می‌کند؛ چون اتصال TCP آن از مدیریت است باید مجاز بماند. این آزمون اجرای تصمیم را ثابت می‌کند، نه تشخیص خودکار سناریو.

bash

ترمینال ماشین آزمایشگاهی مستقل

sudo '/srv/academy-crowdsec/crowdsec-v1.8.1/cmd/crowdsec-cli/cscli' -c '/srv/academy-crowdsec/config/engine.yaml' decisions add --ip '127.0.0.2' --type ban --duration 30s --reason academy-test
sleep 2
curl --noproxy '*' --interface '127.0.0.2' --silent --output /dev/null --write-out '%{http_code}\n' http://127.0.0.1:18080/index.html
curl --noproxy '*' --interface 127.0.0.1 --fail -H 'X-Forwarded-For: 127.0.0.2' -H 'X-Real-IP: 127.0.0.2' http://127.0.0.1:18080/index.html
sudo '/srv/academy-crowdsec/crowdsec-v1.8.1/cmd/crowdsec-cli/cscli' -c '/srv/academy-crowdsec/config/engine.yaml' decisions list --ip '127.0.0.2'
از کجا بدانم درست انجام شد؟

درخواست اول403، درخواست مدیریت با هدر جعلی academy-ok و تصمیم مربوط به 127.0.0.2 است.

13

قدم بعدی

رفع مسدودی و انقضای همان IP را بررسی کنید

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

bash

ترمینال ماشین آزمایشگاهی مستقل

sudo '/srv/academy-crowdsec/crowdsec-v1.8.1/cmd/crowdsec-cli/cscli' -c '/srv/academy-crowdsec/config/engine.yaml' decisions delete --ip '127.0.0.2'
sleep 2
curl --noproxy '*' --interface '127.0.0.2' --fail http://127.0.0.1:18080/index.html
sudo '/srv/academy-crowdsec/crowdsec-v1.8.1/cmd/crowdsec-cli/cscli' -c '/srv/academy-crowdsec/config/engine.yaml' decisions add --ip '127.0.0.2' --duration 5s --reason academy-expiry
sleep 7
curl --noproxy '*' --interface '127.0.0.2' --fail http://127.0.0.1:18080/index.html
از کجا بدانم درست انجام شد؟

هر دو درخواست نهایی academy-ok هستند و تصمیم۵ثانیه‌ای پس از۷ثانیه مسدود نمی‌کند.

رفتار واقعی هنگام قطع API

این نمونه حالت live، کش یک‌ثانیه‌ای و timeout پانصد میلی‌ثانیه دارد. در bouncer1.2.3 خطای ارتباط با LAPI یا پاسخ غیر200 برای درخواست بدون کش به عبور ترافیک می‌انجامد؛ رفتار fail open است. تصمیم کش‌شده ممکن است تا پایان TTL بماند. خطای مقداردهی اولیه می‌تواند اصلاً مانع روشن‌شدن Nginx شود. حالت stream منطق زمان‌سنج و دادهٔ قدیمی متفاوت دارد و این دستورالعمل آن را آزموده نمی‌نامد.

در ترمینال A فقط موتور آزمایشیِ پیش‌زمینه را با Ctrl+C متوقف کنید. بیش از یک ثانیه بعد، از ترمینال B فایل آزمون را بخواهید؛ دسترسی باقی می‌ماند و لاگ اختصاصی خطای API ثبت می‌کند. موتور را با همان دستور روشن و ban/unban را تکرار کنید. باقی‌ماندن دسترسی یعنی حفاظت مبتنی بر تصمیم در آن فاصله ضعیف شده است. گزینهٔ APPSEC_FAILURE_ACTION برای AppSec است، نه خطای LAPI این نمونه. در این تنظیم ban-only با پاسخ403، پیام اولیهٔ نبود کلید کپچا و قالب ban انتظار می‌رود؛ این پیام‌ها خرابی LAPI را ثابت نمی‌کنند. خطاهای بعدی احراز هویت یا timeout را با آن‌ها یکی نگیرید.

عیب‌یابی محدود بدون افشای کلید

این کادرها برای بررسی قطع API و لاگ غیرمحرمانه‌اند. خروجی کامل تنظیمات و فایل bouncer را برای پشتیبانی چاپ نکنید. لاگ combined آدرس IP، مسیر و query، referer و user-agent دارد؛ دسترسی و نگهداری محدود و چرخش لاگ لازم است. در آزمایشگاه از URL دارای دادهٔ شخصی استفاده نکنید.

bash
curl --noproxy '*' --interface '127.0.0.2' --fail http://127.0.0.1:18080/index.html
sudo tail -n 20 '/srv/academy-crowdsec/logs/nginx-error.log'
sudo '/srv/academy-crowdsec/crowdsec-v1.8.1/cmd/crowdsec-cli/cscli' -c '/srv/academy-crowdsec/config/engine.yaml' alerts list
14

قدم بعدی

فقط Nginx همین آزمایشگاه را متوقف کنید

prefix، فایل تنظیمات و PID اختصاصی، همین Nginx را انتخاب می‌کنند. موتور ترمینال A را با Ctrl+C متوقف کنید. برای بررسی مسدودسازی اشتباه شواهد خصوصی را نگه دارید؛ سرویس، تصمیم یا لاگ نامرتبط را پاک نکنید. لغو کلید افشاشده در کادر جدا آمده است و در حالت live می‌تواند به عبور ترافیک بینجامد.

bash

ترمینال ماشین آزمایشگاهی مستقل

sudo nginx -p '/srv/academy-crowdsec/' -c '/srv/academy-crowdsec/config/nginx.conf' -s quit
از کجا بدانم درست انجام شد؟

فقط listener اختصاصی Nginx بسته می‌شود و فایل‌های خصوصی برای بررسی می‌مانند.

همهٔ آموزش‌های آکادمی ↗