انجیناکس؛ شب ۵۰: پروژهٔ نهایی، آزمون خرابی و تحویل دوره
فهرست نوشته
پایان دوره یک 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ها |
| WAF | engine/connector/CRS، policy، استثناها و آزمونها |
| کانتینر | image digest، Compose، UID/GID، mountها و ports |
| stream | protocol/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 .