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

این جلسه بخشی از دورهٔ انجین‌اکس در ۵۰ شب است. قرارداد آزمایشگاه، مسیرها و روال اعمال تغییر در راهنمای دوره آمده است.

محیط: یک اجرای مستقل از مسیر Debian/Ubuntu و یک اجرای مستقل از مسیر Alma/Rocky، با Snapshotها و آزمون‌های ثبت‌شده. برای پوشش کامل چهار توزیع، هر شاخه را روی هر دو عضو آن تکرار کن؛ موفقیت Debian جای آزمون Ubuntu نیست.

سرویس‌هایی که تحویل می‌دهی#

www.nginx.test محتوای static و TLS معتبر دارد؛ app.nginx.test پراکسی برنامهٔ systemd با WebSocket و SSE است؛ wp.nginx.test روی pool اختصاصی PHP-FPM و database محلی کار می‌کند. admin.nginx.test از IP مجاز، احراز هویت و در شاخهٔ مربوط mTLS استفاده می‌کند. ورودی کانتینری مستقل روی port ثبت‌شده و streamها فقط در شبکهٔ آزمایشگاه فعال‌اند.

بین تمرین‌ها policy موقت را با policy نهایی مخلوط نکن: محدودیت آزمایشی بزرگ.bin، probeهای WAF/cache/PHP و endpointهای یادگیری از انتشار واقعی کنار گذاشته شوند. گواهی و CA آزمایشگاه با ACME عمومی یکسان نیستند؛ اگر شاخهٔ ACME را اجرا نکرده‌ای، نتیجهٔ تمدید عمومی را موفق گزارش نکن.

سند بازتولید#

بخشartifact و اطلاعات لازم
سیستمتوزیع/release، Nginx package و source repo، PHP/FPM، database
configنسخهٔ پاک‌سازی‌شده، contextها، module loaderها و hash
اعتمادنام‌های TLS، issuer، peerهای trusted، ACL IPv4/IPv6
برنامهنسخه/وابستگی‌ها، unit، مسیر writable و accountها
WAFengine/connector/CRS، policy، استثناها و آزمون‌ها
کانتینرimage digest، Compose، UID/GID، mountها و ports
streamprotocol/port، backend، ACL، timeout و PROXY protocol
عملیاتbackup/restore، rotation، renewal، rollback و worksheet CIS

raw nginx -T، database dump، کلید یا wp-config رازدار در گزارش عمومی قرار نمی‌گیرند. جای مقدار حساس را توضیح بده و روش تحویل امن راز را خارج گزارش مشخص کن.

ماتریس پذیرش#

از کلاینت ۲۰ TLS معتبر و محتوای صحیح را ببین؛ از ۲۱ با CA معتبر و credential صحیح رد ACL را ثابت کن. credential غلط از ۲۰ باید رد شود. X-Forwarded-For جعلی از peer نامعتبر نباید هویت مجاز بسازد. HTTP/2 را با کلاینت دارای قابلیت و نسخهٔ negotiated، WSS را با echo و SSE را با فاصلهٔ دریافت پیام بررسی کن.

burst کنترل‌شده باید rate limit موردنظر را نشان دهد، ولی درخواست عادی باقی بماند. WAF برای ورودی سالم و نمونهٔ حملهٔ آزمایشگاهی نتیجهٔ متفاوت و log قابل ردیابی بدهد. وردپرس باید upload تصویر را بپذیرد و PHP upload را اجرا نکند؛ FPM متوقف باید 5xx بدهد، نه سورس.

در کانتینر، مستقیم از بیرون به backend دسترسی نباشد و پس از recreate backend، مسیر جدید درخواست سالم شود. stream TCP/UDP از ۲۰ کار کند و از ۲۱ رد شود؛ passthrough نام صحیح را به backend درست ببرد و بدون SNI/نام ناشناخته به سایت مجاز نرسد. دسترسی IPv6 را با policy متناظر بسنج یا به‌طور مشخص خارج scope و بسته بودن listener/مسیر را ثبت کن.

سناریوی خرابی و بازیابی#

در clone یکی‌یکی backend برنامه، FPM و یک upstream TCP را متوقف کن و symptom/log/بازگشت را ثبت کن. config اشتباه را روی دیسک قرار بده و ثابت کن nginx -t مانع reload برنامه‌ریزی‌شده می‌شود؛ سپس config سالم را برگردان. یک backup را روی VM تازه restore کن و سند بازیابی را با زمان واقعی تکمیل کن.

برای TLS، یک backend با نام گواهی نامعتبر انتخاب کن؛ verify باید failure بسازد. برای container، digest قبلی را برگردان و آزمون تازه بفرست. خطاهای نمونه در متن دوره خروجی تضمین‌شدهٔ همهٔ releaseها نیستند؛ نتیجهٔ مشاهده‌شدهٔ خودت را ثبت کن.

معیار پایان: همهٔ مسیرهای ضروری سالم، شاهدهای منفی درست، rollback و restore اجراشده، رازها محفوظ و موارد CIS با نسخه و scope معلوم باشند. بخش آزموده‌نشده را «آزموده‌نشده» بنویس؛ حتی یک گزارش بدون failure، خودبه‌خود گواهی compliance نیست.

منبع: مدیریت فرایند Nginx ، CIS NGINX ، backup WordPress .