Server
nginx'ni xavfsiz sozlash: ekspertizadan oldin ko'rib chiqiladigan 10 ta band
Veb-server ilovadan oldin turadigan birinchi qatlam. Versiyani yashirish, default_server, TLS, limitlar, yashirin fayllar, PHP bajarilishini cheklash, rate limiting va loglar.
· 11 daq. o'qish

Ilova kodi qanchalik puxta yozilgan bo'lmasin, har bir so'rov avval veb-serverdan o'tadi. nginx'ning standart sozlamalari "ishlashi" uchun mo'ljallangan, xavfsizlik uchun emas: u versiyasini aytadi, noma'lum domenlarga javob beradi, papkadagi istalgan faylni beradi va har qanday .php faylni bajarishga tayyor. Ekspertizada skanerlar va mutaxassislar aynan shu narsalarni birinchi bo'lib tekshiradi.
Bu maqolada nginx konfiguratsiyasini ekspertizadan oldin ko'rib chiqish uchun 10 ta amaliy bandni, har birini tekshirish buyrug'i va tayyor sozlama bilan beramiz. Misollar PHP (Laravel) ilovasi uchun, lekin ko'pchiligi Node yoki boshqa backend'ga proksi qiluvchi konfiguratsiyaga ham to'g'ri keladi.
Nima uchun bu ekspertiza uchun muhim
Veb-server sozlamalaridagi kamchiliklar ekspertiza hisobotida odatda "ma'lumot ochiqlanishi", "noto'g'ri sozlama" yoki "kriptografik kamchilik" sifatida chiqadi. O'z mahsulotimiz ekspertizasida topilgan oltita topilmadan ikkitasi to'g'ridan-to'g'ri server qatlamiga tegishli edi: host header injection (tuzatishning bir qismi nginx'da default_server qo'shish bo'ldi) va internetdan ochiq turgan portlar. Bular haqida alohida yozganmiz: host header injection va ochiq portlar va server hardening.
Ishni boshlashdan oldin joriy konfiguratsiyani to'liq ko'ring va har bir o'zgarishdan keyin sintaksisni tekshiring:
sudo nginx -T | less # barcha include'lar bilan to'liq konfiguratsiya
sudo nginx -t && sudo systemctl reload nginx
1. Versiyani yashirish: server_tokens
Standart holatda nginx Server headerida va xato sahifalarida versiyasini ko'rsatadi. Bu hujumchiga qaysi zaifliklarni sinash kerakligini aytadi.
Tekshirish:
curl -sI https://your-domain.uz | grep -i server
curl -s https://your-domain.uz/nonexistent-page | tail -5
Tuzatish (http blokida):
server_tokens off;
Shundan keyin Server: nginx qoladi, lekin versiyasiz. Ilova o'zi qo'shadigan X-Powered-By: PHP/... headerini ham olib tashlang: php.ini da expose_php = Off yoki nginx'da fastcgi_hide_header X-Powered-By;.
2. default_server: noma'lum domenlarni rad etish
Serverga IP manzil yoki begona domen bilan so'rov kelsa, nginx uni default_server ga, u belgilanmagan bo'lsa birinchi server blokiga yuboradi — ko'pincha asosiy saytga. Bu host header injection uchun yo'l ochadi va saytingizni IP orqali skanerlash imkonini beradi.
Tekshirish:
curl -skI https://SERVER_IP/
curl -skI https://your-domain.uz/ -H "Host: attacker.example"
Tuzatish — alohida "tutib qoluvchi" blok:
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_reject_handshake on; # nginx 1.19.4+
return 444;
}
3. TLS sozlamalari
Eski protokollar (SSLv3, TLS 1.0, TLS 1.1) va zaif shifrlar ekspertizada kriptografik kamchilik sifatida qayd etiladi. Zamonaviy amaliyot — faqat TLS 1.2 va 1.3. Shifrlar ro'yxatini qo'lda tuzish o'rniga Mozilla SSL Configuration Generator'ning "intermediate" profilidan foydalanish qulay.
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
HTTP'dan HTTPS'ga yo'naltirish va HSTS headerini ham qo'shing — bu haqida xavfsizlik headerlari maqolasida batafsil.
Tekshirish:
openssl s_client -connect your-domain.uz:443 -tls1_1 </dev/null # ulanish rad etilishi kerak
nmap --script ssl-enum-ciphers -p 443 your-domain.uz
Chuqurroq tahlil uchun ochiq manbali testssl.sh vositasi ham qulay.
4. Yashirin va xizmat fayllarini berkitish
.env, .git/, composer.json, package.json, zaxira arxivlari va SQL dump'lar — veb ildiz papkasida qolib ketsa, ular oddiy fayl sifatida yuklab olinadi. .env da baza paroli va ilova kalitlari, .git da esa butun kod tarixi bo'ladi.
Tekshirish:
for p in .env .git/config .git/HEAD composer.json composer.lock \
package.json backup.zip db.sql .DS_Store; do
printf "%-16s %s\n" "$p" "$(curl -s -o /dev/null -w '%{http_code}' https://your-domain.uz/$p)"
done
Hammasi 404 yoki 403 bo'lishi kerak.
Birinchi qadam — to'g'ri root: Laravel'da u loyiha ildizi emas, public/ papkasi bo'lishi shart. Keyin qo'shimcha himoya:
root /var/www/app/public;
# .well-known (Let's Encrypt) dan tashqari barcha nuqta bilan boshlanuvchi yo'llar
location ~ /\.(?!well-known/) {
deny all;
}
location ~* \.(sql|bak|old|orig|swp|zip|tar|gz|7z|log|ini|sh)$ {
deny all;
}
autoindex off;
5. PHP faqat kerakli joyda bajarilsin
Ko'p konfiguratsiyalarda location ~ \.php$ bloki bor — ya'ni har qanday .php fayl bajariladi. Agar hujumchi fayl yuklash funksiyasi orqali uploads/ papkasiga PHP fayl joylashtira olsa, bu darhol kod bajarishga aylanadi. Laravel'da esa yagona kirish nuqtasi — index.php.
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# faqat index.php bajariladi
location = /index.php {
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
}
# boshqa .php fayllar — 404
location ~ \.php$ {
return 404;
}
Sokket yo'li tizimingizdagi PHP versiyasiga mos bo'lishi kerak. WordPress yoki bir nechta PHP kirish nuqtasi bo'lgan ilovalarda hech bo'lmaganda yuklash papkalarida bajarishni o'chiring:
location ^~ /wp-content/uploads/ {
location ~ \.php$ { deny all; }
}
Fayl yuklash bo'yicha boshqa himoya choralari alohida maqolada.
6. So'rov hajmi va vaqt chegaralari
Cheklanmagan so'rov hajmi va uzun timeout'lar serverni sekin so'rovlar bilan band qilish imkonini beradi.
client_max_body_size 10m; # ilovangizdagi eng katta yuklashga moslang
client_body_timeout 15s;
client_header_timeout 15s;
send_timeout 15s;
keepalive_timeout 30s;
large_client_header_buffers 4 8k;
Qiymatlar ilovaga bog'liq: fayl yuklash bo'lmagan API uchun client_max_body_size ni ancha kichik qilish mumkin, katta hujjatlar qabul qiladigan alohida location uchun esa kattaroq.
7. Rate limiting
Login, parolni tiklash, OTP va SMS yuborish endpointlari parol tanlash va pullik xizmatlarni suiiste'mol qilish uchun asosiy nishon. Ilova darajasidagi cheklov (masalan, Laravel throttle) bilan birga nginx'da ham chegara qo'yish foydali.
# http blokida
limit_req_zone $binary_remote_addr zone=auth:10m rate=5r/m;
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=perip:10m;
# server blokida
limit_req_status 429;
limit_conn perip 20;
location = /login {
limit_req zone=auth burst=5 nodelay;
try_files $uri /index.php?$query_string;
}
location /api/ {
limit_req zone=api burst=20 nodelay;
try_files $uri /index.php?$query_string;
}
Agar nginx boshqa proksi yoki CDN orqasida bo'lsa, $binary_remote_addr proksi manzili bo'ladi va barcha foydalanuvchilar bitta limitga tushadi. Bu holda set_real_ip_from bilan faqat ishonchli proksi manzilini ko'rsating va real_ip_header ni belgilang.
Tekshirish:
for i in $(seq 1 15); do
curl -s -o /dev/null -w "%{http_code} " -X POST https://your-domain.uz/login
done; echo
Bir necha urinishdan keyin 429 paydo bo'lishi kerak.
8. HTTP usullarini cheklash
Ilovangiz ishlatmaydigan usullar (TRACE, CONNECT va boshqalar) ochiq qolmasin:
if ($request_method !~ ^(GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS)$) {
return 405;
}
Faqat statik sayt bo'lsa, ro'yxatni GET|HEAD gacha qisqartiring.
9. Proksi headerlari
nginx Node yoki boshqa backend'ga proksi qilsa, mijoz yuborgan headerlarni ko'r-ko'rona uzatmang:
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host "";
proxy_hide_header X-Powered-By;
}
Backend esa faqat 127.0.0.1 da tinglashi kerak, tashqi interfeysda emas — aks holda nginx'dagi barcha himoya chetlab o'tiladi.
10. Loglar
Loglarsiz hodisani aniqlash ham, tahlil qilish ham mumkin emas. Shu bilan birga loglarga maxfiy ma'lumot tushmasligi kerak.
log_format main '$remote_addr - [$time_local] "$request_method $uri $server_protocol" '
'$status $body_bytes_sent "$http_referer" "$http_user_agent" '
'rt=$request_time';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
Bu formatda $request o'rniga $uri ishlatilgan — query string loglarga tushmaydi, chunki unda ba'zan tokenlar yoki shaxsiy ma'lumotlar bo'ladi. Agar query kerak bo'lsa, buni ongli qaror sifatida qabul qiling. Loglar logrotate bilan aylantirilishi, ularga kirish huquqi esa cheklangan bo'lishi kerak.
Bitta tuzoq: add_header merosi
nginx'da add_header ichki location blokida ishlatilsa, tashqi server blokidagi barcha add_header lar o'sha location uchun bekor bo'ladi. Masalan, server darajasida HSTS va CSP qo'yib, keyin location /api/ da CORS headerini qo'shsangiz, API javoblarida HSTS yo'qoladi. Har bir location'da kerakli headerlarni takrorlang yoki ularni umumiy faylga chiqarib, include qiling. Natijani albatta curl -sI bilan tekshiring.
nginx'ning standart sozlamasi "ishlaydi" degani — "xavfsiz" degani emas. Har bir band bir necha qator konfiguratsiya, lekin ekspertizada har biri alohida topilma bo'lishi mumkin.
Checklist
server_tokens off,X-Powered-Byyashirilgan.default_serverbloki noma'lum domen va IP so'rovlarini rad etadi.- Faqat TLS 1.2 va 1.3, zamonaviy shifrlar, HTTP'dan HTTPS'ga yo'naltirish, HSTS.
root—public/papka;.env,.git, zaxira va dump fayllar404/403.autoindex off.- PHP faqat
index.php(yoki kerakli fayllar) uchun bajariladi; yuklash papkalarida o'chirilgan. client_max_body_sizeva timeout'lar ilovaga moslangan.- Login, OTP, API uchun
limit_req; proksi orqasida real IP to'g'ri olinadi. - Ishlatilmaydigan HTTP usullari
405. - Proksi headerlari nazoratda, backend faqat
127.0.0.1da. - Loglar yoqilgan, maxfiy ma'lumotsiz, aylantiriladi.
- Har bir location'da kerakli xavfsizlik headerlari mavjud.
Xulosa
nginx — ilovangizning old eshigi. Yuqoridagi o'nta band bir kunlik ish, lekin ular ekspertizada eng ko'p uchraydigan "oson" topilmalarning katta qismini yopadi va ilova qatlamidagi xatolar uchun qo'shimcha himoya beradi.
Server konfiguratsiyangizni ekspertizadan oldin ko'rib chiqmoqchimisiz? Skanerlash uchun ariza qoldiring — Claude AI agenti nginx va server sozlamalarini tez tahlil qiladi, mutaxassisimiz topilmalarni tasdiqlab, teshiklarni yopishga yordam beradi.


