WIUNIX ACADEMY
آموزش CrowdSec و Nginx؛ لاگ معتبر، LAPI خصوصی و مسدودسازی قابلبازگشت
صفحهٔ 4 از 5؛ مراحل قبلی و پیشنیازها را پیش از ادامه مرور کن.
آموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
آیپی، دامنه یا پورت مثالها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای بهروزشده را کپی کن.
تنظیم مقادیر برای محیط من7 مقدار قابلتغییر
قدم بعدی
خواندن لاگ، پارسر و احراز هویت bouncer را ببینید
اول درخواست بسازید و سپس خروجی را ببینید. رویداد loopback ممکن است در کالکشن مجاز شناخته شود؛ این به معنی خرابی پارسر نیست. explain سرریز سناریو را آزمایش نمیکند. ثبت نام bouncer کافی نیست؛ دریافت احرازشدهٔ اخیر و پاسخ واقعی403 نیز لازم است.
ترمینال ماشین آزمایشگاهی مستقل
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 دیده میشود.
قدم بعدی
فقط IP محلی تحتکنترل را موقتاً مسدود کنید
یک تصمیم۳۰ثانیهای بسازید و بیش از کش یکثانیهای صبر کنید. درخواست دوم عمداً دو هدر رایج IP را جعل میکند؛ چون اتصال TCP آن از مدیریت است باید مجاز بماند. این آزمون اجرای تصمیم را ثابت میکند، نه تشخیص خودکار سناریو.
ترمینال ماشین آزمایشگاهی مستقل
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 است.
قدم بعدی
رفع مسدودی و انقضای همان IP را بررسی کنید
فقط تصمیمهای IP آزمون را حذف کنید، نه همهٔ تصمیمها. تصمیم کوتاه دوم باید پس از انقضا و تازهشدن کش اجازهٔ دسترسی بدهد. در محیط واقعی مسیر کنسول یا SSH مستقل نگه دارید؛ فهرست مجاز جای راه بازیابی را نمیگیرد.
ترمینال ماشین آزمایشگاهی مستقل
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 دارای دادهٔ شخصی استفاده نکنید.
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
قدم بعدی
فقط Nginx همین آزمایشگاه را متوقف کنید
prefix، فایل تنظیمات و PID اختصاصی، همین Nginx را انتخاب میکنند. موتور ترمینال A را با Ctrl+C متوقف کنید. برای بررسی مسدودسازی اشتباه شواهد خصوصی را نگه دارید؛ سرویس، تصمیم یا لاگ نامرتبط را پاک نکنید. لغو کلید افشاشده در کادر جدا آمده است و در حالت live میتواند به عبور ترافیک بینجامد.
ترمینال ماشین آزمایشگاهی مستقل
sudo nginx -p '/srv/academy-crowdsec/' -c '/srv/academy-crowdsec/config/nginx.conf' -s quit
فقط listener اختصاصی Nginx بسته میشود و فایلهای خصوصی برای بررسی میمانند.