You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Refactor README.md to streamline security options section, removing redundant explanations and examples for seccomp and AppArmor, while retaining essential information for clarity.
Copy file name to clipboardExpand all lines: 01-contenedores/contenedores-ii/README.md
+3-293Lines changed: 3 additions & 293 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -172,291 +172,6 @@ Las variables de entorno permiten configurar aplicaciones sin modificar la image
172
172
-`DB_*`: Configuración de base de datos
173
173
-`APP_*`: Configuraciones específicas de la aplicación
174
174
175
-
176
-
177
-
### 🔒 **Opciones de seguridad (--security-opt)**
178
-
179
-
Configuran políticas de seguridad del contenedor y controlan qué acceso tiene el contenedor a las llamadas del sistema.
180
-
181
-
Pero espera, ¿qué son **seccomp** y **AppArmor**? Si es la primera vez que lo escuchas, no te preocupes, es más sencillo de lo que parece:
182
-
183
-
#### 📚 **¿Qué es seccomp?**
184
-
185
-
**seccomp** (del inglés "Secure Computing") es un **filtro de seguridad a nivel del kernel de Linux** que actúa como un intermediario entre tus programas y el sistema operativo.
186
-
187
-
Piénsalo así:
188
-
- Tu aplicación quiere hacer algo (abrir un archivo, crear un proceso, acceder a la red, etc.)
189
-
- El kernel necesita ejecutar una **"llamada del sistema"** (syscall) para hacer eso
190
-
-**seccomp intercepta esa llamada** y comprueba si está permitida según sus reglas
191
-
- Si está permitida → se ejecuta ✅
192
-
- Si NO está permitida → se bloquea 🚫
193
-
194
-
**Ejemplo real:**
195
-
- Firefox necesita acceder a gráficos de bajo nivel → necesita muchas syscalls especiales
196
-
- Una aplicación web normal → solo necesita syscalls básicas (leer archivos, conectar a red, crear procesos)
197
-
198
-
Docker por defecto aplica un perfil seccomp que **solo permite las syscalls seguras y necesarias**, bloqueando operaciones peligrosas que podrían comprometer la seguridad del sistema.
199
-
200
-
#### 📚 **¿Qué es AppArmor?**
201
-
202
-
**AppArmor** es un **sistema de control de acceso obligatorio (MAC)** que define qué puede y qué no puede hacer cada programa.
203
-
204
-
Piénsalo como un "permiso de acceso" muy granular:
205
-
- Este programa **puede** leer archivos de `/usr/share/`
206
-
- Este programa **no puede** acceder a `/etc/shadow` (archivo de contraseñas)
207
-
- Este programa **no puede** modificar archivos en `/bin/`
208
-
209
-
Docker aplica por defecto un perfil AppArmor llamado `docker-default` que restringe las operaciones de los contenedores.
210
-
211
-
#### 🔄 **seccomp vs AppArmor - ¿Cuál es la diferencia?**
212
-
213
-
| Aspecto | seccomp | AppArmor |
214
-
|--------|---------|----------|
215
-
|**Qué filtra**| Llamadas del sistema (syscalls) | Acceso a archivos, red, etc. |
216
-
|**Nivel**| Kernel (muy bajo nivel) | Sistema de archivos y red |
217
-
|**Ejemplo bloqueo**| Evita que crees procesos nuevos | Evita que leas `/etc/shadow`|
218
-
|**Overhead**| Muy bajo | Bajo |
219
-
220
-
Ambos trabajan juntos para crear múltiples capas de seguridad.
-**Sin seccomp**: Se permite todo, incluso lo peligroso ⚠️ Menos seguro
250
-
251
-
**📌 ¿Qué es ptrace y por qué está bloqueado?**
252
-
253
-
`ptrace` es una syscall (llamada del sistema) que permite a un proceso **"espiar" o "debuggear" otros procesos**:
254
-
255
-
-**Usos legítimos**: Debuggers (gdb, lldb), profilers, herramientas de análisis
256
-
-**Usos maliciosos**: Un contenedor podría usarlo para:
257
-
- Inyectar código en otros procesos
258
-
- Leer la memoria de otros procesos (¡y encontrar contraseñas!)
259
-
- Modificar el comportamiento de otros procesos
260
-
- Escapar del contenedor accediendo a procesos del host
261
-
262
-
Por eso Docker **bloquea ptrace por defecto** con seccomp. Si necesitas debuggear o usar herramientas de profiling dentro de un contenedor de desarrollo, es cuando desactivarías seccomp (`--security-opt seccomp=unconfined`), pero **nunca en producción**.
--security-opt no-new-privileges # Evita escalada de privilegios
340
-
```
341
-
342
-
**📋 Valores por defecto (cuando no especificas nada):**
343
-
344
-
Por defecto, Docker aplica configuraciones **seguras y restrictivas**:
345
-
346
-
| Opción | Por defecto | Qué significa |
347
-
|--------|-------------|---------------|
348
-
|**seccomp**|`default` (restrictivo) | Docker aplica un perfil de seccomp que filtra llamadas del sistema peligrosas. Protege contra ataques a nivel de kernel |
349
-
|**apparmor**|`docker-default`| Se aplica el perfil de AppArmor específico de Docker que limita operaciones del contenedor |
350
-
|**privileges**| No permitidos | Los procesos NO pueden escalar privilegios (cambiar de usuario/grupo) |
351
-
352
-
**� Entendiendo cada opción:**
353
-
354
-
-**`seccomp=unconfined`**: Desactiva el filtro de seguridad de llamadas del sistema (syscalls).
355
-
-**En la práctica**: Tu contenedor puede hacer prácticamente cualquier cosa a nivel del kernel, incluyendo operaciones peligrosas que podrían comprometer el host.
356
-
-**Cuándo necesitas esto**: Aplicaciones gráficas como Firefox, Chrome o herramientas de debugging de bajo nivel que requieren acceso directo al kernel (ej: Frida, GDB con capacidades especiales).
357
-
-**El coste**: **⚠️ Reduce significativamente la seguridad**. Un atacante podría usar syscalls peligrosas para escapar del contenedor o comprometer el host.
358
-
-**Si no lo especificas**: Docker mantiene el filtro por defecto (seguro), bloqueando syscalls peligrosas como `ptrace`, `kexec`, `bpf`, etc.
359
-
-**Ejemplo**: Firefox necesita `mmap` con permisos especiales y acceso a `/dev/dri/` (gráficos), por eso requiere `seccomp=unconfined`.
360
-
361
-
-**`apparmor=unconfined`**: Desactiva AppArmor (el sistema de control de acceso obligatorio de Linux).
362
-
-**En la práctica**: Sin AppArmor, tu contenedor tiene acceso mucho más permisivo al sistema de archivos y puede acceder a más recursos.
363
-
-**Cuándo necesitas esto**: Raramente. La mayoría de aplicaciones funcionan bien con el perfil `docker-default`. Solo en casos muy específicos donde necesites acceso a archivos o directorios que AppArmor bloquea.
364
-
-**El coste**: Aumenta la superficie de ataque. Un contenedor malicioso podría acceder a más recursos del sistema.
365
-
-**Si no lo especificas**: Se aplica el perfil `docker-default`, que es una buena combinación de seguridad y funcionalidad.
366
-
-**Diferencia respecto a seccomp**: Mientras seccomp filtra *qué* se puede hacer a nivel del kernel, AppArmor filtra *a dónde* se puede acceder (archivos, puertos, etc.).
367
-
368
-
-**`no-new-privileges`**: Evita que procesos dentro del contenedor puedan **escalar privilegios** (cambiar de usuario/grupo o ganar más permisos).
369
-
-**En la práctica**: Un proceso que corre como usuario normal (ej: www-data) NO puede convertirse en root, incluso si encuentra una vulnerabilidad en setuid binaries.
370
-
-**Ejemplo de ataque bloqueado**: Sin `no-new-privileges`, un atacante podría aprovechar un binario setuid para escalar a root. Con esta opción, se previene.
371
-
-**Caso de uso**: Aplicaciones que no necesitan cambiar de usuario durante su ejecución (la mayoría).
372
-
-**El coste**: Muy bajo. Principalmente la restricción de que no puedas usar `sudo` o funcionalidades que requieran cambio de usuario dentro del contenedor.
373
-
-**Si no lo especificas**: Este es el **por defecto** en Docker, así que tu aplicación ya está protegida contra escalada de privilegios.
374
-
375
-
**⚠️ Importante**: `seccomp=unconfined` se usa para apps gráficas que necesitan acceso completo al sistema, pero reduce la seguridad. Solo úsalo cuando sea absolutamente necesario.
376
-
377
-
**💡 Recomendación**: La configuración por defecto de Docker es segura. Mantén la restricción si tu aplicación no necesita acceso de bajo nivel. Solo desactívalo cuando sea necesario, y siempre como última opción después de otros intentos.
378
-
379
-
#### 🎯 **Resumen: Las tres capas de seguridad**
380
-
381
-
Docker proporciona tres capas de seguridad que trabajan juntas:
382
-
383
-
1.**seccomp**: ¿Qué syscalls (operaciones de kernel) puedo ejecutar?
384
-
- Por defecto: Bloqueado (muy restrictivo)
385
-
- Activado en: Aplicaciones gráficas (Firefox, Chrome), debugging de bajo nivel
386
-
2.**AppArmor**: ¿A qué archivos, puertos y recursos puedo acceder?
387
-
- Por defecto: Perfil `docker-default` (restrictivo pero funcional)
388
-
- Raramente necesitas desactivarlo
389
-
3.**no-new-privileges**: ¿Puedo cambiar de usuario/grupo para ganar más permisos?
390
-
- Por defecto: Desactivado (protegido contra escalada)
391
-
- Previene que un atacante use vulnerabilidades para convertirse en root
392
-
393
-
**Analogía**: Es como entrar en una escuela:
394
-
-**seccomp** = "¿Qué actividades puedo hacer?" (solo las permitidas por la dirección)
395
-
-**AppArmor** = "¿A qué lugares puedo acceder?" (aulas permitidas, no la directiva)
396
-
-**no-new-privileges** = "¿Puedo pretender ser un profesor?" (no, el sistema lo bloquea)
397
-
398
-
Todas juntas crean un contenedor **muy restringido pero funcional** que es seguro por defecto.
399
-
400
-
**Ejemplos de uso:**
401
-
402
-
```bash
403
-
# Contenedor seguro (sin especificar nada, usa valores por defecto)
--shm-size="1gb"`# ¡Memoria compartida para el navegador!`\
280
+
--shm-size="1gb" \
569
281
lscr.io/linuxserver/firefox:latest
570
282
```
571
283
@@ -602,8 +314,6 @@ docker run -d \
602
314
603
315
**Acceso:** Una vez ejecutado, accede a `http://localhost:5678` para completar la configuración inicial.
604
316
605
-
> 💡 **Nota**: En próximas clases aprenderemos a usar volúmenes (`-v`) para persistir datos en n8n y otras aplicaciones.
606
-
607
317
### 📌 ¿Qué puerto tengo que abrir?
608
318
¿Y cómo sé qué puertos tengo que abrir? Pues en la documentación de cada imagen te lo indican. Por ejemplo, en la de [Radarr](https://hub.docker.com/r/linuxserver/radarr) te indican que tienes que abrir el puerto 7878.
609
319
Por otro lado, puedes saber qué puerto puedes exponer para una imagen que ya tienes descargada con el siguiente comando:
0 commit comments