3.6. 使用签名的容器


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

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
  2. 查看 Ansible Automation Platform 安装程序清单文件,以了解以 automationhub swig 开头的容器签名选项。

    [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
  3. 安装完成后,登录 Ansible Automation Platform 并导航到 Automation Content Signature Keys
  4. 确保有一个名为 container-defaultcontainer-anyname 的密钥。
注意

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

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

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

  • 通过创建远程
  • 使用自动化执行环境

流程

  1. 登录到 Ansible Automation Platform。
  2. 在导航面板中,选择 Automation Content Remote Registries
  3. 单击 Create remote registry

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

3.6.3. 添加和签名执行环境

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

流程

  1. 在导航面板中,选择 Automation Content Execution Environments
  2. Create execution environment,然后在出现的字段中输入相关信息。

    1. Name 字段显示本地 registry 上执行环境的名称。
    2. Upstream name 字段是远程服务器上的镜像名称。
    3. Registry 下,从下拉菜单中选择 registry 的名称。
    4. 可选:在 Add tag (s) to include 字段中输入标签。如果字段为空,则将传递所有标签。您必须指定要传递哪些特定于存储库的标签。
    5. 可选:在 Add tag (s) to exclude 字段中输入要排除的标签。
  3. 单击 Create execution environment。您应该会在出现的列表中看到您的新执行环境。
  4. 同步并签署您的新自动化执行环境。

    1. More Actions 图标 HEKETI 并选择 Sync execution environment
    2. More Actions 图标 HEKETI 并选择 Sign execution environment
  5. 单击您的新执行环境。在 Details 页面中,找到 Signed 标签,以确定您的执行环境是否已签名。

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

使用以下步骤为本地系统中的自动化执行环境签名,并将签名的执行环境推送到自动化中心 registry。

流程

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

    > podman pull <container-name>
  2. 拉取执行环境后,添加标签(例如: latest、rc、beta 或版本号,如 1.0; 2.3 等):

    > podman tag <container-name> <server-address>/<container-name>:<tag name>
  3. 进行更改后签署执行环境,并将其推送到自动化中心 registry:

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

    如果执行环境没有签名,则只能使用嵌入的任何当前签名推送。另外,您可以使用以下脚本在不签名的情况下推送执行环境:

    > podman push <server-address>/<container-name>:<tag name> --tls-verify=false
  4. 推送执行环境后,进入 Automation Content Execution Environments
  5. 要显示新执行环境,点 Refresh 图标。
  6. 点镜像的名称查看您推送的镜像。

故障排除

每个执行环境的详细信息页面指示是否已签名。如果详情页面显示镜像为 Unsigned,您可以使用以下步骤从自动化中心签名执行环境:

  1. 单击执行环境名称,以导航到详细信息页面。
  2. More Actions 图标 。有三个选项可用:

    • 签名执行环境
    • 在 Controller 中使用
    • 删除执行环境
  3. 从下拉菜单中选择 Sign execution environment

签名服务为执行环境签名。在对执行环境进行签名后,状态会更改为"signed"。

3.6.5. 带有签名镜像的策略

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

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

要确保执行环境由特定签名签名,签名必须首先位于您的本地环境中。

流程

  1. 在导航面板中,选择 Automation Content Signature Keys
  2. 点您使用的签名旁的 Download key 图标。此时应打开一个新窗口,以表示您已下载了该密钥。

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

要确保从远程 registry 中拉取的执行环境被正确签名,您必须首先在策略文件中使用正确的公钥配置执行环境。

先决条件

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

流程

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

    >  sudo <name of editor> /etc/containers/policy.json

    显示的文件类似如下:

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

    此文件显示 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"
                        }
                	  }]
                }
        	}
    }
  3. 保存并关闭该文件。

验证

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

此响应验证执行环境是否已签名且没有错误。如果执行环境没有签名,命令会失败。

其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.