3.6. 使用签名的容器


自动化执行环境是 Ansible 自动化控制器用来运行作业的容器镜像。您可以将此内容下载到私有自动化中心,并在您的机构内发布它。

3.6.1. 为容器签名部署您的系统

自动化中心实施镜像签名,以便为执行环境容器镜像提供更好的安全性。

要部署您的系统,使其准备好进行容器签名,请创建一个签名脚本。

注意

安装程序会在安装程序所在的同一服务器上查找脚本和密钥。

流程

  1. 在终端中,创建一个签名脚本,并将脚本路径作为安装程序参数传递。

    示例

    #!/usr/bin/env bash
    
    # pulp_container SigningService will pass the next 4 variables to the script.
    MANIFEST_PATH=$1
    FINGERPRINT="$PULP_SIGNING_KEY_FINGERPRINT"
    IMAGE_REFERENCE="$REFERENCE"
    SIGNATURE_PATH="$SIG_PATH"
    
    # Create container signature using skopeo
    skopeo standalone-sign \
      $MANIFEST_PATH \
      $IMAGE_REFERENCE \
      $FINGERPRINT \
      --output $SIGNATURE_PATH
    
    # Optionally pass the passphrase to the key if password protected.
    # --passphrase-file /path/to/key_password.txt
    
    # Check the exit status
    STATUS=$?
    if [ $STATUS -eq 0 ]; then
      echo {\"signature_path\": \"$SIGNATURE_PATH\"}
    else
      exit $STATUS
    fi
    Copy to Clipboard Toggle word wrap
  2. 查看 Ansible Automation Platform 安装程序清单文件,了解以 automationhub -4.4 开头的容器签名选项。

    [all:vars]
    .
    .
    .
    
    automationhub_create_default_container_signing_service = True
    automationhub_container_signing_service_key = /absolute/path/to/key/to/sign
    automationhub_container_signing_service_script = /absolute/path/to/script/that/signs
    Copy to Clipboard Toggle word wrap
  3. 安装完成后,进入您的自动化中心。
  4. 在导航面板中,选择 Signature Keys
  5. 确保有一个名为 container-defaultcontainer-anyname 的密钥。
注意

container-default 服务由 Ansible Automation Platform 安装程序创建的。

3.6.2. 在自动化中心远程添加容器

您可以使用以下两种方式之一将容器远程添加到自动化中心:

  • 创建远程
  • 执行环境

流程

  1. 登录到自动化中心。
  2. 在导航面板中,选择 Execution Environments Remote Registries
  3. Add remote registry

    • Name 字段中输入容器所在的 registry 的名称。
    • URL 字段中输入容器所在的 registry 的 URL。
    • 如果需要,在 Username 字段中输入用户名。
    • Password 字段中,根据需要输入密码。
    • 点击 Save

3.6.3. 添加执行环境

自动化执行环境是容器镜像,可以纳入系统级别的依赖项和基于集合的内容。每个执行环境都允许您有一个自定义镜像来运行作业,每个镜像只包含运行作业时所需的内容。

流程

  1. 在导航面板中,选择 Execution Environments Execution Environments
  2. Add execution environment
  3. 输入执行环境的名称。
  4. 可选:输入上游名称。
  5. Registry 下,从下拉菜单中选择 registry 的名称。
  6. Add tag(s) to include 字段中输入标签。如果字段为空,则将传递所有标签。您必须指定要传递的存储库特定标签。
  7. 剩余的字段是可选的:

    • 当前包括的标签
    • 添加要排除的标签
    • 当前排除的标签
    • 描述
  8. 点击 Save
  9. 同步镜像。

3.6.4. 从本地环境推送容器镜像

使用以下步骤为本地系统中的镜像签名,并将这些签名的镜像推送到自动化中心 registry。

流程

  1. 在终端中,登录到 Podman 或当前使用的任何容器客户端:

    > podman pull <container-name>
    Copy to Clipboard Toggle word wrap
  2. 拉取镜像后,添加标签(例如: latest、rc、beta 或版本号,如 1.0、2.3 等):

    > podman tag <container-name> <server-address>/<container-name>:<tag name>
    Copy to Clipboard Toggle word wrap
  3. 在进行了更改后为镜像签名,并将其推送到自动化中心 registry:

    > podman push <server-address>/<container-name>:<tag name> --tls-verify=false --sign-by <reference to the gpg key on your local>
    Copy to Clipboard Toggle word wrap

    如果镜像未签名,则只能使用嵌入的任何当前签名推送。另外,您可以使用以下脚本推送镜像而不签名镜像:

    > podman push <server-address>/<container-name>:<tag name> --tls-verify=false
    Copy to Clipboard Toggle word wrap
  4. 推送镜像后,进入您的自动化中心。
  5. 在导航面板中,选择 Execution Environments Execution Environments
  6. 要显示新执行环境,点 Refresh 图标。
  7. 点镜像的名称查看您的推送的镜像。

故障排除

Automation Hub 中的详情页面指示镜像是否已签名。如果详情页面表示镜像为 Unsigned,您可以按照以下步骤从自动化中心签名镜像:

  1. 点镜像名称导航到详情页面。
  2. More Actions 图标 。有三个选项可用:

    • 在 Controller 中使用
    • 删除
    • 签发
  3. 从下拉菜单中选择 Sign

签名服务为镜像签名。在镜像签名后,状态将变为"签名"。

3.6.5. 带有签名镜像的策略

podman 或其他镜像客户端可以使用策略来确保镜像的有效性,方法是将特定策略分配给该签名。

3.6.6. 使用 podman 确保镜像由特定的签名签名

当确保签名由特定的签名进行签名时,签名必须位于您的本地。

流程

  1. 在导航面板中,选择 Signature Keys
  2. 点您使用的签名旁边的 More Actions 图标
  3. 从下拉菜单中选择 Download key。此时会打开一个新窗口。
  4. Name 字段中输入密钥的名称。
  5. 点击 Save

3.6.7. 配置客户端以验证签名

为确保从远程 registry 拉取的容器镜像被正确签名,您必须首先在策略文件中使用正确的公钥配置镜像。

前提条件

  • 客户端必须配置 sudo 权限才能验证签名。

流程

  1. 打开终端并使用以下命令:

    >  sudo <name of editor> /etc/containers/policy.json
    Copy to Clipboard Toggle word wrap

    显示的文件类似如下:

    {
      "default": [{"type": "reject"}],
      "transports": {
      	"docker": {
        	"quay.io": [{"type": "insecureAcceptAnything"}],
        	"docker.io": [{"type": "insecureAcceptAnything"}],
        	"<server-address>": [
          	{
              	    "type": "signedBy",
              	    "keyType": "GPGKeys",
              	    "keyPath": "/tmp/containersig.txt"
          	}]
      	}
      }
    }
    Copy to Clipboard Toggle word wrap

    此文件显示 quay.iodocker.io 都不执行验证,因为类型是 insecureAcceptAnything,它会覆盖默认的 reject 类型。但是 <server-address> 将执行验证,因为参数 type 被设置为 "signedBy"

    注意

    目前唯一支持的 keyType 是 GPG 密钥。

  2. <server-address> 条目下,修改 keyPath <1> 使其包含您的密钥文件的名称。

    {
        	"default": [{"type": "reject"}],
        	"transports": {
            	"docker": {
              	  "quay.io": [{"type": "insecureAcceptAnything"}],
              	  "docker.io": [{"type": "insecureAcceptAnything"}],
              	  "<server-address>": [{
                    	"type": "signedBy",
                    	"keyType": "GPGKeys",
                    	"keyPath": "/tmp/<key file name>",
                    	"signedIdentity": {
                      	  "type": "matchExact"
                        }
                	  }]
                }
        	}
    }
    Copy to Clipboard Toggle word wrap
  3. 保存并关闭该文件。

验证

  • 使用 Podman 或您选择的客户端拉取文件:
> podman pull <server-address>/<container-name>:<tag name> --tls-verify=false
Copy to Clipboard Toggle word wrap

此响应验证镜像是否已签名,且无错误。如果镜像没有签名,命令会失败。

其他资源

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat