# Configurar excepciones del socket de Docker y ajustes avanzados





Esta página te muestra cómo configurar excepciones del socket de Docker y otros ajustes avanzados para el Aislamiento de Contenedores Mejorado (ECI). Estas configuraciones permiten que herramientas de confianza como Testcontainers funcionen con ECI al tiempo que mantienen la seguridad.

## Permisos de montaje del socket de Docker

Por defecto, el Aislamiento de Contenedores Mejorado bloquea a los contenedores el montaje del socket de Docker para evitar accesos maliciosos al motor de Docker. Sin embargo, algunas herramientas requieren acceso al socket de Docker.

Los escenarios comunes que requieren acceso al socket de Docker incluyen:

- Marcos de prueba (testing frameworks): Testcontainers, que administra contenedores de prueba.
- Herramientas de compilación: Paketo buildpacks que crean contenedores de compilación efímeros.
- Herramientas de CI/CD: Herramientas que gestionan contenedores como parte de los flujos de despliegue.
- Utilidades de desarrollo: Contenedores de la CLI de Docker para la gestión de contenedores.

## Configurar excepciones del socket

Configura las excepciones del socket de Docker utilizando la Gestión de Ajustes (Settings Management):

**Consola de Administración**



1. Inicia sesión en [Docker Home](https://app.docker.com) y selecciona tu organización en el menú desplegable de cuentas en la esquina superior izquierda.
2. Ve a **Admin Console** (Consola de administración) > **Desktop Settings Management** (Gestión de Ajustes de Desktop).
3. [Crea o edita una política de configuración](/enterprise/security/hardened-desktop/settings-management/configure-admin-console/).
4. Busca los ajustes de **Enhanced Container Isolation** (Aislamiento de Contenedores Mejorado).
5. Configura el **Docker socket access control** (Control de acceso al socket de Docker) con tus imágenes de confianza y restricciones de comandos.

**Archivo JSON**



Crea un [archivo `admin-settings.json`](/enterprise/security/hardened-desktop/settings-management/configure-json-file/) y agrega:

```json
{
  "configurationFileVersion": 2,
  "enhancedContainerIsolation": {
    "locked": true,
    "value": true,
    "dockerSocketMount": {
      "imageList": {
        "images": [
          "docker.io/localstack/localstack:*",
          "docker.io/testcontainers/ryuk:*",
          "docker:cli"
        ],
        "allowDerivedImages": true
      },
      "commandList": {
        "type": "deny",
        "commands": ["push", "build"]
      }
    }
  }
}
```



## Configuración de la lista de imágenes permitidas

La clave `imageList` define qué imágenes de contenedor pueden montar el socket de Docker.

### Formatos de referencia de imágenes

| Formato | Descripción |
| :---------------------- | :---------- |
| `<nombre_imagen>[:<etiqueta>]` | Nombre de la imagen, con etiqueta opcional. Si se omite la etiqueta, se utiliza la etiqueta `:latest`. Si la etiqueta es el comodín `*`, significa "cualquier etiqueta para esa imagen". |
| `<nombre_imagen>@<digest>` | Nombre de la imagen con un digest de repositorio específico (por ejemplo, el que reporta `docker buildx imagetools inspect <imagen>`). Esto significa que solo se permite la imagen que coincida con ese nombre y digest. |

### Ejemplos de configuración

Lista de permitidos básica para herramientas de prueba:

```json
"imageList": {
  "images": [
    "docker.io/testcontainers/ryuk:*",
    "docker:cli",
    "alpine:latest"
  ]
}
```

Lista de permitidos con comodín (Docker Desktop 4.36 y posteriores):

```json
"imageList": {
  "images": ["*"]
}
```

> [!WARNING]
>
> Usar `"*"` permite a todos los contenedores montar el socket de Docker, lo que reduce la seguridad. Utilízalo únicamente cuando no sea viable listar explícitamente las imágenes permitidas.

### Validación de seguridad

Docker Desktop valida las imágenes permitidas al:

1. Descargar los digests de imagen desde los registros para las imágenes permitidas.
2. Comparar los digests de las imágenes de contenedor con la lista de permitidos cuando se inician los contenedores.
3. Bloquear los contenedores cuyos digests no coincidan con las imágenes permitidas.

Esto evita que se eludan las restricciones al volver a etiquetar imágenes no autorizadas:

```console
$ docker tag imagen-maliciosa docker:cli
$ docker run -v /var/run/docker.sock:/var/run/docker.sock docker:cli
# Esto falla porque el digest no coincide con la imagen real de docker:cli
```

## Soporte para imágenes derivadas

Para herramientas como Paketo buildpacks que crean imágenes locales efímeras, puedes permitir imágenes derivadas de imágenes base de confianza.

### Habilitar imágenes derivadas

```json
"imageList": {
  "images": [
    "paketobuildpacks/builder:base"
  ],
  "allowDerivedImages": true
}
```

Cuando `allowDerivedImages` es verdadero, las imágenes locales construidas a partir de imágenes base permitidas (utilizando `FROM` en el Dockerfile) también obtienen acceso al socket de Docker.

### Requisitos de las imágenes derivadas

- Solo imágenes locales: Las imágenes derivadas no deben existir en registros remotos.
- Imagen base disponible: La imagen padre debe descargarse localmente primero.
- Impacto en el rendimiento: Agrega hasta 1 segundo al inicio del contenedor para la validación.
- Compatibilidad de versiones: El soporte completo de comodines requiere Docker Desktop 4.36+.

## Restricciones de comandos

### Lista de denegados (recomendada)

Bloquea los comandos especificados mientras permite todos los demás:

```json
"commandList": {
  "type": "deny",
  "commands": ["push", "build", "image*"]
}
```

### Lista de permitidos

Solo permite los comandos especificados mientras bloquea todos los demás:

```json
"commandList": {
  "type": "allow",
  "commands": ["ps", "container*", "volume*"]
}
```

### Comodines de comandos

| Comodín | Bloquea/permite |
| :---------------- | :---------- |
| `"container\*"` | Todos los comandos "docker container ..." |
| `"image\*"` | Todos los comandos "docker image ..." |
| `"volume\*"` | Todos los comandos "docker volume ..." |
| `"network\*"` | Todos los comandos "docker network ..." |
| `"build\*"` | Todos los comandos "docker build ..." |
| `"system\*"` | Todos los comandos "docker system ..." |

### Ejemplo de bloqueo de comandos

Cuando se ejecuta un comando bloqueado:

```console
/ # docker push miimagen
Error response from daemon: enhanced container isolation: docker command "/v1.43/images/miimagen/push?tag=latest" is blocked; if you wish to allow it, configure the docker socket command list in the Docker Desktop settings.
```

## Ejemplos de configuración comunes

### Configuración para Testcontainers

Para pruebas de Java/Python con Testcontainers:

```json
"dockerSocketMount": {
  "imageList": {
    "images": [
      "docker.io/testcontainers/ryuk:*",
      "testcontainers/*:*"
    ]
  },
  "commandList": {
    "type": "deny",
    "commands": ["push", "build"]
  }
}
```

### Herramientas de flujo de trabajo de CI/CD

Para una gestión controlada de contenedores de CI/CD:

```json
"dockerSocketMount": {
  "imageList": {
    "images": [
      "docker:cli",
      "tu-registro.com/herramientas-ci/*:*"
    ]
  },
  "commandList": {
    "type": "allow",
    "commands": ["ps", "container*", "image*"]
  }
}
```

### Entornos de desarrollo

Para el desarrollo local con Docker-in-Docker:

```json
"dockerSocketMount": {
  "imageList": {
    "images": [
      "docker:dind",
      "docker:cli"
    ]
  },
  "commandList": {
    "type": "deny",
    "commands": ["system*"]
  }
}
```

## Recomendaciones de seguridad

### Mejores prácticas para la lista de imágenes permitidas

- Sé restrictivo: Solo permite imágenes en las que confíes plenamente y que necesites.
- Utiliza comodines con cuidado: Los comodines de etiqueta (`*`) son prácticos pero menos seguros que las etiquetas específicas.
- Revisiones periódicas: Revisa y actualiza tu lista de permitidos periódicamente.
- Fijación de digests (pinning): Utiliza referencias de digests para lograr la máxima seguridad en entornos críticos.

### Restricciones de comandos

- Denegación por defecto: Comienza con una lista de denegados que bloquee comandos peligrosos como `push` y `build`.
- Principio de mínimo privilegio: Solo permite los comandos que tus herramientas realmente necesiten.
- Monitorea el uso: Realiza un seguimiento de qué comandos se están bloqueando para perfeccionar tu configuración.

### Monitoreo y mantenimiento

- Validación periódica: Prueba tu configuración después de las actualizaciones de Docker Desktop, ya que los digests de las imágenes pueden cambiar.
- Manejo de discrepancias en digests: Si las imágenes permitidas se bloquean inesperadamente:
    ```console
    $ docker image rm <imagen>
    $ docker pull <imagen>
    ```

Esto resuelve las discrepancias de digest cuando se actualizan las imágenes ascendentes.

## Siguientes pasos

- Revisar las [Limitaciones del Aislamiento de Contenedores Mejorado](/enterprise/security/hardened-desktop/enhanced-container-isolation/limitations/).
- Revisar las [Preguntas frecuentes sobre el Aislamiento de Contenedores Mejorado](/enterprise/security/hardened-desktop/enhanced-container-isolation/faq/).

