آپاچی؛ شب ۴۳: سختسازی پایهٔ Apache و بستن مسیرهای اضافی
فهرست نوشته
Hardening یا سختسازی یعنی کم کردن سطح حمله با حفظ قابلیت لازم. امشب ماژولها، فایلهای منتشرشده و میزبان پیشفرض را بررسی میکنیم؛ هر حذف باید آزمون بازگشت داشته باشد.
این جلسه بخشی از دورهٔ آپاچی در ۵۰ شب است. قرارداد نامها، مسیرها و روش اعمال تغییر را در راهنمای دوره بخوان.
محیط: مسیر اصلی event/FPM، CGI و Actionهای آزمایشی حذف شدهاند؛ تمام سایتها سالماند و backup دارند.
تنظیمهای global#
در فایل global اختصاصی دوره اضافه کن:
ServerTokens Prod
ServerSignature Off
TraceEnable Off
اینها جزئیات بنر و امضای صفحات خطا را کم و روش TRACE را خاموش میکنند. پنهان کردن نسخه جای نصب اصلاح امنیتی نیست. ماژولهای فعال را با -M ثبت کن؛ cgi/cgid، actions، info یا autoindex را فقط اگر هیچ سایت نیاز ندارد حذف کن. status برای مانیتورینگ خصوصی ممکن است نیاز مستند باشد.
در هر میزبان فایلهای خصوصی و پشتیبان را حفاظت کن:
<FilesMatch "(?i)(^\.|(?:\.bak|\.old|\.orig|\.save|\.swp|\.sql)$|~$)">
Require all denied
</FilesMatch>
این policy همهٔ archiveها یا secret با نام غیرمنتظره را نمیشناسد؛ اصل کار، نداشتن backup و repository زیر webroot است. مسیر ACME، Aliasها و دانلودهای مجاز را هم تست کن. برای WordPress حفاظت صریح wp-config شب چهلم باقی بماند.
FilesMatch عمدتاً نام فایل نهایی را میبیند؛ حفاظت .env الزاماً درخواست /.git/config را نمیبندد. برای مسیرهای پنهان یک محدودیت URL هم در هر میزبان اضافه کن و .well-known لازم برای ACME را مستثنا نگه دار:
<LocationMatch "(?:^|/)\.(?!well-known(?:/|$))">
Require all denied
</LocationMatch>
درخواست /.git/config باید رد شود و فایل challenge مجاز زیر /.well-known/acme-challenge/ همچنان قابل خواندن باشد؛ repository واقعی را برای این آزمون زیر webroot کپی نکن.
HTTPS پیشفرض#
به فایل 000-catchall.conf یک بلوک پورت 443 قبل از سایتهای واقعی اضافه کن:
<VirtualHost *:443>
ServerName catchall.invalid
SSLEngine on
SSLCertificateFile /etc/apache-lab/tls/www.crt
SSLCertificateKeyFile /etc/apache-lab/tls/www.key
<Location />
Require all denied
</Location>
</VirtualHost>
گواهی lab نام catchall را تأیید نمیکند؛ TLS با SNI ناشناس نباید هویت معتبر یک سایت را جعل کند. با -S ترتیب هر دو پورت را ببین؛ درخواست دارای SNI معتبر www ولی Host ناشناس هم نباید محتوای برنامه بدهد.
روشهای HTTP بهاندازهٔ نیاز#
برای سایت صرفاً ثابت www میتوان در Directory یک LimitExcept GET HEAD با Require all denied گذاشت. این محدودیت را روی REST API یا WordPress کور اعمال نکن؛ OPTIONS، POST، PUT و DELETE ممکن است نیاز واقعی برنامه باشند.
آزمون و بازگشت: فایل ساختگی .env و backup.sql بدون راز را درخواست بده؛ باید رد شوند. TRACE را با curl آزمایش کن و بعد فایلهای ساختگی را حذف کن. هر ماژول را جدا حذف، نحو و تمام قابلیتهای مربوط را بررسی و در خرابی config سالم را برگردان.
منبع: نکات امنیتی Apache ، ServerTokens و TraceEnable .