Share feedback
Answers are generated based on the documentation.

使用加固系统包

Docker 加固系统包由 Docker 从源代码构建。这通过消除来自可能被入侵的公共软件包的风险,确保整个镜像技术栈的供应链完整性。

对加固包的访问权限因订阅而异:

  • DHI Community:在基础镜像中包含加固包。可以配置公共软件包仓库以在自定义镜像中访问相同的软件包。
  • DHI Select:包含全部 Community 软件包,外加通过镜像自定义 UI 访问额外合规相关软件包(例如 FIPS 变体)和 Docker 修补的软件包。
  • DHI Enterprise:包含全部 Select 软件包,外加能够直接在自己镜像中配置企业软件包仓库,以完整访问合规和安全修补的软件包。

要浏览 Docker 公共加固软件包仓库中当前可用的软件包,请参阅以下索引:

Docker 不断添加新的加固软件包。如果您需要的软件包尚不可用,可以在 DHI catalog 仓库中提交请求

内置软件包

Docker 加固镜像(DHI)的受支持发行版会自动包含加固系统包。无需额外配置。只需像往常一样拉取和使用镜像即可。

这些镜像中的所有软件包均由 Docker 从源代码构建,保持与基础镜像本身相同的安全标准。

将加固包添加到您的镜像

您可以通过以下两种方式将加固包添加到您自己的镜像中。

通过镜像自定义添加软件包

Subscription: Docker Hardened Images Select or Enterprise

使用 DHI Select 或 DHI Enterprise 自定义 Docker 加固镜像时,您可以通过自定义界面为基于 Alpine 的镜像添加加固包。请按照以下步骤创建镜像自定义,并在自定义过程中选择加固包。

配置包管理器

您可以将包管理器配置为从 Docker 的加固软件包仓库拉取。这使您可以在自己的镜像中安装加固包。

公共仓库

要在您自己的镜像中使用 Docker 的公共加固软件包仓库,请在 Dockerfile 中配置您的包管理器以安装 DHI 签名密钥并添加 DHI 仓库。

配置过程涉及三个步骤:

  1. 安装签名密钥
  2. 配置软件包仓库
  3. 更新并安装软件包

以下示例展示了如何在 Dockerfile 中配置 Alpine 包管理器以使用 Docker 的公共加固软件包仓库:

FROM alpine:3.23

# 安装签名密钥
RUN cd /etc/apk/keys && \
    wget https://dhi.io/keyring/[email protected]

# 用加固软件包仓库替换默认仓库
RUN echo "https://dhi.io/apk/alpine/v3.23/main" > /etc/apk/repositories

# 更新并安装软件包
RUN apk update && \
    apk add libpng

在两处(基础镜像标签和仓库 URL)将 3.23 替换为您的 Alpine 版本。受支持的版本包括 Alpine 3.23 和 3.24。

要验证配置,请构建并运行镜像:

$ docker build -t myapp:latest .
$ docker run -it myapp:latest sh

在容器内部,检查配置的仓库:

/ # cat /etc/apk/repositories
https://dhi.io/apk/alpine/v3.23/main

这确保所有软件包都从 Docker 的加固仓库安装。

以下示例展示了如何在 Dockerfile 中配置 Debian 包管理器以使用 Docker 的公共加固软件包仓库:

FROM debian:trixie-slim

# 安装签名密钥
RUN apt-get update && apt-get install -y --no-install-recommends \
    ca-certificates curl gnupg \
    && rm -rf /var/lib/apt/lists/*
RUN curl -fsSL https://dhi.io/keyring/dhi-deb-gpg.D46852F6925E9F71.key \
    | gpg --dearmor -o /usr/share/keyrings/dhi-deb.gpg

# 添加加固软件包仓库
RUN echo "deb [signed-by=/usr/share/keyrings/dhi-deb.gpg] https://dhi.io/deb/debian/main trixie main" \
    > /etc/apt/sources.list.d/dhi.list

# 更新并安装软件包
RUN apt-get update && apt-get install -y jq \
    && rm -rf /var/lib/apt/lists/*

要验证配置,请构建并运行镜像:

$ docker build -t myapp:latest .
$ docker run -it myapp:latest bash

在容器内部,检查配置的仓库:

root@myapp:/# cat /etc/apt/sources.list.d/dhi.list
deb [signed-by=/usr/share/keyrings/dhi-deb.gpg] https://dhi.io/deb/debian/main trixie main

当 DHI 仓库提供某个软件包的加固版本时,apt 会自动优先选择它而非上游 Debian 版本。您可以使用 apt-cache policy <package> 确认这一点,它会显示一个来自 https://dhi.io/deb/debian/main 的带有 +dhidhi 版本后缀的候选版本。

并非每个 Debian 软件包都作为加固系统包提供。当某个软件包不在 DHI 仓库中时,apt 会透明地回退到基础镜像中配置的上游 Debian 镜像。

从 Docker 加固镜像仓库安装的所有软件包均由 Docker 从源代码构建,并包含完整的溯源信息。

企业仓库

Subscription: Docker Hardened Images Enterprise

使用 DHI Enterprise,您可以访问一个额外的软件包仓库,其中包含用于合规变体(例如 FIPS)的加固软件包,以及额外的安全补丁。

配置过程涉及五个步骤:

  1. 安装签名密钥
  2. 配置基础软件包仓库
  3. 添加企业安全仓库
  4. 使用身份验证配置软件包安装
  5. 使用 DHI CLI 将凭据作为 secret 传入来构建镜像

以下示例展示了如何在 Dockerfile 中配置 Alpine 包管理器以使用 Docker 的企业加固软件包仓库:

FROM alpine:3.23

# 安装签名密钥
RUN cd /etc/apk/keys && \
    wget https://dhi.io/keyring/[email protected]

# 用加固软件包仓库替换默认仓库
RUN echo "https://dhi.io/apk/alpine/v3.23/main" > /etc/apk/repositories

# 更新并安装企业配置包以添加安全仓库
RUN apk update && \
    apk add dhi-enterprise-conf

# 使用身份验证从安全仓库安装软件包
RUN --mount=type=secret,id=http_auth \
    HTTP_AUTH="$(cat /run/secrets/http_auth)" \
    apk update && \
    apk add openssl-fips

使用作为构建 secret 安全传入的身份验证信息构建镜像:

$ docker dhi auth apk > http_auth.txt
$ docker build --secret id=http_auth,src=http_auth.txt -t myapp-enterprise:latest .
$ rm http_auth.txt

--secret 标志在构建期间安全地挂载身份验证凭据,而不会将其存储在镜像层或元数据中。

以下示例展示了如何在 Dockerfile 中配置 Debian 包管理器以使用 Docker 的企业加固软件包仓库。在 /etc/apt/auth.conf.d/dhi.conf 挂载凭据;当文件权限为 0600 时,apt 会自动读取 /etc/apt/auth.conf.d/ 中的文件:

FROM debian:trixie-slim

# 安装签名密钥
RUN apt-get update && apt-get install -y --no-install-recommends \
    ca-certificates curl gnupg \
    && rm -rf /var/lib/apt/lists/*
RUN curl -fsSL https://dhi.io/keyring/dhi-deb-gpg.D46852F6925E9F71.key \
    | gpg --dearmor -o /usr/share/keyrings/dhi-deb.gpg
RUN curl -fsSL https://dhi.io/keyring/dhi-deb-sec-gpg.D46852F6925E9F71.key \
    | gpg --dearmor -o /usr/share/keyrings/dhi-deb-sec.gpg

# 添加加固软件包仓库和企业安全仓库
RUN echo "deb [signed-by=/usr/share/keyrings/dhi-deb.gpg] https://dhi.io/deb/debian/main trixie main" \
    > /etc/apt/sources.list.d/dhi.list
RUN echo "deb [signed-by=/usr/share/keyrings/dhi-deb-sec.gpg] https://dhi.io/deb/debian/security trixie main" \
    > /etc/apt/sources.list.d/dhi-sec.list

# 使用身份验证从安全仓库安装软件包
RUN --mount=type=secret,id=netrc,target=/etc/apt/auth.conf.d/dhi.conf,mode=0600 \
    apt-get update && apt-get install -y openssl \
    && rm -rf /var/lib/apt/lists/*

通过环境变量将凭据作为构建 secret 安全传入来构建镜像:

$ NETRC=$(docker dhi auth deb) docker build \
    --secret id=netrc,env=NETRC \
    -t myapp-enterprise:latest .

--secret id=netrc,env=NETRC 形式在构建期间安全地挂载身份验证凭据,而不会将其存储在镜像层或元数据中。

验证软件包

每个加固包都经过加密签名,并包含证明其溯源和构建完整性的元数据。您可以验证签名并查看元数据,以确保您的软件包来自 Docker 受信任的构建基础设施。

查看软件包元数据

要查看加固包的信息:

$ apk info -L <package-name>
$ dpkg -L <package-name>

这会显示软件包中包含的文件及其元数据。

验证软件包签名

加固包由 Docker 进行加密签名。当您按照前述方式安装签名密钥并配置包管理器时,包管理器会在安装过程中自动验证签名。

如果某个软件包签名验证失败,包管理器将拒绝安装它,从而保护您免受被篡改或泄露的软件包影响。

构建溯源与加密验证

Docker 加固包由 Docker 受信任的基础设施构建,并包含可验证的元数据和加密签名。

要查看已安装软件包的此元数据:

$ apk info -a <package-name>
$ apt-cache show <package-name>

或者要查看安装前软件包的元数据:

$ apk fetch --stdout <package-name> | tar -xzO .PKGINFO
$ apt-get download <package-name>
$ dpkg-deb -I <package-name>_*.deb

软件包签名密钥确保软件包在构建后未被篡改。当您安装签名密钥并配置包管理器时,所有软件包都会在安装前自动验证。

软件包证明

每个加固包都包含自己的证明,类似于镜像证明。这些证明为单个软件包提供溯源和构建信息,使您能够将供应链追踪到软件包级别。

您可以先从镜像的 SLSA 溯源中提取软件包信息,然后使用软件包摘要来访问其证明。

从镜像证明中提取软件包信息

要从镜像的 SLSA 溯源证明中获取特定软件包的溯源信息,您首先需要检索镜像的溯源,然后针对您感兴趣的特定软件包进行筛选。

SLSA 溯源证明包含一个 materials 数组,其中列出所有构建输入,包括软件包。您可以使用 jq 针对特定软件包筛选此数组:

$ 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" )'

select() 筛选器中的软件包 URI 替换为您要查找的特定软件包。您可以先不带 select() 筛选器运行命令以查看所有 materials,从而找到可用的软件包。

这会返回软件包 URI 及其 SHA-256 摘要:

{
  "uri": "https://dhi.io/apk/alpine/v3.23/main/aarch64/golang-1.26-1.26.0-r0.apk",
  "digest": {
    "sha256": "4082a2500abc2e7b8435f9398d3514d760044fa52ca3d10cf80015469124a838"
  }
}

列出软件包的可用证明

使用上一节中的软件包摘要,您可以列出该软件包所有可用的证明:

$ curl -s https://dhi.io/apk/alpine/v3.23/main/sha256:4082a2500abc2e7b8435f9398d3514d760044fa52ca3d10cf80015469124a838/attestations/list | jq .

这会返回有关该软件包及其可用证明的信息:

{
  "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"
    }
  ]
}

检索软件包证明

要检索实际的证明内容,请使用证明列表中提供的 URL:

$ curl -s https://dhi.io/apk/alpine/v3.23/main/sha256:4082a2500abc2e7b8435f9398d3514d760044fa52ca3d10cf80015469124a838/attestations/sha256:97c919cf0edb27087739bbabeea4c1ef88d069cd41791476ba64b69280d63a32 | jq .

这会返回该软件包的完整 SLSA 溯源证明,其中包含有关该软件包如何构建、其依赖项以及其他构建材料的信息。

您可以递归地继续此过程,将供应链一直追踪到用于创建该软件包的编译器和其他构建工具。