jerkjs 2.2.0 → 2.3.1

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.
@@ -0,0 +1,416 @@
1
+ # Manual de Uso del Módulo de Firewall
2
+
3
+ ## Índice
4
+ 1. [Introducción](#introducción)
5
+ 2. [Instalación y Configuración](#instalación-y-configuración)
6
+ 3. [Uso Básico](#uso-básico)
7
+ 4. [Configuración Avanzada](#configuración-avanzada)
8
+ 5. [Extensión del Firewall](#extensión-del-firewall)
9
+ 6. [Eventos y Hooks](#eventos-y-hooks)
10
+ 7. [Gestión de Listas](#gestión-de-listas)
11
+ 8. [Ejemplos Prácticos](#ejemplos-prácticos)
12
+
13
+ ## Introducción
14
+
15
+ El módulo de Firewall es una funcionalidad de seguridad integrada en el framework API SDK JS que proporciona una capa de protección contra patrones de ataque comunes como SQL Injection, Cross-Site Scripting (XSS), Path Traversal, y otros vectores de ataque. El firewall incluye detección automática de amenazas, bloqueo de IPs, listas blancas/negras y un sistema de reglas personalizables.
16
+
17
+ ## Instalación y Configuración
18
+
19
+ El módulo de firewall está integrado en el framework y se puede importar directamente:
20
+
21
+ ```javascript
22
+ const { APIServer, Firewall, Logger } = require('apisdk');
23
+ ```
24
+
25
+ ## Uso Básico
26
+
27
+ ### 1. Crear una instancia del firewall
28
+
29
+ ```javascript
30
+ const firewall = new Firewall({
31
+ maxAttempts: 5, // Número máximo de intentos fallidos antes de bloquear
32
+ blockDuration: 900000, // Duración del bloqueo en ms (15 minutos)
33
+ whitelist: ['127.0.0.1'], // IPs que no deben ser bloqueadas
34
+ blacklist: [], // IPs que siempre deben ser bloqueadas
35
+ rules: [], // Reglas personalizadas de firewall
36
+ logger: new Logger() // Instancia de logger para eventos
37
+ });
38
+ ```
39
+
40
+ ### 2. Aplicar el middleware de firewall al servidor
41
+
42
+ ```javascript
43
+ const server = new APIServer({ port: 3000 });
44
+
45
+ // Aplicar el middleware de firewall antes de iniciar el servidor
46
+ server.use(firewall.middleware());
47
+
48
+ server.start();
49
+ ```
50
+
51
+ ### 3. El firewall automáticamente:
52
+
53
+ - Detecta patrones de ataque en las solicitudes
54
+ - Bloquea IPs que superan el límite de intentos fallidos
55
+ - Aplica reglas personalizadas
56
+ - Verifica listas blancas y negras
57
+ - Emite eventos a través del sistema de hooks
58
+
59
+ ## Configuración Avanzada
60
+
61
+ ### Parámetros de Configuración
62
+
63
+ - `maxAttempts`: Número máximo de intentos fallidos antes de bloquear una IP (por defecto: 5)
64
+ - `blockDuration`: Duración del bloqueo en milisegundos (por defecto: 900000 = 15 minutos)
65
+ - `whitelist`: Array de IPs que nunca serán bloqueadas
66
+ - `blacklist`: Array de IPs que siempre serán bloqueadas
67
+ - `rules`: Array de reglas personalizadas de firewall
68
+ - `logger`: Instancia de logger para eventos de seguridad
69
+
70
+ ### Reglas Personalizadas
71
+
72
+ Puedes definir reglas personalizadas para detectar patrones específicos:
73
+
74
+ ```javascript
75
+ const customRules = [
76
+ {
77
+ name: 'large_payload',
78
+ condition: (req) => {
79
+ // Bloquear solicitudes con cuerpo muy grande
80
+ const contentLength = req.headers['content-length'];
81
+ return contentLength && parseInt(contentLength) > 1024 * 100; // 100KB
82
+ },
83
+ action: 'block', // 'block' o 'monitor'
84
+ reason: 'Solicitud con payload excesivamente grande'
85
+ },
86
+ {
87
+ name: 'suspicious_user_agent',
88
+ condition: (req) => {
89
+ const userAgent = req.headers['user-agent'] || '';
90
+ // Detectar user agents sospechosos
91
+ const suspiciousAgents = [
92
+ /sqlmap/i,
93
+ /nikto/i,
94
+ /nessus/i,
95
+ /nmap/i,
96
+ /dirbuster/i
97
+ ];
98
+ return suspiciousAgents.some(agent => agent.test(userAgent));
99
+ },
100
+ action: 'block',
101
+ reason: 'User agent sospechoso detectado'
102
+ }
103
+ ];
104
+
105
+ const firewall = new Firewall({
106
+ rules: customRules,
107
+ // ... otras opciones
108
+ });
109
+ ```
110
+
111
+ ## Extensión del Firewall
112
+
113
+ El módulo de firewall es altamente extensible gracias al sistema de hooks integrado. Existen varias formas de extender su funcionalidad:
114
+
115
+ ### 1. Añadiendo Reglas Personalizadas en Tiempo de Ejecución
116
+
117
+ ```javascript
118
+ // Añadir una regla después de crear la instancia
119
+ firewall.addRule(
120
+ 'custom_attack_pattern',
121
+ (req, clientIP) => {
122
+ // Tu lógica de detección aquí
123
+ return req.url.includes('malicious-pattern');
124
+ },
125
+ 'block',
126
+ 'Patrón de ataque personalizado detectado'
127
+ );
128
+ ```
129
+
130
+ ### 2. Utilizando el Sistema de Hooks
131
+
132
+ El firewall emite varios eventos que puedes interceptar para extender su comportamiento:
133
+
134
+ ```javascript
135
+ const { HookSystem } = require('apisdk');
136
+ const hooks = new HookSystem();
137
+
138
+ // Hook cuando se recibe una solicitud
139
+ hooks.addAction('firewall_request_received', (req, res) => {
140
+ console.log(`Solicitud recibida: ${req.method} ${req.url}`);
141
+ });
142
+
143
+ // Hook cuando se activa una regla
144
+ hooks.addAction('firewall_rule_triggered', (rule, clientIP, req) => {
145
+ console.log(`Regla activada: ${rule.name} para IP: ${clientIP}`);
146
+ });
147
+
148
+ // Hook cuando una IP es bloqueada
149
+ hooks.addAction('firewall_ip_blocked', (ip, reason, req, res) => {
150
+ console.log(`IP bloqueada: ${ip} - Razón: ${reason}`);
151
+ });
152
+
153
+ // Hook cuando una solicitud es bloqueada
154
+ hooks.addAction('firewall_request_blocked', (rule, clientIP, req, res) => {
155
+ console.log(`Solicitud bloqueada por regla: ${rule.name} para IP: ${clientIP}`);
156
+ });
157
+
158
+ // Hook cuando una solicitud es monitoreada
159
+ hooks.addAction('firewall_request_monitored', (rule, clientIP, req) => {
160
+ console.log(`Solicitud monitoreada: ${rule.name} para IP: ${clientIP}`);
161
+ });
162
+
163
+ // Hook cuando una solicitud es permitida
164
+ hooks.addAction('firewall_request_allowed', (req, res) => {
165
+ console.log(`Solicitud permitida: ${req.method} ${req.url}`);
166
+ });
167
+
168
+ // Hook cuando se actualiza la whitelist
169
+ hooks.addAction('firewall_whitelist_updated', (ip, action, whitelist) => {
170
+ console.log(`Whitelist actualizada: IP ${ip} ${action}, total: ${whitelist.length}`);
171
+ });
172
+
173
+ // Hook cuando se actualiza la blacklist
174
+ hooks.addAction('firewall_blacklist_updated', (ip, action, blacklist) => {
175
+ console.log(`Blacklist actualizada: IP ${ip} ${action}, total: ${blacklist.length}`);
176
+ });
177
+ ```
178
+
179
+ ### 3. Extensión mediante Filtros
180
+
181
+ También puedes usar filtros para modificar el comportamiento del firewall:
182
+
183
+ ```javascript
184
+ // Filtrar la decisión de bloqueo
185
+ hooks.addFilter('modify_firewall_decision', (shouldBlock, req, res) => {
186
+ // Lógica personalizada para decidir si se debe bloquear
187
+ if (someCondition(req)) {
188
+ return false; // No bloquear
189
+ }
190
+ return shouldBlock; // Mantener decisión original
191
+ });
192
+ ```
193
+
194
+ ### 4. Herencia y Personalización
195
+
196
+ Puedes extender la clase Firewall para añadir funcionalidades personalizadas:
197
+
198
+ ```javascript
199
+ const { Firewall } = require('apisdk');
200
+
201
+ class CustomFirewall extends Firewall {
202
+ constructor(options = {}) {
203
+ super(options);
204
+ this.customDetectionMethods = [];
205
+ }
206
+
207
+ // Añadir método de detección personalizado
208
+ addCustomDetection(method) {
209
+ this.customDetectionMethods.push(method);
210
+ }
211
+
212
+ // Sobreescribir el método de verificación de reglas
213
+ checkRules(req) {
214
+ // Primero ejecutar la lógica original
215
+ const originalResult = super.checkRules(req);
216
+ if (originalResult) {
217
+ return originalResult;
218
+ }
219
+
220
+ // Luego verificar métodos de detección personalizados
221
+ for (const method of this.customDetectionMethods) {
222
+ const result = method(req, this.getClientIP(req));
223
+ if (result) {
224
+ return result;
225
+ }
226
+ }
227
+
228
+ return null;
229
+ }
230
+ }
231
+
232
+ // Uso del firewall personalizado
233
+ const customFirewall = new CustomFirewall({
234
+ // opciones normales
235
+ });
236
+
237
+ customFirewall.addCustomDetection((req, clientIP) => {
238
+ // Tu lógica personalizada de detección
239
+ if (req.headers['x-custom-header'] === 'suspicious-value') {
240
+ return {
241
+ matched: true,
242
+ rule: 'custom_header_check',
243
+ action: 'block',
244
+ reason: 'Cabecera personalizada sospechosa detectada'
245
+ };
246
+ }
247
+ return null;
248
+ });
249
+ ```
250
+
251
+ ## Eventos y Hooks
252
+
253
+ El firewall emite los siguientes eventos:
254
+
255
+ - `firewall_request_received`: Cuando se recibe una solicitud
256
+ - `firewall_ip_blocked`: Cuando una IP es bloqueada
257
+ - `firewall_rule_triggered`: Cuando se activa una regla de firewall
258
+ - `firewall_request_blocked`: Cuando una solicitud es bloqueada
259
+ - `firewall_request_monitored`: Cuando una solicitud es monitoreada
260
+ - `firewall_request_allowed`: Cuando una solicitud es permitida
261
+ - `firewall_whitelist_updated`: Cuando se actualiza la whitelist
262
+ - `firewall_blacklist_updated`: Cuando se actualiza la blacklist
263
+
264
+ ## Gestión de Listas
265
+
266
+ ### Listas Blancas (Whitelist)
267
+
268
+ ```javascript
269
+ // Añadir IP a la whitelist
270
+ firewall.addToWhitelist('192.168.1.100');
271
+
272
+ // Remover IP de la whitelist
273
+ firewall.removeFromWhitelist('192.168.1.100');
274
+ ```
275
+
276
+ ### Listas Negras (Blacklist)
277
+
278
+ ```javascript
279
+ // Añadir IP a la blacklist
280
+ firewall.addToBlacklist('10.0.0.50', 'IP maliciosa detectada');
281
+
282
+ // Remover IP de la blacklist
283
+ firewall.removeFromBlacklist('10.0.0.50');
284
+ ```
285
+
286
+ ### Obtener Estado del Firewall
287
+
288
+ ```javascript
289
+ const status = firewall.getStatus();
290
+ console.log(status);
291
+ /*
292
+ {
293
+ blockedIPs: [...],
294
+ whitelist: [...],
295
+ blacklist: [...],
296
+ totalBlocked: 0,
297
+ rules: [...]
298
+ }
299
+ */
300
+ ```
301
+
302
+ ## Ejemplos Prácticos
303
+
304
+ ### Ejemplo Completo de API con Firewall
305
+
306
+ ```javascript
307
+ const { APIServer, Firewall, Logger, HookSystem } = require('apisdk');
308
+
309
+ async function startSecureAPI() {
310
+ // Crear servidor
311
+ const server = new APIServer({
312
+ port: 3000,
313
+ host: 'localhost'
314
+ });
315
+
316
+ // Crear logger
317
+ const logger = new Logger({ level: 'info' });
318
+
319
+ // Crear firewall con configuración personalizada
320
+ const firewall = new Firewall({
321
+ maxAttempts: 3,
322
+ blockDuration: 300000, // 5 minutos
323
+ whitelist: ['127.0.0.1', '::1'],
324
+ blacklist: [],
325
+ rules: [
326
+ {
327
+ name: 'large_payload',
328
+ condition: (req) => {
329
+ const contentLength = req.headers['content-length'];
330
+ return contentLength && parseInt(contentLength) > 1024 * 100; // 100KB
331
+ },
332
+ action: 'block',
333
+ reason: 'Payload excesivamente grande'
334
+ }
335
+ ],
336
+ logger
337
+ });
338
+
339
+ // Configurar hooks
340
+ const hooks = new HookSystem();
341
+
342
+ hooks.addAction('firewall_request_blocked', (rule, clientIP, req, res) => {
343
+ logger.warn(`Solicitud bloqueada: ${rule.name} para IP: ${clientIP}`);
344
+ // Aquí puedes añadir lógica adicional, como alertas o notificaciones
345
+ });
346
+
347
+ // Aplicar middleware de firewall
348
+ server.use(firewall.middleware());
349
+
350
+ // Añadir rutas
351
+ server.addRoute('GET', '/', (req, res) => {
352
+ res.writeHead(200, { 'Content-Type': 'application/json' });
353
+ res.end(JSON.stringify({
354
+ message: 'API segura con firewall activado',
355
+ firewallStatus: firewall.getStatus()
356
+ }));
357
+ });
358
+
359
+ // Iniciar servidor
360
+ server.start();
361
+ }
362
+
363
+ startSecureAPI();
364
+ ```
365
+
366
+ ### Ejemplo de Extensión con Hooks
367
+
368
+ ```javascript
369
+ const { APIServer, Firewall, Logger, HookSystem } = require('apisdk');
370
+
371
+ // Crear sistema de hooks
372
+ const hooks = new HookSystem();
373
+
374
+ // Crear firewall
375
+ const firewall = new Firewall({
376
+ logger: new Logger()
377
+ });
378
+
379
+ // Extender funcionalidad con hooks
380
+ hooks.addAction('firewall_request_blocked', async (rule, clientIP, req, res) => {
381
+ // Registrar intento de ataque en una base de datos
382
+ await logSecurityIncident({
383
+ ip: clientIP,
384
+ rule: rule.name,
385
+ url: req.url,
386
+ userAgent: req.headers['user-agent'],
387
+ timestamp: new Date()
388
+ });
389
+
390
+ // Enviar alerta si es necesario
391
+ if (rule.name === 'sql_injection') {
392
+ await sendAlertEmail('Ataque de SQL Injection detectado', clientIP);
393
+ }
394
+ });
395
+
396
+ hooks.addAction('firewall_rule_triggered', (rule, clientIP, req) => {
397
+ // Incrementar contador de amenazas para esta IP
398
+ incrementThreatScore(clientIP);
399
+ });
400
+
401
+ // Aplicar firewall al servidor
402
+ const server = new APIServer({ port: 3000 });
403
+ server.use(firewall.middleware());
404
+ ```
405
+
406
+ ## Consideraciones de Seguridad
407
+
408
+ - Asegúrate de mantener actualizada la lista de IPs en la whitelist con direcciones confiables
409
+ - Monitorea regularmente las IPs bloqueadas para identificar falsos positivos
410
+ - Personaliza las reglas según las necesidades específicas de tu aplicación
411
+ - Utiliza los hooks para integrar con sistemas de alerta y monitoreo externos
412
+ - Considera implementar un sistema de "fail2ban" personalizado para bloqueos temporales automáticos
413
+
414
+ ## Conclusión
415
+
416
+ El módulo de firewall proporciona una capa robusta de seguridad para tus APIs, con capacidad de extensión a través del sistema de hooks y reglas personalizadas. Su integración directa en el framework permite una implementación sencilla pero poderosa para proteger tus servicios web de amenazas comunes.