ممیزی باید نشان دهد کدام الزام، در کدام نسخه و با چه شاهدی بررسی شده است. امشب شواهد Nginx را بدون تغییر سرویس جمع می‌کنیم و مرز بررسی دستی و scanner را روشن می‌کنیم.

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

محیط: ماشین خودت، دسترسی sudo و فضای خصوصی برای evidence؛ نسخهٔ دقیق Nginx، OS و scope میزبان/کانتینر مشخص است. این دوره آموزش مستقل است و تأییدیه یا امتیاز رسمی CIS صادر نمی‌کند.

انتخاب معیار پیش از audit#

CIS مخفف Center for Internet Security است. در زمان تدوین دوره، صفحهٔ رسمی NGINX نسخهٔ Benchmark 3.0.0 را معرفی می‌کند؛ نسخهٔ قابل اسکن ذکرشده برای CIS-CAT Pro در همان صفحه 2.1.0 است. نسخهٔ PDF انتخاب‌شده و پوشش scanner را یکی فرض نکن. از صفحهٔ رسمی، benchmark مجاز به استفاده را دریافت کن و نام، نسخه، تاریخ دریافت و hash آن را ثبت کن؛ متن کامل copyrighted آن را در مخزن دوره بازنشر نکن.

profile و applicability را از همان PDF انتخاب کن. NGINX OSS/Plus، میزبان systemd، image کانتینری، stream، WAF و ورودی چندپراکسی scope یکسان ندارند. برای هر کنترل شماره و عنوان واقعی PDF را در worksheet محلی بنویس؛ شمارهٔ حدسی یا checklist عمومی را CIS control معرفی نکن.

جمع‌آوری evidence محدود#

فرمان‌های زیر target را تغییر نمی‌دهند، ولی فایل evidence خصوصی می‌سازند. nginx -T و service properties ممکن است راز آشکار کنند؛ پوشهٔ خروجی در public نیست و raw آن منتشر نمی‌شود.

sudo -i
umask 077
AUDIT_DIR=$(mktemp -d /var/tmp/nginx-audit.XXXXXX)
date -u +%FT%TZ > "$AUDIT_DIR/time.txt"
cat /etc/os-release > "$AUDIT_DIR/os.txt"
nginx -V > "$AUDIT_DIR/nginx-build.txt" 2>&1
nginx -t > "$AUDIT_DIR/config-test.txt" 2>&1
nginx -T > "$AUDIT_DIR/effective-config.txt" 2>&1
systemctl cat nginx > "$AUDIT_DIR/systemd-unit.txt"
systemctl show nginx -p User -p Group -p NoNewPrivileges -p ProtectSystem \
  -p ProtectHome -p PrivateTmp -p LimitNOFILE > "$AUDIT_DIR/systemd-properties.txt"
ss -lntup > "$AUDIT_DIR/listeners.txt"
stat -c '%U:%G %a %n' /etc/nginx/nginx.conf /etc/nginx/tls/web.key \
  > "$AUDIT_DIR/file-permissions.txt"
exit

در شکست هر فرمان، همان شکست را ثبت کن و آن شاهد را کامل تلقی نکن. خروجی nginx -t فقط syntax و دسترسی فایل‌ها را بررسی می‌کند؛ policy runtime، صحت TLS بیرونی و سلامت backend را ثابت نمی‌کند. فعال بودن service هم نشان‌دهندهٔ config آخر روی دیسک نیست؛ نتیجهٔ آخرین reload و درخواست تازه را بررسی کن.

خارج از shell بالا، نسخهٔ کامل بسته‌ها با dpkg-query یا rpm، وضعیت update/advisory، permission والد با namei/getfacl، SELinux با getenforce/ls -Z و policy firewall را ثبت کن. کانتینر به‌جای systemctl داخل آن، digest، docker inspect، mountها، user و published ports واقعی را می‌خواهد. کلید خصوصی و محتوای credential را cat نکن.

worksheet و آزمون runtime#

فیلدمحتوای لازم
کنترلشماره و عنوان از نسخهٔ PDF انتخاب‌شده
scopehost/container، HTTP/stream و نقش پراکسی
applicabilityقابل اعمال یا دلیل مستند عدم کاربرد
evidenceفرمان/فایل/درخواست، زمان و نسخهٔ artifact
نتیجهمطابق، نامطابق یا نیازمند بررسی دستی
اقدامتغییر کوچک پیشنهادی، مسئول و آزمون بازگشت

TLS با CA و نام معتبر، رد نام ناشناخته، رد IP ۲۱ با credential معتبر، هدر روی پاسخ سالم/خطا، عدم اجرای upload PHP و باز نبودن backend را از کلاینت واقعی بسنج. وجود رشتهٔ deny all در یک فایل اثبات policy نیست؛ context، inheritance و realip می‌توانند معنای آن را عوض کنند.

محدودیت scanner#

اگر مجوز CIS-CAT Pro داری، فقط ابزار و assessment رسمی سازگار با benchmark انتخاب‌شده را اجرا کن. خروجی نسخهٔ 2.1.0 را به نام compliance 3.0.0 گزارش نکن؛ فاصلهٔ کنترل‌ها باید دستی و مستند پوشش داده شود. «manual» را با نبودن failure به pass تبدیل نکن. این جلسه هیچ auto-remediation اجرا نمی‌کند.

بازگشت: تغییر سرویس نداریم؛ evidence خام را با retention محدود نگه دار و فقط گزارش پاک‌سازی‌شده را منتقل کن. در شب بعد، remediation بر اساس موارد واقعی انجام می‌شود.

منبع: Benchmark رسمی CIS NGINX و پوشش CIS-CAT ، CIS-CAT Pro ، گزینه‌های بررسی Nginx .