yusufkhon-guard 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +734 -0
  3. package/bin/cli.js +39 -0
  4. package/bin/renew.js +149 -0
  5. package/bin/scan.js +124 -0
  6. package/bin/ssl.js +181 -0
  7. package/package.json +80 -0
  8. package/src/index.js +206 -0
  9. package/src/modules/acme/client.js +240 -0
  10. package/src/modules/acme/csr.js +172 -0
  11. package/src/modules/acme/detectDomains.js +132 -0
  12. package/src/modules/acme/index.js +211 -0
  13. package/src/modules/acme/jose.js +125 -0
  14. package/src/modules/acme/renew.js +89 -0
  15. package/src/modules/adaptiveRateLimiter.js +154 -0
  16. package/src/modules/alerts.js +168 -0
  17. package/src/modules/bodyLimit.js +106 -0
  18. package/src/modules/botDetector.js +144 -0
  19. package/src/modules/connectionGuard.js +128 -0
  20. package/src/modules/csrf.js +130 -0
  21. package/src/modules/dashboard.js +257 -0
  22. package/src/modules/dashboardHtml.js +235 -0
  23. package/src/modules/datacenterRanges.js +121 -0
  24. package/src/modules/ddosGuard.js +323 -0
  25. package/src/modules/firewall.js +239 -0
  26. package/src/modules/geoBlock.js +169 -0
  27. package/src/modules/headers.js +130 -0
  28. package/src/modules/honeypot.js +149 -0
  29. package/src/modules/httpsRedirect.js +67 -0
  30. package/src/modules/integrity.js +164 -0
  31. package/src/modules/ipBlocker.js +372 -0
  32. package/src/modules/ja3.js +155 -0
  33. package/src/modules/logExport.js +134 -0
  34. package/src/modules/nosqlGuard.js +143 -0
  35. package/src/modules/osFirewall.js +182 -0
  36. package/src/modules/rateLimiter.js +196 -0
  37. package/src/modules/sanitizer.js +253 -0
  38. package/src/modules/threatDetector.js +202 -0
  39. package/src/scanner/checks/dependencies.js +125 -0
  40. package/src/scanner/checks/environment.js +118 -0
  41. package/src/scanner/checks/exposure.js +99 -0
  42. package/src/scanner/checks/headers.js +119 -0
  43. package/src/scanner/checks/ssl.js +151 -0
  44. package/src/scanner/index.js +209 -0
  45. package/src/utils/cidr.js +140 -0
  46. package/src/utils/logger.js +194 -0
  47. package/src/utils/privilege.js +212 -0
package/README.md ADDED
@@ -0,0 +1,734 @@
1
+ # πŸ›‘οΈ yusufkhon-guard
2
+
3
+ > Express.js va Node.js serverlari uchun **yengil**, **mustaqil (zero-dependency)** xavfsizlik va middleware kutubxonasi.
4
+
5
+ `yusufkhon-guard` serverga kelayotgan HTTP so'rovlarni avtomatik filtrlaydi, zamonaviy xavfsizlik sarlavhalarini o'rnatadi, IP bo'yicha so'rovlarni cheklaydi (DoS/Brute-force himoyasi), kiruvchi ma'lumotlarni tozalaydi (XSS / SQLi) hamda **"blue team" aktiv himoya** orqali hujumlarni real vaqtda aniqlab, hujum manbasini avtomat bloklaydi. Bundan tashqari, o'rnatilgan **audit-skaner** serveringizni tekshirib, SSL/domen va konfiguratsiya muammolarini topadi va xavfsiz tuzatishlarni avtomat bajaradi.
6
+
7
+ [![npm version](https://img.shields.io/badge/npm-1.0.0-red)](https://www.npmjs.com/package/yusufkhon-guard)
8
+ [![license](https://img.shields.io/badge/license-MIT-blue)](./LICENSE)
9
+ [![dependencies](https://img.shields.io/badge/dependencies-0-brightgreen)](#)
10
+
11
+ ---
12
+
13
+ ## ✨ Asosiy imkoniyatlar
14
+
15
+ | Modul | Vazifasi |
16
+ | :--- | :--- |
17
+ | πŸ”₯ **Firewall (Blue Team)** | Har bir so'rovni real vaqtda tahlil qiladi, hujum (SQLi/XSS/skaner/traversal) sezilsa **IP'ni avtomat bloklaydi** va hodisani signalizatsiya qiladi |
18
+ | 🧒 **Security Headers** | `X-Frame-Options`, `X-Content-Type-Options`, `X-XSS-Protection`, `Strict-Transport-Security`, `Content-Security-Policy`, `X-Powered-By` |
19
+ | ⏱️ **Rate Limiter** | Bitta IP'dan kelgan ortiqcha so'rovlarga `429 Too Many Requests` qaytaradi (Memory Store) |
20
+ | 🧼 **Sanitizer** | `req.body`, `req.query`, `req.params` dagi `<script>` teglari va shubhali kontentni tozalaydi |
21
+ | πŸ” **Audit Scanner** | SSL/domen, xavfsizlik sarlavhalari, muhit va bog'liqliklarni tekshiradi; xavfsiz muammolarni avtomat tuzatadi |
22
+ | πŸ” **Consent Layer** | Root/admin talab qiladigan amallarni rozilik so'rab, `sudo`/UAC tasdig'i bilan bajaradi β€” hech qachon jimgina emas |
23
+ | 🧱 **OS Firewall** | Zararli IP'ni tizim firewall'ida (`ufw`/`iptables`/`netsh`) bloklaydi |
24
+ | πŸ“Š **Live Dashboard** | Bloklangan IP va hodisalarni real vaqtda (SSE) ko'rsatuvchi web admin-panel |
25
+ | πŸ“œ **ACME / Let's Encrypt** | Domen uchun bepul SSL sertifikatini to'liq avtomat oladi (native, zero-dep) |
26
+ | 🌊 **L7 DDoS himoyasi** | Global RPS anomaliya + "Under Attack Mode" + concurrency + load-shedding + cookie-challenge + Slowloris himoyasi |
27
+ | 🌍 **Geo-IP / Anti-VPN** | Davlat bo'yicha filtrlash + datacenter/VPN (AWS, Hetzner, OVH…) IP'larini bloklash |
28
+ | 🧠 **Adaptive Rate-Limit** | Xatti-harakatga qarab limitni avtomat qattiqlashtiradi (brute-force/burst) |
29
+ | πŸ€– **Bot / JA3 Fingerprint** | Brauzer vs skript (curl/python) ni HTTP va TLS (JA3) darajasida ajratadi |
30
+ | 🍯 **HoneyPot** | Soxta tuzoq yo'llar (`/.env`, `/wp-login.php`) β€” tushgan IP darhol bloklanadi |
31
+ | 🧬 **NoSQL / CSRF / BodyLimit** | NoSQL-injection, JSON-pollution, CSRF va katta payload (DoS) himoyasi |
32
+ | πŸ”¬ **File Integrity (FIM)** | Muhim fayllar buzilsa (backdoor) hash orqali sezib ogohlantiradi |
33
+ | πŸ”” **Real-Time Alerts** | Telegram / Discord / Webhook orqali instant ogohlantirish + JSON/SIEM log eksport |
34
+ | πŸ”’ **HTTPS Redirect** | HTTP so'rovlarni avtomatik HTTPS'ga yo'naltiradi (301) |
35
+ | πŸ“ **Logger** | Bloklangan IP va xavfsizlik hodisalarini rangli konsol / fayl loglariga yozadi |
36
+
37
+ - βœ… **0 ta tashqi kutubxona** β€” faqat Node.js standart modullaridan foydalanadi.
38
+ - βœ… **Modulli** β€” barcha modullarni birga yoki alohida ishlatish mumkin.
39
+ - βœ… **To'liq sozlanuvchi** β€” har bir modulning o'z parametrlari bor.
40
+
41
+ ---
42
+
43
+ ## πŸ“¦ O'rnatish
44
+
45
+ ```bash
46
+ npm install yusufkhon-guard
47
+ ```
48
+
49
+ > `express` β€” peer dependency. Agar loyihangizda hali bo'lmasa:
50
+ >
51
+ > ```bash
52
+ > npm install express
53
+ > ```
54
+
55
+ ---
56
+
57
+ ## πŸš€ Tezkor boshlash
58
+
59
+ Eng oddiy usul β€” barcha himoya qatlamlarini bitta `guard()` bilan ulash:
60
+
61
+ ```js
62
+ const express = require('express');
63
+ const guard = require('yusufkhon-guard');
64
+
65
+ const app = express();
66
+ app.use(express.json());
67
+
68
+ // Barcha himoya modullarini standart sozlamalar bilan ulaymiz.
69
+ app.use(guard());
70
+
71
+ app.get('/', (req, res) => {
72
+ res.json({ message: 'Xavfsiz server ishlayapti!' });
73
+ });
74
+
75
+ app.listen(3000, () => console.log('Server: http://localhost:3000'));
76
+ ```
77
+
78
+ Tayyor! Endi serveringiz avtomatik ravishda himoyalangan. πŸŽ‰
79
+
80
+ ---
81
+
82
+ ## βš™οΈ Sozlash (Configuration)
83
+
84
+ `guard()` funksiyasiga har bir modul uchun alohida sozlamalar berish mumkin.
85
+ Biror modulni butunlay o'chirish uchun uning qiymatini `false` qiling.
86
+
87
+ ```js
88
+ app.use(
89
+ guard({
90
+ headers: {
91
+ contentSecurityPolicy: "default-src 'self'",
92
+ hsts: { maxAge: 31536000, includeSubDomains: true, preload: true },
93
+ },
94
+ rateLimit: {
95
+ windowMs: 60 * 1000, // 1 daqiqa
96
+ max: 50, // har IP uchun daqiqasiga 50 so'rov
97
+ },
98
+ sanitize: {
99
+ blockOnDetection: true, // shubhali so'rovni 400 bilan rad etadi
100
+ },
101
+ })
102
+ );
103
+
104
+ // Biror modulni o'chirish:
105
+ // app.use(guard({ rateLimit: false }));
106
+ ```
107
+
108
+ ---
109
+
110
+ ## 🧩 Modullardan alohida foydalanish
111
+
112
+ Kerak bo'lsa, har bir middleware'ni mustaqil ravishda ulashingiz mumkin β€”
113
+ masalan, rate-limiter'ni faqat `/api` yo'liga qo'yish:
114
+
115
+ ```js
116
+ const {
117
+ securityHeaders,
118
+ rateLimiter,
119
+ sanitizer,
120
+ } = require('yusufkhon-guard');
121
+
122
+ // Global xavfsizlik sarlavhalari
123
+ app.use(securityHeaders());
124
+
125
+ // Faqat /api uchun qattiqroq rate-limit
126
+ app.use('/api', rateLimiter({ windowMs: 60000, max: 20 }));
127
+
128
+ // Kiruvchi ma'lumotlarni tozalash
129
+ app.use(sanitizer());
130
+ ```
131
+
132
+ ---
133
+
134
+ ## πŸ”₯ "Blue Team" aktiv himoya (Firewall)
135
+
136
+ Bu β€” kutubxonaning eng kuchli qismi. `guard()` ichiga o'rnatilgan **firewall** har bir
137
+ so'rovni real vaqtda tahlil qiladi (`threatDetector`), tahdid ballini hisoblaydi va
138
+ chegara oshganda hujum kelayotgan **IP'ni avtomat bloklaydi** (`ipBlocker`) β€” xuddi
139
+ blue-team etik-haker kabi. Bloklar **progressiv**: 5 daqiqa β†’ 1 soat β†’ 24 soat β†’ doimiy.
140
+
141
+ ```js
142
+ const guard = require('yusufkhon-guard');
143
+
144
+ const shield = guard({
145
+ firewall: {
146
+ banThreshold: 100, // shu ball to'plansa bloklanadi
147
+ instantBanScore: 80, // bitta so'rovda 80+ bo'lsa darhol blok
148
+ strikeWindowMs: 600000, // ballar to'planadigan oyna (10 daqiqa)
149
+ whitelist: ['127.0.0.1'], // ishonchli IP'lar (hech qachon bloklanmaydi)
150
+ persistPath: './logs/bans.json', // bloklar restartda saqlanadi
151
+ },
152
+ });
153
+
154
+ app.use(shield);
155
+
156
+ // AKS-TA'SIR: IP bloklanganda o'zingizning reaksiyangizni ulang
157
+ // (masalan, Telegram / Email / Webhook orqali ogohlantirish yuborish).
158
+ shield.firewall.on('ban', ({ ip, reason }) => {
159
+ console.log(`🚨 Bloklandi: ${ip} β€” ${reason}`);
160
+ // sendTelegramAlert(`Hujum aniqlandi! ${ip} bloklandi.`);
161
+ });
162
+
163
+ shield.firewall.on('threat', ({ ip, report }) => {
164
+ // Har bir tahdid signali (bloklamasa ham) shu yerga keladi
165
+ });
166
+ ```
167
+
168
+ **Chiqariladigan hodisalar (events):**
169
+
170
+ | Hodisa | Ma'lumot | Qachon |
171
+ | :--- | :--- | :--- |
172
+ | `threat` | `{ ip, report, req }` | Har qanday tahdid signali aniqlanganda |
173
+ | `ban` | `{ ip, reason, record }` | IP avtomat bloklanΠ³Π°Π½da |
174
+ | `blocked` | `{ ip, path }` | Bloklangan IP qayta uringanda |
175
+ | `tick` | `stats` | Har `monitorIntervalMs` da (24/7 monitoring) |
176
+
177
+ **Bloklarni boshqarish (masalan, admin panel uchun):**
178
+
179
+ ```js
180
+ shield.firewall.blocker.listBanned(); // hozir bloklangan IP'lar
181
+ shield.firewall.blocker.unban('1.2.3.4'); // blokni olib tashlash
182
+ shield.firewall.blocker.allow('5.6.7.8'); // oq ro'yxatga qo'shish
183
+ shield.firewall.blocker.stats(); // { tracked, banned }
184
+ ```
185
+
186
+ Aniqlanadigan hujum turlari: **SQL Injection, XSS, Path Traversal, Command Injection,
187
+ zararli skanerlar** (sqlmap, nikto, nmap, nuclei…), shubhali manzillar (`/.env`, `/.git`,
188
+ `/wp-admin`) va h.k.
189
+
190
+ ---
191
+
192
+ ## πŸ” Audit-skaner (Security Scanner)
193
+
194
+ Kutubxonani o'rnatgach, serveringizni bitta buyruq bilan skanerlashingiz mumkin.
195
+ Skaner **SSL sertifikati, domen, xavfsizlik sarlavhalari, muhit (NODE_ENV, `.env`),
196
+ bog'liqliklar** va boshqalarni tekshiradi, so'ng chiroyli hisobot va xavfsizlik bahosini
197
+ (0–100) beradi.
198
+
199
+ ### Terminal orqali (CLI)
200
+
201
+ ```bash
202
+ # To'liq skanerlash
203
+ npx yusufkhon-guard scan --domain mysite.uz --target http://localhost:3000
204
+
205
+ # Xavfsiz muammolarni avtomat tuzatish bilan
206
+ npx yusufkhon-guard scan --fix
207
+
208
+ # yoki loyihada
209
+ npm run scan
210
+ ```
211
+
212
+ ### Kod ichida (dasturiy)
213
+
214
+ ```js
215
+ const { scan, formatReport } = require('yusufkhon-guard');
216
+
217
+ const result = await scan({
218
+ domain: 'mysite.uz', // SSL/sertifikat tekshiruvi
219
+ target: 'http://localhost:3000', // ishlab turgan server sarlavhalari
220
+ autoFix: true, // xavfsiz muammolarni avtomat tuzatadi
221
+ });
222
+
223
+ console.log(formatReport(result));
224
+ console.log(result.score); // masalan: 87
225
+ console.log(result.summary); // { critical, high, medium, low, info, ok }
226
+ ```
227
+
228
+ > **Halol eslatma:** Skaner **xavfsiz** tuzatishlarni (masalan, `.env` ni `.gitignore` ga
229
+ > qo'shish) avtomat bajaradi. SSL sertifikatini butunlay o'rnatish esa tizim darajasidagi
230
+ > huquq (root/`certbot`) talab qiladi β€” shuning uchun skaner muammoni aniqlaydi va aniq
231
+ > buyruqni (`sudo certbot --nginx -d domain`) ko'rsatib beradi.
232
+
233
+ ---
234
+
235
+ ## πŸ” Root/Admin rozilik qatlami (Consent Layer)
236
+
237
+ Ba'zi tuzatishlar (SSL o'rnatish, IP'ni **tizim firewall'ida** bloklash) `root`/administrator
238
+ huquqini talab qiladi. `yusufkhon-guard` bunday amalni **hech qachon jimgina bajarmaydi** β€”
239
+ u **ikki bosqichli rozilik** so'raydi:
240
+
241
+ 1. **Kutubxonaning o'z so'rovi** β€” nima va nima uchun bajarilishini ko'rsatib, `[y/N]` so'raydi.
242
+ 2. **Operatsion tizim tasdig'i** β€” Linux/macOS'da `sudo` paroli, Windows'da esa **UAC oynasi**.
243
+
244
+ ```
245
+ β”Œβ”€ πŸ” Privilegiyali amal so'rovi ────────────────────
246
+ β”‚ Maqsad : example.com uchun Let's Encrypt SSL sertifikatini o'rnatish
247
+ β”‚ Buyruq : certbot --nginx -d example.com
248
+ β”‚ Huquq : UAC orqali so'raladi
249
+ └────────────────────────────────────────────────────
250
+ ❓ Ushbu amalni bajarishga ruxsat berasizmi? [y/N]
251
+ ```
252
+
253
+ > Interaktiv terminal bo'lmasa (CI/skript), privilegiyali amal **standart holatda RAD etiladi**.
254
+ > Ataylab `--yes` (yoki `autoApprove: true`) berilgandagina bajariladi.
255
+
256
+ ### IP'ni OS firewall'ida bloklash (haqiqiy blue team)
257
+
258
+ Node.js ilovasi ichida bloklashdan tashqari, zararli IP'ni **tarmoq/OS darajasida** ham
259
+ uzib qo'yish mumkin β€” shunda hujum Node.js'gacha ham yetib kelmaydi:
260
+
261
+ ```js
262
+ const { osFirewall } = require('yusufkhon-guard');
263
+
264
+ // Linux -> ufw/iptables, Windows -> netsh advfirewall (rozilik + sudo/UAC bilan)
265
+ await osFirewall.block('66.66.66.66'); // rozilik so'raydi
266
+ await osFirewall.block('66.66.66.66', { dryRun: true }); // faqat ko'rsatadi
267
+ await osFirewall.unblock('66.66.66.66');
268
+ ```
269
+
270
+ Buni firewall'ning `ban` hodisasiga ulab, **avtomat aks-ta'sir** yasashingiz mumkin:
271
+
272
+ ```js
273
+ const guard = require('yusufkhon-guard');
274
+ const { osFirewall } = guard;
275
+
276
+ const shield = guard({ firewall: { /* ... */ } });
277
+ app.use(shield);
278
+
279
+ shield.firewall.on('ban', async ({ ip }) => {
280
+ // DIQQAT: server root bilan ishlayotgan bo'lsagina autoApprove maΚΌqul.
281
+ await osFirewall.block(ip, { autoApprove: true });
282
+ });
283
+ ```
284
+
285
+ > Xavfsizlik eslatmasi: ishlab turgan serverda `autoApprove: true` faqat jarayon allaqachon
286
+ > kerakli huquqqa ega bo'lsa ishlaydi. Aks holda buyruq faqat log qilinadi β€” chunki
287
+ > kutubxona **ruxsatsiz kuchaytirilgan (elevated) amalni bajarmaydi**.
288
+
289
+ ---
290
+
291
+ ## πŸ“Š Real vaqtli admin-panel (Dashboard)
292
+
293
+ Bloklangan IP'lar, jonli tahdid hodisalari va statistikani **real vaqtda** (Server-Sent
294
+ Events orqali) ko'rsatuvchi web-panel. Express ilovangizga bitta middleware sifatida ulanadi.
295
+
296
+ ```js
297
+ const guard = require('yusufkhon-guard');
298
+
299
+ const shield = guard({ firewall: { /* ... */ } });
300
+ app.use(shield);
301
+
302
+ // Panelni token bilan himoyalab ulaymiz
303
+ app.use('/admin', guard.dashboard({
304
+ firewall: shield.firewall,
305
+ token: process.env.GUARD_TOKEN, // maxfiy token
306
+ title: 'Mening serverim',
307
+ }));
308
+ ```
309
+
310
+ Brauzerda oching: **`http://localhost:3000/admin/?token=SIZNING_TOKEN`**
311
+
312
+ Panel imkoniyatlari:
313
+ - πŸ“ˆ Jonli sanoqlar: so'rovlar, tahdidlar, bloklashlar, hozir bloklanganlar, uptime.
314
+ - ⚑ **Real vaqtli hodisalar oqimi** (SSE) β€” har bir tahdid/blok darhol ko'rinadi.
315
+ - 🚫 Bloklangan IP'lar jadvali + bitta tugma bilan **blokdan chiqarish**.
316
+ - βž• IP'ni **qo'lda bloklash** yoki oq ro'yxatga qo'shish.
317
+ - πŸŒ— Och/tund mavzuga moslashuvchan, mobil-do'st dizayn.
318
+
319
+ **API endpointlari** (barchasi `token` talab qiladi):
320
+
321
+ | Yo'l | Metod | Vazifasi |
322
+ | :--- | :--- | :--- |
323
+ | `/api/stats` | GET | Statistika |
324
+ | `/api/bans` | GET | Bloklangan IP'lar |
325
+ | `/api/events` | GET | Real vaqt oqimi (SSE) |
326
+ | `/api/block/:ip` | POST | IP'ni qo'lda bloklash |
327
+ | `/api/unban/:ip` | POST | Blokdan chiqarish |
328
+ | `/api/allow/:ip` | POST | Oq ro'yxatga qo'shish |
329
+
330
+ > ⚠️ Panelni ishlab chiqarishda **HTTPS orqasida** va kuchli token bilan (yoki qo'shimcha
331
+ > autentifikatsiya bilan) oching. Token faqat asosiy himoya qatlamidir.
332
+
333
+ ---
334
+
335
+ ## πŸ“œ ACME β€” bepul SSL sertifikatini avtomat olish (Let's Encrypt)
336
+
337
+ To'liq **native** ACME v2 (RFC 8555) mijozi β€” tashqi kutubxonasiz, faqat Node ichki
338
+ `crypto` va `fetch` yordamida. Domen uchun **bepul SSL sertifikatini avtomat oladi**
339
+ (HTTP-01 challenge).
340
+
341
+ ### ⚑ Eng oson yo'l: bitta buyruq (kod yozmasdan)
342
+
343
+ `ssl` CLI buyrug'i o'zi vaqtinchalik server ochib, sertifikatni oladi va saqlaydi
344
+ (certbot kabi "standalone" rejim). **Domenni ham o'zi aniqlaydi** (nginx/apache/hostname'dan)
345
+ va admin'ga ko'rsatib tasdiq so'raydi:
346
+
347
+ ```bash
348
+ # Domenni AVTOMAT aniqlaydi -> tasdiq so'raydi -> cert oladi
349
+ sudo npx yusufkhon-guard ssl
350
+
351
+ # Yoki domenni qo'lda ko'rsatib
352
+ npx yusufkhon-guard ssl --domain sayt.uz --email admin@sayt.uz
353
+ npx yusufkhon-guard ssl --domain sayt.uz,www.sayt.uz --production # jonli cert
354
+ npx yusufkhon-guard ssl --domain sayt.uz --port 8080 # reverse-proxy orqasida
355
+ ```
356
+
357
+ Natija: `./certs/fullchain.pem` va `./certs/privkey.pem`.
358
+ **Shartlar:** real ommaviy domen, DNS shu serverga yo'naltirilgan, 80-port ochiq.
359
+
360
+ ### πŸ”„ Avtomat yangilash (renewal) β€” "o'rnatib unut"
361
+
362
+ LE sertifikati 90 kunda tugaydi. `renew` buyrug'i tekshiradi va kerak bo'lsa yangilaydi;
363
+ `--install` esa har kunlik avtomat yangilashni (cron/systemd/schtasks) **rozilik so'rab** o'rnatadi:
364
+
365
+ ```bash
366
+ npx yusufkhon-guard renew # <30 kun qolsa yangilaydi
367
+ npx yusufkhon-guard renew --force # majburan yangilaydi
368
+ sudo npx yusufkhon-guard renew --install # har kuni 03:00 da avtomat yangilashni o'rnatadi
369
+ ```
370
+ Bir marta `--install` qilsangiz β€” keyin sertifikat o'zi yangilanib turadi.
371
+
372
+ ### Yoki dasturiy (Express ichida)
373
+
374
+ ```js
375
+ const express = require('express');
376
+ const acme = require('yusufkhon-guard').acme;
377
+
378
+ const app = express();
379
+ const store = new acme.ChallengeStore();
380
+
381
+ // 1) Challenge middleware'ni GUARD'DAN OLDIN ulang (LE tekshiruvi yetib borishi uchun)
382
+ app.use(acme.challengeMiddleware(store));
383
+
384
+ // ... qolgan middleware va marshrutlar ...
385
+ app.listen(80); // HTTP-01 uchun 80-port ochiq bo'lishi shart
386
+
387
+ // 2) Sertifikatni oling (avval STAGING'da sinab ko'ring!)
388
+ const result = await acme.obtainCertificate({
389
+ domains: ['example.com', 'www.example.com'],
390
+ email: 'admin@example.com',
391
+ challengeStore: store,
392
+ environment: 'staging', // sinovdan o'tgach -> 'production'
393
+ certDir: './certs',
394
+ accountKeyPath: './certs/account.pem',
395
+ });
396
+
397
+ console.log(result.paths); // { fullchain: './certs/fullchain.pem', privkey: './certs/privkey.pem' }
398
+ ```
399
+
400
+ So'ng olingan sertifikat bilan HTTPS serverni ishga tushirasiz:
401
+
402
+ ```js
403
+ const https = require('https');
404
+ const fs = require('fs');
405
+
406
+ https.createServer({
407
+ cert: fs.readFileSync('./certs/fullchain.pem'),
408
+ key: fs.readFileSync('./certs/privkey.pem'),
409
+ }, app).listen(443);
410
+ ```
411
+
412
+ **Muhim shartlar (HTTP-01):**
413
+ - Domen DNS'da shu serverga yo'naltirilgan bo'lishi kerak.
414
+ - 80-port internetdan ochiq bo'lishi kerak (LE `.well-known/acme-challenge/...` ni tekshiradi).
415
+ - Avval `environment: 'staging'` bilan sinang β€” Let's Encrypt jonli muhitda qat'iy limitlarga ega.
416
+
417
+ > **Halol eslatma:** Ushbu modulning kriptografik asosi (ES256 JWS imzosi, PKCS#10 CSR)
418
+ > mustaqil sinovdan o'tgan (imzo `openssl` bilan tekshirilgan). Biroq to'liq ketma-ketlik
419
+ > (handshake) haqiqiy, ommaviy domen va ochiq 80-portni talab qiladi β€” buni o'z domeningizda
420
+ > staging'da sinab ko'ring.
421
+
422
+ ---
423
+
424
+ ## 🌊 L7 (Application Layer) DDoS himoyasi
425
+
426
+ Oddiy per-IP rate-limit **taqsimlangan** (minglab IP) L7 flood'ni ushlay olmaydi.
427
+ `ddosGuard` buni yaxlit hal qiladi, `connectionGuard` esa **Slowloris/slow-POST**
428
+ hujumlaridan himoya qiladi.
429
+
430
+ ```js
431
+ const guard = require('yusufkhon-guard');
432
+ const http = require('http');
433
+
434
+ const shield = guard({
435
+ firewall: {},
436
+ ddos: {
437
+ maxRps: 300, // umumiy RPS oshsa -> "Under Attack Mode"
438
+ perIpConcurrency: 25, // bir IP dan bir vaqtdagi maksimal so'rovlar
439
+ attackPerIpMax: 15, // Attack Mode'da har IP uchun qattiq limit
440
+ challenge: true, // hujum paytida cookie-challenge (oddiy botlarni ajratadi)
441
+ lagShedMs: 200, // event-loop lag oshsa -> load shedding (503)
442
+ },
443
+ });
444
+ app.use(shield);
445
+
446
+ // Attack Mode hodisalari (dashboard/alert uchun):
447
+ shield.ddos.ddos.on('attack-start', (m) => console.log('🚨 DDoS!', m));
448
+ shield.ddos.ddos.on('attack-end', () => console.log('βœ… Normallashdi'));
449
+
450
+ // Slowloris / slow-POST himoyasi β€” HTTP serverga biriktiriladi:
451
+ const server = http.createServer(app);
452
+ guard.connectionGuard(server, {
453
+ headersTimeoutMs: 10000, // sarlavhalarni sekin yuborishga qarshi
454
+ requestTimeoutMs: 20000, // butun so'rovni sekin yuborishga (slow-POST) qarshi
455
+ idleSocketMs: 10000, // jim/sekin soketni uzadi (tezkor)
456
+ maxConnectionsPerIp: 50, // bir IP dan parallel ulanishlar chegarasi
457
+ });
458
+ server.listen(3000);
459
+ ```
460
+
461
+ **`ddosGuard` nima qiladi:**
462
+ | Mexanizm | Tavsif |
463
+ | :--- | :--- |
464
+ | **Global RPS anomaliya** | Barcha IP'lar bo'yicha umumiy tezlikni kuzatadi (per-IP past bo'lsa ham) |
465
+ | **Under Attack Mode** | Chegara oshsa avtomat yoqiladi; qattiqroq limitlar va challenge qo'llanadi |
466
+ | **Per-IP concurrency** | Bir IP dan bir vaqtda ochiq so'rovlar sonini cheklaydi (429) |
467
+ | **Load shedding** | Event-loop lag oshsa (`perf_hooks`), ortiqcha trafik `503`+`Retry-After` bilan chetlatiladi β€” server tirik qoladi |
468
+ | **Cookie challenge** | Hujum paytida yengil tekshiruv; brauzer cookie bilan qayta so'raydi va o'tadi, oddiy bot esa yiqiladi |
469
+ | **Firewall integratsiyasi** | Doimiy flooder IP avtomat banlanadi |
470
+
471
+ > **Sinovdan o'tgan:** L7 himoya jonli serverda haqiqiy hujum bilan sinaldi β€” 80 ta
472
+ > parallel so'rov (har xil IP) β†’ Attack Mode yoqildi va 71 challenge chiqarildi; bir IP dan
473
+ > 15 parallel so'rov β†’ concurrency bloklandi; Slowloris raw-socket β†’ ~4s da uzildi.
474
+
475
+ ---
476
+
477
+ ## 🧩 Qo'shimcha himoya qatlamlari
478
+
479
+ Bularning barchasini `guard({...})` ichida bitta joydan yoqish mumkin (opsional β€”
480
+ sozlama berilgandagina qo'shiladi), yoki har birini alohida `require` qilib ishlatasiz.
481
+
482
+ ```js
483
+ app.use(guard.bodyLimit({ maxBodySize: '512kb' })); // express.json'DAN OLDIN
484
+
485
+ app.use(guard({
486
+ geoBlock: { allowCountries: ['UZ', 'US'], blockDatacenter: true },
487
+ honeypot: true,
488
+ botDetector: { block: true, allowedBots: ['googlebot'] },
489
+ adaptiveRateLimit: { baseMax: 120, minMax: 15 },
490
+ csrf: { allowedOrigins: ['https://mysite.uz'] },
491
+ nosql: true,
492
+ firewall: {},
493
+ }));
494
+ ```
495
+
496
+ ### 🌍 1. Geo-IP va Anti-VPN / Datacenter
497
+
498
+ ```js
499
+ const { geoBlock, datacenterRanges } = require('yusufkhon-guard');
500
+
501
+ app.use(geoBlock({
502
+ allowCountries: ['UZ', 'US'], // faqat shu davlatlar
503
+ blockDatacenter: true, // AWS/DO/Hetzner/OVH/GCP/VPN -> 403
504
+ lookup: (ip) => myGeoLookup(ip), // yoki `geoip-lite` o'rnating
505
+ }));
506
+
507
+ datacenterRanges.addRanges('AWS', ['3.5.140.0/22']); // rasmiy ranges qo'shish
508
+ ```
509
+
510
+ > Davlat aniqlash uchun `lookup(ip) => 'UZ'` funksiyasini bering yoki ixtiyoriy
511
+ > `npm i geoip-lite` paketini o'rnating (avtomat aniqlanadi). Datacenter/VPN
512
+ > aniqlash esa built-in CIDR ro'yxati bilan **darhol** ishlaydi.
513
+
514
+ > ⚠️ **XAVFSIZLIK β€” davlat aniqlanmasa nima bo'ladi (fail-open / fail-closed):**
515
+ > **`allowCountries` (allowlist) rejimida standart holat XAVFSIZ (fail-closed):** agar
516
+ > IP'ning davlati aniqlanmasa (`lookup` `null` qaytarsa) yoki `lookup` xato tashlasa β€”
517
+ > so'rov **RAD etiladi**. Bu allowlist'ni geo-bazada bo'lmagan IP orqali chetlab
518
+ > o'tishning oldini oladi. **`denyCountries` (denylist) rejimida** esa standart β€”
519
+ > permissive (noma'lumlar o'tkaziladi). Bu standartlarni ochiq o'zgartirish mumkin:
520
+ > `failClosed: false` (xatoda o'tkazish) va `allowUnknown: true` (noma'lum davlatni
521
+ > o'tkazish). **Diqqat:** qat'iy allowlist'da `failClosed: false` qo'ysangiz, `lookup`
522
+ > ishlamay qolΠ³Π°Π½Π΄Π° himoya **ochilib ketadi** β€” buni faqat mavjudlik (availability)
523
+ > xavfsizlikdan muhimroq bo'lgan holatlardagina qiling.
524
+
525
+ ### 🧠 2. Aqlli (adaptive) rate-limiting
526
+
527
+ Odatdagidan boshqacha xatti-harakatni sezib, limitni **avtomat pasaytiradi**:
528
+ juda tez (burst) so'rovlar, yuqori xato (4xx) ulushi yoki `/login` ga bosim.
529
+
530
+ ```js
531
+ const { adaptiveRateLimiter } = require('yusufkhon-guard');
532
+ app.use(adaptiveRateLimiter({ baseMax: 120, minMax: 15, firewall: shield.firewall }));
533
+ ```
534
+
535
+ ### πŸ€– 3. Bot fingerprinting (HTTP + JA3/TLS)
536
+
537
+ ```js
538
+ const { botDetector, ja3 } = require('yusufkhon-guard');
539
+
540
+ // HTTP darajasi (User-Agent, sec-* sarlavhalari, yo'q sarlavhalar):
541
+ app.use(botDetector({ block: true, allowedBots: ['googlebot', 'bingbot'] }));
542
+
543
+ // TLS darajasi (JA3) β€” HTTPS serverda ClientHello'ni "peek" qiladi:
544
+ const tls = require('tls');
545
+ const server = tls.createServer(opts, handler);
546
+ ja3.captureClientHello(server); // endi socket.ja3Hash mavjud
547
+ ```
548
+
549
+ > ⚠️ **JA3 haqida muhim eslatma:** Bu parser **sof RFC-based (RFC 8446/8701)
550
+ > implementatsiya** β€” sanoat `ja3.io` / Salesforce ja3 vositasi bilan **bevosita
551
+ > solishtirilmagan** (self-consistent, cross-validated emas). Agar production'da
552
+ > ishlatilsa, **real brauzer ClientHello bilan qo'lda cross-validation tavsiya
553
+ > etiladi**. Qo'shimcha cheklovlar (ClientHello fragmentatsiyasi, brauzer versiyalari,
554
+ > JA3 randomizatsiyasi) uchun [CONTRIBUTING.md](CONTRIBUTING.md) dagi "Qo'lda sinalishi
555
+ > shart" bo'limiga qarang.
556
+
557
+ ### 🍯 4. HoneyPot (tuzoq)
558
+
559
+ ```js
560
+ const { honeypot } = require('yusufkhon-guard');
561
+ app.use(honeypot({
562
+ firewall: shield.firewall, // tushgan IP darhol bloklanadi
563
+ osFirewall: guard.osFirewall, // OS firewall'da ham (ixtiyoriy)
564
+ osBlock: false,
565
+ traps: ['/secret-admin'], // standart tuzoqlarga qo'shimcha
566
+ }));
567
+ ```
568
+ Standart tuzoqlar: `/.env`, `/.git/config`, `/wp-login.php`, `/phpmyadmin`, `/config.php` va h.k.
569
+ Bularga so'rov yuborgan **100% bot/hujumchi** β€” darhol **instant ban**.
570
+
571
+ ### 🧬 5. API xavfsizligi: NoSQL / CSRF / Payload
572
+
573
+ ```js
574
+ const { nosqlGuard, csrf, bodyLimit } = require('yusufkhon-guard');
575
+
576
+ app.use(bodyLimit({ maxBodySize: '256kb' })); // express.json'DAN OLDIN β€” DoS himoyasi
577
+ app.use(express.json());
578
+ app.use(nosqlGuard({ blockOnDetection: true })); // {"$gt":""}, __proto__, chuqur JSON
579
+ app.use(csrf({ allowedOrigins: ['https://mysite.uz'] })); // begona Origin -> 403
580
+ ```
581
+
582
+ ### πŸ”¬ 6. Fayl yaxlitligi monitoringi (FIM)
583
+
584
+ ```js
585
+ const { IntegrityMonitor } = require('yusufkhon-guard');
586
+
587
+ const fim = new IntegrityMonitor({
588
+ files: ['./server.js', './package.json', './src/config.js'],
589
+ intervalMs: 60000, // har daqiqada tekshiradi
590
+ });
591
+ fim.on('alert', (a) => alerter.send(a)); // buzilsa -> ogohlantirish
592
+ fim.start(); // baseline yaratadi va kuzatishni boshlaydi
593
+ ```
594
+
595
+ ### πŸ”” 7. Real-time ogohlantirish + SIEM log eksport
596
+
597
+ ```js
598
+ const { Alerter, RotatingJsonLogger } = require('yusufkhon-guard');
599
+
600
+ const alerter = new Alerter({
601
+ telegramBotToken: process.env.TG_TOKEN,
602
+ telegramChatId: process.env.TG_CHAT,
603
+ discordWebhookUrl: process.env.DISCORD_WH,
604
+ webhookUrl: 'https://my-siem/ingest',
605
+ });
606
+ alerter.attach(shield.firewall); // ban/threat -> Telegram/Discord/Webhook
607
+
608
+ // JSON-lines log (Splunk/ELK/Loki uchun) + avtomatik rotatsiya:
609
+ const jsonLog = new RotatingJsonLogger({ filePath: './logs/security.jsonl', maxSize: '10mb', maxFiles: 7 });
610
+ app.use(guard({ logger: jsonLog }));
611
+ ```
612
+
613
+ ---
614
+
615
+ ## πŸ“š API va sozlamalar jadvali
616
+
617
+ ### 1. `securityHeaders(options)`
618
+
619
+ | Parametr | Turi | Standart | Tavsif |
620
+ | :--- | :--- | :--- | :--- |
621
+ | `frameGuard` | `boolean` | `true` | `X-Frame-Options: DENY` |
622
+ | `noSniff` | `boolean` | `true` | `X-Content-Type-Options: nosniff` |
623
+ | `xssProtection` | `boolean` | `true` | `X-XSS-Protection: 1; mode=block` |
624
+ | `hsts` | `boolean \| object` | `true` | `Strict-Transport-Security` |
625
+ | `contentSecurityPolicy` | `string \| false` | `"default-src 'self'"` | `Content-Security-Policy` |
626
+ | `referrerPolicy` | `string` | `'no-referrer'` | `Referrer-Policy` |
627
+ | `poweredBy` | `string` | `'yusufkhon-guard'` | `X-Powered-By` |
628
+
629
+ ### 2. `rateLimiter(options)`
630
+
631
+ | Parametr | Turi | Standart | Tavsif |
632
+ | :--- | :--- | :--- | :--- |
633
+ | `windowMs` | `number` | `60000` | Vaqt oynasi (ms) |
634
+ | `max` | `number` | `100` | Oynadagi maksimal so'rovlar soni |
635
+ | `message` | `string` | `"Too Many Requests…"` | Bloklanganda qaytariladigan xabar |
636
+ | `statusCode` | `number` | `429` | HTTP status kodi |
637
+ | `standardHeaders` | `boolean` | `true` | `RateLimit-*` sarlavhalarini qo'shish |
638
+ | `keyGenerator` | `function` | IP bo'yicha | Kalit (IP) aniqlash funksiyasi |
639
+
640
+ ### 3. `sanitizer(options)`
641
+
642
+ | Parametr | Turi | Standart | Tavsif |
643
+ | :--- | :--- | :--- | :--- |
644
+ | `body` | `boolean` | `true` | `req.body` ni tozalash |
645
+ | `query` | `boolean` | `true` | `req.query` ni tozalash |
646
+ | `params` | `boolean` | `true` | `req.params` ni tozalash |
647
+ | `blockOnDetection` | `boolean` | `false` | Shubhali kontent topilsa `400` qaytarish |
648
+ | `statusCode` | `number` | `400` | Bloklashda status kodi |
649
+
650
+ ### 4. `firewall(options)` β€” Blue Team
651
+
652
+ | Parametr | Turi | Standart | Tavsif |
653
+ | :--- | :--- | :--- | :--- |
654
+ | `banThreshold` | `number` | `100` | Bloklash uchun to'planishi kerak bo'lgan ball |
655
+ | `instantBanScore` | `number` | `80` | Bitta so'rovda shu balldan oshsa β€” darhol blok |
656
+ | `strikeWindowMs` | `number` | `600000` | Ballar to'planadigan oyna (ms) |
657
+ | `whitelist` | `string[]` | `['127.0.0.1','::1']` | Hech qachon bloklanmaydigan IP'lar |
658
+ | `persistPath` | `string \| null` | `null` | Bloklarni saqlash uchun JSON fayl yo'li |
659
+ | `statusCode` | `number` | `403` | Bloklangan IP uchun status kodi |
660
+ | `monitor` | `boolean` | `true` | 24/7 davriy monitoringni yoqish |
661
+ | `monitorIntervalMs` | `number` | `300000` | Monitoring hisoboti oralig'i (ms) |
662
+
663
+ ### 5. `scan(options)` β€” Audit Scanner
664
+
665
+ | Parametr | Turi | Standart | Tavsif |
666
+ | :--- | :--- | :--- | :--- |
667
+ | `domain` | `string` | β€” | SSL/sertifikat tekshiruvi uchun domen |
668
+ | `target` | `string` | β€” | Sarlavhalar tekshiruvi uchun server URL'i |
669
+ | `cwd` | `string` | `process.cwd()` | Loyiha ildiz papkasi |
670
+ | `autoFix` | `boolean` | `false` | Xavfsiz muammolarni avtomat tuzatish |
671
+
672
+ ---
673
+
674
+ ## πŸ§ͺ Sinov (Test)
675
+
676
+ Loyihada tayyor test serveri mavjud:
677
+
678
+ ```bash
679
+ # 1) express o'rnatilganiga ishonch hosil qiling
680
+ npm install express
681
+
682
+ # 2) test serverini ishga tushiring
683
+ node test.js
684
+ ```
685
+
686
+ Server ishga tushgach, quyidagilarni sinab ko'ring:
687
+
688
+ ```bash
689
+ # Xavfsizlik sarlavhalarini ko'rish
690
+ curl -i http://localhost:3000/
691
+
692
+ # Rate limit'ni sinash (11+ marta yuboring -> 429)
693
+ curl -i http://localhost:3000/
694
+
695
+ # Sanitizer'ni sinash (<script> tozalanadi)
696
+ curl -X POST http://localhost:3000/comment \
697
+ -H "Content-Type: application/json" \
698
+ -d '{"text":"<script>alert(1)</script>Salom"}'
699
+ ```
700
+
701
+ ---
702
+
703
+ ## πŸ“ Logger
704
+
705
+ Kutubxona bloklangan IP va xavfsizlik hodisalarini avtomatik loglaydi.
706
+ O'z logger'ingizni yaratib, fayrga yozishni yoqishingiz mumkin:
707
+
708
+ ```js
709
+ const { Logger, guard } = require('yusufkhon-guard');
710
+
711
+ const logger = new Logger({
712
+ prefix: 'my-app',
713
+ filePath: './logs/security.log', // hodisalar faylga ham yoziladi
714
+ });
715
+
716
+ app.use(guard({ logger }));
717
+ ```
718
+
719
+ ---
720
+
721
+ ## πŸ›‘οΈ Xavfsizlik bo'yicha eslatma
722
+
723
+ `yusufkhon-guard` **birlamchi himoya qatlami** sifatida mo'ljallangan.
724
+ To'liq himoya uchun quyidagilar bilan birga ishlatilishi tavsiya etiladi:
725
+
726
+ - Ma'lumotlar bazasi uchun **parametrlashtirilgan so'rovlar** (prepared statements);
727
+ - Autentifikatsiya va avtorizatsiya;
728
+ - HTTPS (TLS) va ishonchli sessiya boshqaruvi.
729
+
730
+ ---
731
+
732
+ ## πŸ“„ Litsenziya
733
+
734
+ [MIT](./LICENSE) Β© Yusufkhon