Usar paquetes del sistema securizados
Los paquetes del sistema securizados de Docker (Docker Hardened System Packages) son compilados desde el código fuente por Docker. Esto garantiza la integridad de la cadena de suministro en toda la pila de tu imagen al eliminar los riesgos derivados de paquetes públicos potencialmente comprometidos.
El acceso a los paquetes securizados varía según la suscripción:
- DHI Community: Incluye paquetes securizados en las imágenes base. Puedes configurar el repositorio público de paquetes para acceder a los mismos paquetes en imágenes personalizadas.
- DHI Select: Incluye todos los paquetes de Community, además de acceso a paquetes específicos de cumplimiento adicionales (como las variantes FIPS) y paquetes parcheados por Docker a través de la interfaz de usuario de personalización de imágenes.
- DHI Enterprise: Incluye todos los paquetes de Select, más la posibilidad de configurar el repositorio de paquetes empresarial directamente en tus propias imágenes para obtener acceso completo a los paquetes de cumplimiento y con parches de seguridad.
Paquetes integrados
Las distribuciones compatibles de Docker Hardened Images (DHI) incluyen automáticamente paquetes del sistema securizados. No se requiere ninguna configuración adicional. Descarga y usa las imágenes de forma habitual.
Todos los paquetes de estas imágenes son compilados por Docker a partir de su código fuente, manteniendo los mismos estándares de seguridad que las propias imágenes base.
Añadir paquetes securizados a tus imágenes
Puedes añadir paquetes securizados a tus propias imágenes de las dos formas siguientes.
Añadir paquetes mediante la personalización de imágenes
Al personalizar Docker Hardened Images con DHI Select o DHI Enterprise, puedes añadir paquetes securizados para imágenes basadas en Alpine a través de la interfaz de personalización. Sigue los pasos para crear una personalización de imagen y selecciona los paquetes securizados durante el proceso de personalización.
Configurar el gestor de paquetes
Puedes configurar tu gestor de paquetes para descargar desde los repositorios de paquetes securizados de Docker. Esto te deja instalar paquetes securizados en tus propias imágenes.
Repositorio público
Para usar el repositorio público de paquetes securizados de Docker en tus propias imágenes, configura el gestor de paquetes Alpine en tu Dockerfile.
El proceso de configuración consta de tres pasos:
- Instalar la clave de firma
- Configurar el repositorio de paquetes
- Actualizar e instalar paquetes
El siguiente ejemplo muestra cómo configurar el gestor de paquetes Alpine en tu Dockerfile para usar el repositorio público de paquetes securizados de Docker:
FROM alpine:3.23
# Instalar la clave de firma
RUN cd /etc/apk/keys && \
wget https://dhi.io/keyring/[email protected]
# Reemplazar los repositorios predeterminados con el repositorio de paquetes securizados
RUN echo "https://dhi.io/apk/alpine/v3.23/main" > /etc/apk/repositories
# Actualizar e instalar paquetes
RUN apk update && \
apk add libpngReemplaza 3.23 con tu versión de Alpine tanto en la etiqueta de la imagen base como en la URL del repositorio.
Para verificar la configuración, compila y ejecuta la imagen:
$ docker build -t myapp:latest .
$ docker run -it myapp:latest sh
Dentro del contenedor, comprueba los repositorios configurados:
/ # cat /etc/apk/repositories
https://dhi.io/apk/alpine/v3.23/main
Esto garantiza que todos los paquetes se instalen desde el repositorio securizado de Docker.
Todos los paquetes instalados desde el repositorio de Docker Hardened Images son compilados desde el código fuente por Docker e incluyen procedencia completa.
Repositorio empresarial
Con DHI Enterprise, tienes acceso a un repositorio de paquetes adicional que incluye paquetes securizados para variantes de cumplimiento como FIPS, así como parches de seguridad adicionales.
El proceso de configuración consta de cinco pasos:
- Instalar la clave de firma
- Configurar el repositorio de paquetes base
- Instalar el paquete de configuración empresarial
- Configurar la instalación de paquetes con autenticación
- Compilar la imagen pasando las credenciales como un secreto utilizando la CLI de DHI
NoteDebes tener instalada y configurada la CLI de Docker Hardened Images. Para obtener más información, consulta Usar la CLI de DHI.
El siguiente ejemplo muestra cómo configurar el gestor de paquetes Alpine en tu Dockerfile para usar el repositorio de paquetes securizados empresarial de Docker:
FROM alpine:3.23
# Instalar la clave de firma
RUN cd /etc/apk/keys && \
wget https://dhi.io/keyring/[email protected]
# Reemplazar los repositorios predeterminados con el repositorio de paquetes securizados
RUN echo "https://dhi.io/apk/alpine/v3.23/main" > /etc/apk/repositories
# Actualizar e instalar el paquete de configuración empresarial para añadir el repositorio de seguridad
RUN apk update && \
apk add dhi-enterprise-conf
# Instalar paquetes desde el repositorio de seguridad con autenticación
RUN --mount=type=secret,id=http_auth \
HTTP_AUTH="$(cat /run/secrets/http_auth)" \
apk update && \
apk add openssl-fipsCompila la imagen pasando la autenticación de forma segura como un secreto de compilación:
$ dhictl auth apk > http_auth.txt
$ docker build --secret id=http_auth,src=http_auth.txt -t myapp-enterprise:latest .
$ rm http_auth.txt
La opción --secret monta de forma segura las credenciales de autenticación durante la compilación sin almacenarlas en las capas o metadatos de la imagen.
Verificar paquetes
Cada paquete securizado está firmado criptográficamente e incluye metadatos que demuestran su procedencia e integridad de compilación. Puedes verificar las firmas y ver los metadatos para asegurarte de que tus paquetes provienen de la infraestructura de compilación de confianza de Docker.
Ver los metadatos del paquete
Para ver información sobre un paquete securizado, incluida su procedencia:
$ apk info -L <package-name>
Esto muestra los archivos incluidos en el paquete y sus metadatos.
Verificar las firmas de los paquetes
Los paquetes securizados están firmados criptográficamente por Docker. Cuando instalas las claves de firma y configuras tu gestor de paquetes como se describió anteriormente, el gestor de paquetes verifica automáticamente las firmas durante la instalación.
Si un paquete no supera la verificación de la firma, el gestor de paquetes rechazará instalarlo, protegiéndote contra paquetes manipulados o comprometidos.
Procedencia de la compilación y verificación criptográfica
Los paquetes securizados de Docker son creados por la infraestructura de confianza de Docker e incluyen metadatos verificables y firmas criptográficas.
Para ver estos metadatos en un paquete instalado:
$ apk info -a <package-name>
O para ver los metadatos de un paquete antes de instalarlo:
$ apk fetch --stdout <package-name> | tar -xzO .PKGINFO
Las claves de firma de paquetes garantizan que los paquetes no hayan sido manipulados después de su compilación. Al instalar la clave de firma y configurar tu gestor de paquetes, todos los paquetes se verifican automáticamente antes de la instalación.
Atestaciones de paquetes
Cada paquete securizado incluye sus propias atestaciones, de manera similar a las atestaciones de imágenes. Estas atestaciones proporcionan información de procedencia y compilación para paquetes individuales, lo que te deja rastrear la cadena de suministro hasta el nivel de paquete.
Puedes recuperar las atestaciones de un paquete extrayendo primero la información del paquete a partir de la procedencia SLSA de la imagen, y luego usando el resumen (digest) del paquete para acceder a sus atestaciones.
Extraer información del paquete a partir de las atestaciones de la imagen
Para obtener información de procedencia de un paquete específico a partir de la atestación de procedencia SLSA de una imagen, primero debes recuperar la procedencia de la imagen y luego filtrar por el paquete específico que te interese.
La atestación de procedencia SLSA incluye una matriz materials que enumera todos los elementos de entrada de la compilación, incluidos los paquetes. Puedes usar jq para filtrar esta matriz para un paquete específico:
$ docker scout attest get dhi.io/golang:1.26-alpine3.23 \
--predicate-type https://slsa.dev/provenance/v0.2 | \
jq '.predicate.materials[] | select( .uri == "https://dhi.io/apk/alpine/v3.23/main/aarch64/golang-1.26-1.26.0-r0.apk" )'
Reemplaza la URI del paquete en el filtro select() con el paquete específico que estés buscando. Puedes encontrar los paquetes disponibles ejecutando primero el comando sin el filtro select() para ver todos los materiales.
Esto devuelve la URI del paquete y su resumen SHA-256:
{
"uri": "https://dhi.io/apk/alpine/v3.23/main/aarch64/golang-1.26-1.26.0-r0.apk",
"digest": {
"sha256": "4082a2500abc2e7b8435f9398d3514d760044fa52ca3d10cf80015469124a838"
}
}Listar atestaciones de un paquete
Con el resumen del paquete obtenido en la sección anterior, puedes listar todas las atestaciones disponibles para ese paquete:
$ curl -s https://dhi.io/apk/alpine/v3.23/main/sha256:4082a2500abc2e7b8435f9398d3514d760044fa52ca3d10cf80015469124a838/attestations/list | jq .
Esto devuelve información sobre el paquete y sus atestaciones disponibles:
{
"subject": {
"name": "pkg:apk/alpine/[email protected]?os_name=&os_version=",
"digest": {
"sha256": "4082a2500abc2e7b8435f9398d3514d760044fa52ca3d10cf80015469124a838"
}
},
"attestations": [
{
"predicate_type": "https://slsa.dev/provenance/v1",
"digest": {
"sha256": "97c919cf0edb27087739bbabeea4c1ef88d069cd41791476ba64b69280d63a32"
},
"url": "https://dhi.io/apk/alpine/v3.23/main/sha256:4082a2500abc2e7b8435f9398d3514d760044fa52ca3d10cf80015469124a838/attestations/sha256:97c919cf0edb27087739bbabeea4c1ef88d069cd41791476ba64b69280d63a32"
}
]
}Recuperar atestaciones de paquetes
Para recuperar el contenido real de la atestación, usa la URL proporcionada en la lista de atestaciones:
$ curl -s https://dhi.io/apk/alpine/v3.23/main/sha256:4082a2500abc2e7b8435f9398d3514d760044fa52ca3d10cf80015469124a838/attestations/sha256:97c919cf0edb27087739bbabeea4c1ef88d069cd41791476ba64b69280d63a32 | jq .
Esto devuelve la atestación de procedencia SLSA completa para el paquete, la cual incluye información sobre cómo se construyó el paquete, sus dependencias y otros materiales de compilación.
Puedes continuar este proceso de forma recursiva para rastrear la cadena de suministro hasta el compilador y otras herramientas de compilación utilizadas para crear el paquete.