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.
- package/LICENSE +21 -0
- package/README.md +734 -0
- package/bin/cli.js +39 -0
- package/bin/renew.js +149 -0
- package/bin/scan.js +124 -0
- package/bin/ssl.js +181 -0
- package/package.json +80 -0
- package/src/index.js +206 -0
- package/src/modules/acme/client.js +240 -0
- package/src/modules/acme/csr.js +172 -0
- package/src/modules/acme/detectDomains.js +132 -0
- package/src/modules/acme/index.js +211 -0
- package/src/modules/acme/jose.js +125 -0
- package/src/modules/acme/renew.js +89 -0
- package/src/modules/adaptiveRateLimiter.js +154 -0
- package/src/modules/alerts.js +168 -0
- package/src/modules/bodyLimit.js +106 -0
- package/src/modules/botDetector.js +144 -0
- package/src/modules/connectionGuard.js +128 -0
- package/src/modules/csrf.js +130 -0
- package/src/modules/dashboard.js +257 -0
- package/src/modules/dashboardHtml.js +235 -0
- package/src/modules/datacenterRanges.js +121 -0
- package/src/modules/ddosGuard.js +323 -0
- package/src/modules/firewall.js +239 -0
- package/src/modules/geoBlock.js +169 -0
- package/src/modules/headers.js +130 -0
- package/src/modules/honeypot.js +149 -0
- package/src/modules/httpsRedirect.js +67 -0
- package/src/modules/integrity.js +164 -0
- package/src/modules/ipBlocker.js +372 -0
- package/src/modules/ja3.js +155 -0
- package/src/modules/logExport.js +134 -0
- package/src/modules/nosqlGuard.js +143 -0
- package/src/modules/osFirewall.js +182 -0
- package/src/modules/rateLimiter.js +196 -0
- package/src/modules/sanitizer.js +253 -0
- package/src/modules/threatDetector.js +202 -0
- package/src/scanner/checks/dependencies.js +125 -0
- package/src/scanner/checks/environment.js +118 -0
- package/src/scanner/checks/exposure.js +99 -0
- package/src/scanner/checks/headers.js +119 -0
- package/src/scanner/checks/ssl.js +151 -0
- package/src/scanner/index.js +209 -0
- package/src/utils/cidr.js +140 -0
- package/src/utils/logger.js +194 -0
- 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
|
+
[](https://www.npmjs.com/package/yusufkhon-guard)
|
|
8
|
+
[](./LICENSE)
|
|
9
|
+
[](#)
|
|
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
|