# Modelo de confianza para archivos de Compose


Docker Compose trata cada archivo de Compose como una entrada de confianza. Cuando un archivo de Compose solicita privilegios elevados, acceso al sistema de archivos del host o cualquier otra configuración, Compose la aplica tal como está escrita. Este es el mismo comportamiento que pasar banderas directamente a `docker run`.

Esto significa que cualquier archivo de Compose que ejecutes, ya sea que se encuentre en tu sistema de archivos local, en un repositorio de Git o en un registro de OCI, tiene control total sobre cómo interactúan los contenedores con tu host. El límite de seguridad no reside en la procedencia del archivo, sino en si confías en el autor.

Evaluar la confianza implica preguntarse: ¿Quién es el autor de este archivo? ¿Ha cambiado desde la última vez que lo revisaste? ¿Entiendes cada privilegio que solicita?

## La cadena de dependencias

Una aplicación de Compose se puede ensamblar a partir de múltiples fuentes. La directiva [`include`](/reference/compose-file/include/) importa archivos de Compose completos, mientras que [`extends`](/reference/compose-file/services/#extends) hereda la configuración de un servicio específico en otro archivo. Ambas admiten referencias remotas y pueden encadenarse:

```text
Tu comando
  └─ compose.yaml                                    (local o remoto)
       ├─ services, volumes, networks                (configuración directa)
       ├─ include:
       │    └─ oci://registry.example.com/base:v2   (dependencia remota)
       │         └─ services, volumes, networks      (configuración indirecta)
       └─ services:
            └─ app:
                 └─ extends:
                      └─ file: oci://registry.example.com/templates:v1
                           └─ service: webapp        (configuración heredada)
```

Cada nivel tiene las mismas capacidades. El archivo de nivel superior que inspeccionas puede parecer seguro, mientras que un `include` o `extends` anidado puede introducir servicios con privilegios elevados, montajes de tipo bind del host o imágenes que no son de confianza. Estas dependencias también pueden cambiar de forma independiente. Se pueden introducir configuraciones de riesgo mediante una dependencia anidada que nunca verás a menos que inspecciones la salida completamente resuelta.

> [!IMPORTANT]
>
> Compose te advierte cuando una configuración hace referencia a fuentes remotas. No aceptes esto sin comprender cada referencia en la cadena.

## Buenas prácticas

### Inspeccionar la configuración completa

Para ver exactamente qué es lo que Compose aplica, incluyendo todos los `includes` y `extends` resueltos, los valores sobrescritos fusionados y las variables interpoladas, utiliza:

```console
$ docker compose config
```

Para referencias remotas:

```console
$ docker compose -f oci://registry.example.com/myapp:latest config
```

Revisa esta salida antes de ejecutar `up` or `create`, especialmente cuando la configuración provenga de una fuente que no hayas auditado.

#### Campos a tener en cuenta

Una configuración de Compose tiene un amplio control sobre cómo interactúan los contenedores con el host. La siguiente es una lista no exhaustiva de campos que tienen implicaciones de seguridad cuando son establecidos por un autor que no es de confianza:

| Campo                     | Efecto                                                         |
| ------------------------- | -------------------------------------------------------------- |
| `privileged`              | Concede al contenedor acceso total al host                     |
| `cap_add`                 | Añade capacidades de Linux como `SYS_ADMIN` o `NET_RAW`        |
| `security_opt`            | Configura perfiles de seguridad, incluyendo seccomp y AppArmor |
| `volumes` / montajes bind | Monta directorios del host en el contenedor                    |
| `network_mode: host`      | Comparte el stack de red del host                              |
| `pid: host`               | Comparte el espacio de nombres PID del host                    |
| `devices`                 | Expone dispositivos del host al contenedor                     |
| `image`                   | Descarga y ejecuta una imagen de contenedor arbitraria         |

En caso de duda, investiga el efecto de cualquier campo desconocido antes de ejecutar la configuración.

### Entornos de CI/CD

Las pipelines (tuberías) automatizadas son especialmente sensibles porque a menudo se ejecutan con acceso a credenciales, tokens de proveedores de nube o sockets de Docker.

- Evita hacer referencia a configuraciones de Compose públicas o no verificadas en pipelines automatizadas.
- Restringe las actualizaciones condicionándolas a tu proceso habitual de revisión de código.
- Utiliza montajes de socket de Docker de solo lectura siempre que sea posible para limitar el riesgo.

### Fijar referencias remotas a resúmenes (digests)

Las etiquetas (tags) son mutables, lo que significa que cualquiera con acceso de subida a un registro puede sobrescribir una etiqueta de forma silenciosa, por lo que una referencia que revisaste la semana pasada puede apuntar a un contenido diferente más adelante.

Los resúmenes (digests) son inmutables. En lugar de hacer referencia por etiqueta, fíjala al digest.

```yaml
include:
  - oci://registry.example.com/base@sha256:a1b2c3d4...
```

Trata cualquier actualización de un digest fijado como un cambio de código. Asegúrate de revisar el contenido antes de actualizar la referencia.

### Otros

- Utiliza un registro privado: Aloja los artefactos OCI en un registro que controle tu organización. Restringe quién puede subir contenido a él.
- Audita las dependencias transitivas: Comprueba cada referencia remota de `include` y `extends` en la cadena, no únicamente el archivo de nivel superior.
- Revisa todas las solicitudes de confirmación de Compose: Al cargar archivos de Compose remotos, Compose muestra solicitudes de confirmación para las variables de interpolación, los valores de entorno y los includes remotos. Revisa estos valores antes de aceptarlos.

## Más información

- [Aplicaciones de artefactos OCI](/compose/how-tos/oci-artifact/)
- [Usar Compose en producción](/compose/how-tos/production/)
- [Referencia de `include`](/reference/compose-file/include/)
- [Referencia de `extends`](/reference/compose-file/services/#extends)
- [Gestionar secretos en Compose](/compose/how-tos/use-secrets/)

