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