WIUNIX ACADEMY
آموزش CrowdSec و Nginx؛ لاگ معتبر، LAPI خصوصی و مسدودسازی قابلبازگشت
آزمایشگاه مستقل CrowdSec و bouncer مبتنی بر Lua بسازید؛ پاسخ مسدودسازی، رفع مسدودی، انقضا، هدر جعلی و رفتار قطع API را بررسی کنید.
محیطت را انتخاب کنآموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
آیپی، دامنه یا پورت مثالها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای بهروزشده را کپی کن.
تنظیم مقادیر برای محیط من7 مقدار قابلتغییر
از اینجا شروع کن
در پایان چه چیزی خواهی داشت؟
زنجیرهٔ تصمیم محلی تا پاسخ HTTP را بررسی کنید.
سیستمعاملها و نسخههای پوششدادهشده
مسیر سیستمعاملها مستند است؛ آزمون ایزوله جای پذیرش تولید را نمیگیرد.
قبل از شروع
- ماشین تازهٔ amd64، دسترسی sudo و ماژول Lua سازگار.
- کنسول بازیابی مستقل؛ بدون ترافیک تولید.
تشخیص و مسدودسازی را جداگانه بسنجید
در این آزمایشگاه، موتور CrowdSec لاگ Nginx را میخواند، تصمیمها در Local API نگهداری میشوند و bouncer مبتنی بر Lua درخواست را بررسی میکند. همهچیز در مسیر اختصاصی /srv/academy-crowdsec و روی loopback اجرا میشود تا پیش از انتقال به محیط عملیاتی، مرز هر جزء مشخص باشد.
این آموزش برای ادمین لینوکس است و پس از آمادهسازی حدود۵۵دقیقه زمان میبرد. خواندهشدن لاگ، تشخیص سناریو و پاسخ مسدودسازی سه نتیجهٔ متفاوتاند. هر سه را باید بررسی کرد؛ صرف نصب موتور به معنی حفاظت Nginx نیست. احراز هویت، محدودسازی درخواست و وصلههای امنیتی همچنان لازماند.
مقدار عمومی را تغییر دهید، اعمال کنید و بعد کپی بگیرید
فرم تنظیمات را باز کنید، نمونههای عمومی را تغییر دهید و «اعمال» را بزنید؛ سپس از کادر دستور کپی بگیرید. تا پیش از اعمال یا هنگام نامعتبر بودن مقدار، کپی غیرفعال است. کلید API، گذرواژه، کلید خصوصی و لاگ شخصی جایی در این فرم ندارند. کلید bouncer مستقیماً در فایل خصوصی ساخته میشود.
مقدارها و پیشرفت سفارشی در sessionStorage همین تب، زبان، مقاله و سیستمعامل میمانند؛ پیشرفت حالت پیشفرض در localStorage است. بازنشانی، نمونههای بررسیشده را برمیگرداند. شخصیسازی متن آزمون اجرا نمیکند. 127.0.0.2 باید روی loopback و بیرون از محدودهٔ مدیریت 127.0.0.1/32 باشد؛ بررسی اولیه این رابطه را کنترل میکند.
ماشین خالی amd64 و بستهٔ Lua سازگار
یک ماشین مجازی تازه با sudo و معماری x86_64 آماده کنید. فایل انتشار این راهنما باینری Linux amd64 دارد. مسیر پیشفرض Ubuntu26.10 است؛ نسخههای LTS و Debian هم مسیر مستند دارند. Nginx توزیع و ماژول Lua باید از مخزن سازگار باشند؛ ترکیب باینری nginx.org با ماژول توزیع میتواند به خطای ABI برسد. OpenResty، Lua داخلی دارد اما مسیر و بستهبندی متفاوت آن در این دستورالعمل پوشش داده نمیشود.
فضای دیسک، کاندید بستهها و آزادبودن پورتها را بررسی کنید. نصب بسته ممکن است Nginx پیشفرض ماشین آزمایشی را روشن کند؛ نمونهٔ ما فقط تنظیمات اختصاصی و پورت loopback 18080 را میخواند. LAPI روی پورت محلی 18081 است. این آزمایشگاه فایروال، سرویس عمومی، ثبت Console یا CAPI، کپچا و AppSec را فعال نمیکند.
قدم بعدی
وابستگیهای Nginx و Lua را نصب کنید
این دستور فقط برای ماشین خالی آزمایش است. پیش از تأیید نصب، نسخهٔ کاندید و وابستگی ماژول Lua را ببینید؛ نبود بستهٔ سازگار را با مخلوطکردن مخازن جبران نکنید. وجود بسته بهتنهایی تعهد پشتیبانی CrowdSec نیست.
ترمینال ماشین آزمایشگاهی مستقل
set -eu
. /etc/os-release
test "$ID" = 'ubuntu'
test "$VERSION_CODENAME" = 'stonking'
sudo apt-get update
apt-cache policy nginx libnginx-mod-http-lua lua-cjson luarocks
sudo apt-get install --no-install-recommends nginx libnginx-mod-http-lua lua5.1 lua-cjson luarocks python3 python3-yaml curl ca-certificates nano
nginx -v
dpkg-query -W nginx libnginx-mod-http-lua lua-cjson luarocks python3
بستههای Nginx، ماژول Lua، Python/YAML و LuaRocks نصب و نسخههای واقعی چاپ میشوند.
قدم بعدی
معماری، پورت و جدایی IP آزمون را بررسی کنید
آدرس 127.0.0.2 باید در127/8 و متعلق به همین ماشین باشد. 127.0.0.1/32 را برای مدیریت مورداعتماد بگذارید؛ تمام بازدیدکنندهها را در آن قرار ندهید.
ترمینال ماشین آزمایشگاهی مستقل
set -eu
test "$(uname -m)" = x86_64
sudo python3 - <<'PY'
import socket,ipaddress
assert ipaddress.ip_address('127.0.0.2') in ipaddress.ip_network('127.0.0.0/8'), 'Test source must be loopback'
assert ipaddress.ip_address('127.0.0.2') not in ipaddress.ip_network('127.0.0.1/32'), 'Test source is allowlisted'
for port in (18080,18081,18082):
with socket.socket() as s: s.bind(('127.0.0.1',port))
print('amd64, separate free ports and test source: OK')
PY
پیام OK چاپ میشود؛ تداخل پورت یا قرارگرفتن IP آزمون در فهرست مجاز اجرای مرحله را متوقف میکند.
قدم بعدی
مسیر اختصاصی را بدون بازنویسی رزرو کنید
والد مسیر باید از قبل وجود داشته باشد و فقط root روی آن اختیار نوشتن داشته باشد. مسیر موجود، پیوند نمادین و والد قابلنوشتن برای دیگران رد میشود. برای آزمایش تازه یک ریشهٔ جدید انتخاب کنید.
ترمینال ماشین آزمایشگاهی مستقل
sudo python3 - <<'PY'
import os,stat,grp
from pathlib import Path
r=Path('/srv/academy-crowdsec')
assert r.is_absolute() and str(r) not in ('/','/srv','/opt','/etc','/tmp')
for p in reversed(r.parents):
m=p.lstat()
assert stat.S_ISDIR(m.st_mode) and m.st_uid==0 and not m.st_mode & 0o022, 'Unsafe parent'
r.mkdir(mode=0o750)
os.chown(r,0,grp.getgrnam('www-data').gr_gid)
for name in ('downloads','config','data','hub','logs','run','www','notifications','plugins'):
p=r/name;p.mkdir(mode=0o700 if name in ('config','data') else 0o755)
(r/'www'/'index.html').write_text('academy-ok\n',encoding='utf-8')
for name in ('engine.yaml','acquis.yaml','profiles.yaml','simulation.yaml','nginx.conf'):
fd=os.open(r/'config'/name,os.O_WRONLY|os.O_CREAT|os.O_EXCL|os.O_NOFOLLOW,0o600);os.close(fd)
print('Exclusive lab root and empty editor files created')
PY
مسیر جدید و فایلهای خالی آمادهاند؛ اجرای دوباره با خطا متوقف میشود.