انجیناکس؛ شب ۴۸: ممیزی فقطخواندنی بر پایهٔ CIS NGINX
فهرست نوشته
ممیزی باید نشان دهد کدام الزام، در کدام نسخه و با چه شاهدی بررسی شده است. امشب شواهد 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 انتخابشده |
| scope | host/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 .