doctorlinux commited on
Commit
09595ec
·
verified ·
1 Parent(s): a1efbaf

Upload index.html

Browse files
Files changed (1) hide show
  1. index.html +246 -25
index.html CHANGED
@@ -12,7 +12,7 @@
12
  .dlx-sub{color:#5c6b5f;margin-bottom:16px}
13
  .dlx-progress{height:10px;background:#eff4f0;border-radius:999px;overflow:hidden;margin:10px 0 18px}
14
  .dlx-bar{height:100%;width:0;background:#7fbf7f;transition:width .3s}
15
- .dlx-q h4{margin:0 0 6px;font-size:18px}
16
  .dlx-options{display:flex;gap:10px;flex-wrap:wrap;margin:6px 0 12px}
17
  .dlx-pill{border:1px solid #d7e1d9;padding:8px 12px;border-radius:999px;cursor:pointer}
18
  .dlx-pill input{display:none}
@@ -27,6 +27,100 @@
27
  .dlx-note{color:#6a786d}
28
  .dlx-score{font-size:40px;font-weight:800;color:#214424}
29
  .dlx-muted{color:#7b8b7f}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  </style>
31
  </head>
32
 
@@ -88,44 +182,53 @@
88
  </div>
89
  </div>
90
 
 
 
 
 
 
 
 
 
 
91
  <script>
92
  /* === CONFIGURACIÓN INICIAL === */
93
  const DOMAINS = [
94
  { id:'perimetro', name:'Perímetro / Firewall', qs:[
95
- '¿Usas un firewall dedicado (Mikrotik/OPNsense/etc.) con reglas mínimas por servicio?',
96
- '¿Tienes listas de acceso/geo-bloqueo/IPS/DoS activas?',
97
- '¿Los servicios expuestos están detrás de NAT o Port-Forward controlado?',
98
- '¿Hay políticas VPN de acceso remoto con 2FA?'
99
  ]},
100
  { id:'servers', name:'Servidores / Hardening', qs:[
101
- '¿Cuentas con hardening básico (SSH seguro, usuarios/roles, auditoría)?',
102
- '¿Actualizaciones y parches aplicados regularmente?',
103
- '¿Servicios innecesarios deshabilitados/controlados?'
104
  ]},
105
  { id:'backups', name:'Backups y Recuperación', qs:[
106
- '¿Aplicas la regla 3-2-1 (3 copias, 2 medios, 1 offsite)?',
107
- '¿Pruebas de restauración realizadas en los últimos 6 meses?',
108
- '¿Backups protegidos contra ransomware (inmutables/air-gap)?'
109
  ]},
110
  { id:'monitor', name:'Monitoreo y Alertas', qs:[
111
- '¿Monitoreo centralizado (Zabbix/PRTG/Grafana) con alertas 24/7?',
112
- '¿Métricas revisadas mensualmente?',
113
- '¿Alertas integradas con soporte?'
114
  ]},
115
  { id:'network', name:'Red y Conectividad', qs:[
116
- '¿Segmentación VLANs para aislar servicios críticos?',
117
- '¿Control de ancho de banda/Proxy/filtrado de contenidos?',
118
- '¿Wi-Fi empresarial con WPA2-Enterprise?'
119
  ]},
120
  { id:'endpoints', name:'Usuarios / Estaciones', qs:[
121
- '¿Antimalware/EDR y políticas de actualización?',
122
- '¿Gestión de contraseñas y MFA?',
123
- '¿Políticas de mínimo privilegio + bloqueo de USB?'
124
  ]},
125
  { id:'webmail', name:'Web y Correo', qs:[
126
- '¿Sitios con HTTPS válido y cabeceras seguras?',
127
- '¿Correo con SPF, DKIM y DMARC publicados?',
128
- '¿WAF/antispam/antiphishing activos?'
129
  ]}
130
  ];
131
 
@@ -146,6 +249,70 @@ const RECS = {
146
  webmail:'Forzar HTTPS, cabeceras OWASP, SPF+DKIM+DMARC y WAF.'
147
  };
148
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
  let current = 0, answers = {};
150
  const steps = document.getElementById('dlxSteps'),
151
  bar = document.getElementById('dlxBar'),
@@ -155,6 +322,50 @@ const steps = document.getElementById('dlxSteps'),
155
  result = document.getElementById('dlxResult'),
156
  nav = document.getElementById('dlxNavBox');
157
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
  /* === FUNCIONES PRINCIPALES === */
159
  function render() {
160
  steps.innerHTML = '';
@@ -163,12 +374,20 @@ function render() {
163
  const card = document.createElement('div');
164
  card.className = 'dlx-card';
165
  card.innerHTML = `<h3 class="dlx-title">${d.name}</h3>`;
166
- d.qs.forEach((q, i) => {
 
167
  const b = document.createElement('div');
168
  b.className = 'dlx-q';
169
- b.innerHTML = `<h4>${q}</h4>`;
 
 
 
 
 
 
170
  const row = document.createElement('div');
171
  row.className = 'dlx-options';
 
172
  SCALE.forEach(opt => {
173
  const lbl = document.createElement('label');
174
  lbl.className = 'dlx-pill';
@@ -183,9 +402,11 @@ function render() {
183
  if (answers[d.id] && answers[d.id][i] === opt.score) lbl.classList.add('active');
184
  row.appendChild(lbl);
185
  });
 
186
  b.appendChild(row);
187
  card.appendChild(b);
188
  });
 
189
  steps.appendChild(card);
190
  bar.style.width = Math.round(current / DOMAINS.length * 100) + '%';
191
  updateButtons();
 
12
  .dlx-sub{color:#5c6b5f;margin-bottom:16px}
13
  .dlx-progress{height:10px;background:#eff4f0;border-radius:999px;overflow:hidden;margin:10px 0 18px}
14
  .dlx-bar{height:100%;width:0;background:#7fbf7f;transition:width .3s}
15
+ .dlx-q h4{margin:0 0 6px;font-size:18px;display:flex;align-items:flex-start;gap:8px}
16
  .dlx-options{display:flex;gap:10px;flex-wrap:wrap;margin:6px 0 12px}
17
  .dlx-pill{border:1px solid #d7e1d9;padding:8px 12px;border-radius:999px;cursor:pointer}
18
  .dlx-pill input{display:none}
 
27
  .dlx-note{color:#6a786d}
28
  .dlx-score{font-size:40px;font-weight:800;color:#214424}
29
  .dlx-muted{color:#7b8b7f}
30
+
31
+ /* Estilos para el botón de ayuda */
32
+ .help-btn {
33
+ background: #214424;
34
+ color: white;
35
+ border: none;
36
+ border-radius: 50%;
37
+ width: 22px;
38
+ height: 22px;
39
+ font-size: 12px;
40
+ font-weight: bold;
41
+ cursor: help;
42
+ display: inline-flex;
43
+ align-items: center;
44
+ justify-content: center;
45
+ flex-shrink: 0;
46
+ margin-top: 2px;
47
+ }
48
+
49
+ .help-btn:hover {
50
+ background: #1a361c;
51
+ transform: scale(1.1);
52
+ }
53
+
54
+ /* Modal de ayuda */
55
+ .help-modal {
56
+ display: none;
57
+ position: fixed;
58
+ top: 0;
59
+ left: 0;
60
+ width: 100%;
61
+ height: 100%;
62
+ background: rgba(0,0,0,0.5);
63
+ z-index: 1000;
64
+ justify-content: center;
65
+ align-items: center;
66
+ }
67
+
68
+ .help-content {
69
+ background: #fff;
70
+ padding: 24px;
71
+ border-radius: 16px;
72
+ width: 90%;
73
+ max-width: 500px;
74
+ border: 2px solid #214424;
75
+ max-height: 80vh;
76
+ overflow-y: auto;
77
+ box-shadow: 0 20px 60px rgba(0,0,0,0.2);
78
+ }
79
+
80
+ .help-content h4 {
81
+ margin: 0 0 16px 0;
82
+ color: #214424;
83
+ font-size: 20px;
84
+ border-bottom: 2px solid #eff4f0;
85
+ padding-bottom: 8px;
86
+ }
87
+
88
+ .help-content .close-btn {
89
+ background: #214424;
90
+ color: white;
91
+ border: none;
92
+ padding: 10px 20px;
93
+ border-radius: 10px;
94
+ cursor: pointer;
95
+ margin-top: 16px;
96
+ font-weight: 600;
97
+ }
98
+
99
+ .help-content .close-btn:hover {
100
+ background: #1a361c;
101
+ }
102
+
103
+ .help-example {
104
+ background: #f8f9f8;
105
+ border-left: 4px solid #214424;
106
+ padding: 12px 16px;
107
+ margin: 12px 0;
108
+ border-radius: 0 8px 8px 0;
109
+ }
110
+
111
+ .help-example h5 {
112
+ margin: 0 0 8px 0;
113
+ color: #214424;
114
+ font-size: 14px;
115
+ }
116
+
117
+ .help-example code {
118
+ background: #e9efe9;
119
+ padding: 4px 8px;
120
+ border-radius: 4px;
121
+ font-family: monospace;
122
+ font-size: 12px;
123
+ }
124
  </style>
125
  </head>
126
 
 
182
  </div>
183
  </div>
184
 
185
+ <!-- Modal de ayuda -->
186
+ <div id="helpModal" class="help-modal">
187
+ <div class="help-content">
188
+ <h4 id="helpTitle">Ayuda</h4>
189
+ <div id="helpText"></div>
190
+ <button class="close-btn" id="closeHelp">Cerrar</button>
191
+ </div>
192
+ </div>
193
+
194
  <script>
195
  /* === CONFIGURACIÓN INICIAL === */
196
  const DOMAINS = [
197
  { id:'perimetro', name:'Perímetro / Firewall', qs:[
198
+ {q:'¿Usas un firewall dedicado (Mikrotik/OPNsense/etc.) con reglas mínimas por servicio?', help:'Un firewall dedicado filtra el tráfico entrante y saliente. Reglas mínimas significa solo permitir los puertos y servicios estrictamente necesarios para operar.'},
199
+ {q:'¿Tienes listas de acceso/geo-bloqueo/IPS/DoS activas?', help:'Listas de acceso bloquean IPs maliciosas, geo-bloqueo restringe países de riesgo, IPS detecta intrusiones, y DoS protege contra ataques de denegación de servicio.'},
200
+ {q:'¿Los servicios expuestos están detrás de NAT o Port-Forward controlado?', help:'NAT oculta la red interna. Port-Forward controlado significa solo redirigir puertos específicos necesarios, no toda la red.'},
201
+ {q:'¿Hay políticas VPN de acceso remoto con 2FA?', help:'VPN permite acceso remoto seguro. 2FA (autenticación de dos factores) añade una capa extra de seguridad además de la contraseña.'}
202
  ]},
203
  { id:'servers', name:'Servidores / Hardening', qs:[
204
+ {q:'¿Cuentas con hardening básico (SSH seguro, usuarios/roles, auditoría)?', help:'Hardening significa configurar el sistema de forma segura: SSH sin root, solo claves, usuarios con privilegios mínimos, y logs de auditoría.'},
205
+ {q:'¿Actualizaciones y parches aplicados regularmente?', help:'Aplicar actualizaciones de seguridad mensualmente para corregir vulnerabilidades conocidas en el sistema operativo y aplicaciones.'},
206
+ {q:'¿Servicios innecesarios deshabilitados/controlados?', help:'Cada servicio activo es una posible puerta de entrada. Deshabilitar servicios como FTP, Telnet, servicios de impresión no usados, etc.'}
207
  ]},
208
  { id:'backups', name:'Backups y Recuperación', qs:[
209
+ {q:'¿Aplicas la regla 3-2-1 (3 copias, 2 medios, 1 offsite)?', help:'3 copias totales, en al menos 2 tipos diferentes de medios (discos, cinta, cloud), y 1 copia fuera del sitio físico principal.'},
210
+ {q:'¿Pruebas de restauración realizadas en los últimos 6 meses?', help:'Verificar periódicamente que los backups son recuperables restaurando datos de prueba en un ambiente controlado.'},
211
+ {q:'¿Backups protegidos contra ransomware (inmutables/air-gap)?', help:'Backups inmutables no pueden ser modificados o eliminados. Air-gap significa almacenamiento físicamente desconectado de la red.'}
212
  ]},
213
  { id:'monitor', name:'Monitoreo y Alertas', qs:[
214
+ {q:'¿Monitoreo centralizado (Zabbix/PRTG/Grafana) con alertas 24/7?', help:'Sistema que monitorea servidores, redes, servicios y envía alertas inmediatas cuando detecta problemas o anomalías.'},
215
+ {q:'¿Métricas revisadas mensualmente?', help:'Analizar regularmente el rendimiento, capacidad, intentos de acceso fallidos, y otros indicadores de seguridad.'},
216
+ {q:'¿Alertas integradas con soporte?', help:'Las alertas críticas deben notificar automáticamente al personal técnico mediante email, SMS, Telegram, etc.'}
217
  ]},
218
  { id:'network', name:'Red y Conectividad', qs:[
219
+ {q:'¿Segmentación VLANs para aislar servicios críticos?', help:'Dividir la red en segmentos lógicos separados (VLANs) para aislar servidores críticos, usuarios, e invitados.'},
220
+ {q:'¿Control de ancho de banda/Proxy/filtrado de contenidos?', help:'Limitar ancho de banda por servicio, filtrar contenido malicioso, y controlar acceso a internet mediante proxy.'},
221
+ {q:'¿Wi-Fi empresarial con WPA2-Enterprise?', help:'WPA2-Enterprise usa autenticación individual por usuario en lugar de una contraseña compartida para toda la red WiFi.'}
222
  ]},
223
  { id:'endpoints', name:'Usuarios / Estaciones', qs:[
224
+ {q:'¿Antimalware/EDR y políticas de actualización?', help:'EDR (Endpoint Detection and Response) detecta comportamientos sospechosos. Políticas de actualización automática para software y antivirus.'},
225
+ {q:'¿Gestión de contraseñas y MFA?', help:'Password manager para contraseñas seguras y únicas. MFA (Multi-Factor Authentication) requiere código adicional además de la contraseña.'},
226
+ {q:'¿Políticas de mínimo privilegio + bloqueo de USB?', help:'Usuarios solo tienen permisos necesarios para su trabajo. Bloqueo de puertos USB previene infecciones y fugas de datos.'}
227
  ]},
228
  { id:'webmail', name:'Web y Correo', qs:[
229
+ {q:'¿Sitios con HTTPS válido y cabeceras seguras?', help:'HTTPS encripta comunicación web. Cabeceras de seguridad previenen ataques como XSS, clickjacking, y MIME sniffing.'},
230
+ {q:'¿Correo con SPF, DKIM y DMARC publicados?', help:'SPF, DKIM y DMARC son protocolos que previenen suplantación de identidad (spoofing) en correos electrónicos.'},
231
+ {q:'¿WAF/antispam/antiphishing activos?', help:'WAF protege aplicaciones web, antispam filtra correo no deseado, antiphishing detecta intentos de engaño.'}
232
  ]}
233
  ];
234
 
 
249
  webmail:'Forzar HTTPS, cabeceras OWASP, SPF+DKIM+DMARC y WAF.'
250
  };
251
 
252
+ // Contenido de ayuda detallado
253
+ const HELP_CONTENT = {
254
+ 'firewall-dedicado': `
255
+ <h4>🚧 Firewall Dedicado - Explicación Completa</h4>
256
+ <p>Un <strong>firewall dedicado</strong> es un dispositivo o software especializado que actúa como guardián entre tu red interna e Internet.</p>
257
+
258
+ <div class="help-example">
259
+ <h5>🔧 Qué buscar:</h5>
260
+ <ul>
261
+ <li>Reglas que <strong>deniegan todo por defecto</strong></li>
262
+ <li>Solo puertos <strong>estrictamente necesarios</strong> abiertos</li>
263
+ <li>Separación de redes (LAN, DMZ, WAN)</li>
264
+ <li>Logs de conexiones sospechosas</li>
265
+ </ul>
266
+ </div>
267
+
268
+ <div class="help-example">
269
+ <h5>📋 Ejemplo de reglas seguras:</h5>
270
+ <code>
271
+ # DENEGAR todo por defecto<br>
272
+ # PERMITIR solo SSH desde IPs admin<br>
273
+ # PERMITIR HTTP/HTTPS desde cualquier lugar<br>
274
+ # DENEGAR todo lo demás
275
+ </code>
276
+ </div>
277
+
278
+ <p><strong>¿Por qué es importante?</strong> Sin firewall, todos tus servicios están expuestos directamente a Internet.</p>
279
+ `,
280
+
281
+ 'listas-acceso': `
282
+ <h4>🛡️ Listas de Acceso y Protecciones - Explicación</h4>
283
+ <p>Estas son <strong>capas adicionales de seguridad</strong> que complementan al firewall básico.</p>
284
+
285
+ <div class="help-example">
286
+ <h5>🎯 Componentes clave:</h5>
287
+ <ul>
288
+ <li><strong>Listas de acceso:</strong> Bloqueo de IPs maliciosas conocidas</li>
289
+ <li><strong>Geo-bloqueo:</strong> Restricción por país (ej: bloquear Rusia, China)</li>
290
+ <li><strong>IPS:</strong> Detección de patrones de ataque en tiempo real</li>
291
+ <li><strong>Protección DoS:</strong> Limita conexiones simultáneas</li>
292
+ </ul>
293
+ </div>
294
+
295
+ <p><strong>Beneficio:</strong> Previene el 80% de ataques automatizados y escaneos de red.</p>
296
+ `,
297
+
298
+ 'nat-portforward': `
299
+ <h4>🌐 NAT y Port-Forward Controlado</h4>
300
+ <p><strong>NAT (Network Address Translation)</strong> oculta tus IPs internas. <strong>Port-Forward</strong> redirige puertos específicos.</p>
301
+
302
+ <div class="help-example">
303
+ <h5>✅ Configuración segura:</h5>
304
+ <ul>
305
+ <li>NAT activado para toda la red interna</li>
306
+ <li>Port-Forward solo para servicios esenciales</li>
307
+ <li>Nunca redirigir rangos de puertos completos</li>
308
+ <li>Registrar cada redirección con justificación</li>
309
+ </ul>
310
+ </div>
311
+
312
+ <p><strong>Riesgo:</strong> Port-Forward incorrecto puede exponer servicios internos accidentalmente.</p>
313
+ `
314
+ };
315
+
316
  let current = 0, answers = {};
317
  const steps = document.getElementById('dlxSteps'),
318
  bar = document.getElementById('dlxBar'),
 
322
  result = document.getElementById('dlxResult'),
323
  nav = document.getElementById('dlxNavBox');
324
 
325
+ /* === SISTEMA DE AYUDA === */
326
+ function showHelp(helpKey, questionText) {
327
+ const modal = document.getElementById('helpModal');
328
+ const title = document.getElementById('helpTitle');
329
+ const content = document.getElementById('helpText');
330
+
331
+ // Usar contenido específico si existe, sino genérico
332
+ if (HELP_CONTENT[helpKey]) {
333
+ content.innerHTML = HELP_CONTENT[helpKey];
334
+ } else {
335
+ // Contenido genérico basado en la pregunta
336
+ content.innerHTML = `
337
+ <h4>💡 Ayuda Contextual</h4>
338
+ <p><strong>Pregunta:</strong> ${questionText}</p>
339
+ <div class="help-example">
340
+ <h5>🎯 Qué evaluamos:</h5>
341
+ <p>Esta pregunta busca determinar si tienes implementadas las <strong>medidas básicas de seguridad</strong> para este dominio.</p>
342
+ </div>
343
+ <div class="help-example">
344
+ <h5>📊 Cómo responder:</h5>
345
+ <ul>
346
+ <li><strong>Sí:</strong> Si tienes completamente implementado y documentado</li>
347
+ <li><strong>Parcial:</strong> Si está implementado pero necesita mejoras</li>
348
+ <li><strong>No:</strong> Si no está implementado o es inefectivo</li>
349
+ <li><strong>No sé:</strong> Si no tienes certeza del estado actual</li>
350
+ </ul>
351
+ </div>
352
+ <p><strong>💡 Tip:</strong> Responde con honestidad para obtener un diagnóstico preciso.</p>
353
+ `;
354
+ }
355
+
356
+ modal.style.display = 'flex';
357
+ }
358
+
359
+ function closeHelp() {
360
+ document.getElementById('helpModal').style.display = 'none';
361
+ }
362
+
363
+ // Event listeners para el modal de ayuda
364
+ document.getElementById('closeHelp').addEventListener('click', closeHelp);
365
+ document.getElementById('helpModal').addEventListener('click', function(e) {
366
+ if (e.target.id === 'helpModal') closeHelp();
367
+ });
368
+
369
  /* === FUNCIONES PRINCIPALES === */
370
  function render() {
371
  steps.innerHTML = '';
 
374
  const card = document.createElement('div');
375
  card.className = 'dlx-card';
376
  card.innerHTML = `<h3 class="dlx-title">${d.name}</h3>`;
377
+
378
+ d.qs.forEach((item, i) => {
379
  const b = document.createElement('div');
380
  b.className = 'dlx-q';
381
+
382
+ // Crear botón de ayuda con ID único
383
+ const helpKey = `${d.id}-q${i}`;
384
+ const helpBtn = `<button class="help-btn" onclick="showHelp('${helpKey}', '${item.q.replace(/'/g, "\\'")}')">?</button>`;
385
+
386
+ b.innerHTML = `<h4>${item.q} ${helpBtn}</h4>`;
387
+
388
  const row = document.createElement('div');
389
  row.className = 'dlx-options';
390
+
391
  SCALE.forEach(opt => {
392
  const lbl = document.createElement('label');
393
  lbl.className = 'dlx-pill';
 
402
  if (answers[d.id] && answers[d.id][i] === opt.score) lbl.classList.add('active');
403
  row.appendChild(lbl);
404
  });
405
+
406
  b.appendChild(row);
407
  card.appendChild(b);
408
  });
409
+
410
  steps.appendChild(card);
411
  bar.style.width = Math.round(current / DOMAINS.length * 100) + '%';
412
  updateButtons();