3.6. 使用签名的容器
自动化执行环境是 Ansible Automation Platform 用来运行作业的容器镜像。您可以将此内容下载到私有自动化中心,并在您的机构内发布它。
3.6.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
查看 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
-
安装完成后,登录 Ansible Automation Platform 并导航到
。 - 确保有一个名为 container-default 或 container-anyname 的密钥。
container-default
服务由 Ansible Automation Platform 安装程序创建的。
3.6.2. 在自动化中心远程添加容器
您可以使用以下两种方式之一将容器远程添加到自动化中心:
- 通过创建远程
- 使用自动化执行环境
流程
- 登录到 Ansible Automation Platform。
-
在导航面板中,选择
。 单击
。- 在 Name 字段中输入容器所在的 registry 的名称。
- 在 URL 字段中输入容器所在的 registry 的 URL。
- 如果需要,在 Username 字段中输入用户名。
- 在 Password 字段中,根据需要输入密码。
- 单击 。
3.6.3. 添加和签名执行环境
自动化执行环境是容器镜像,可以纳入系统级别的依赖项和基于集合的内容。每个执行环境都允许您有一个自定义镜像来运行作业,每个镜像只包含运行作业时所需的内容。
流程
-
在导航面板中,选择
。 点
,然后在出现的字段中输入相关信息。- Name 字段显示本地 registry 上执行环境的名称。
- Upstream name 字段是远程服务器上的镜像名称。
- 在 Registry 下,从下拉菜单中选择 registry 的名称。
- 可选:在 Add tag (s) to include 字段中输入标签。如果字段为空,则将传递所有标签。您必须指定要传递哪些特定于存储库的标签。
- 可选:在 Add tag (s) to exclude 字段中输入要排除的标签。
- 单击 。您应该会在出现的列表中看到您的新执行环境。
同步并签署您的新自动化执行环境。
- 点 HEKETI 并选择 Sync execution environment。 图标
- 点 HEKETI 并选择 Sign execution environment。 图标
- 单击您的新执行环境。在 Details 页面中,找到 Signed 标签,以确定您的执行环境是否已签名。
3.6.4. 从本地环境推送容器镜像
使用以下步骤为本地系统中的自动化执行环境签名,并将签名的执行环境推送到自动化中心 registry。
流程
在终端中,登录到 Podman 或当前使用的任何容器客户端:
> podman pull <container-name>
拉取执行环境后,添加标签(例如: latest、rc、beta 或版本号,如 1.0; 2.3 等):
> podman tag <container-name> <server-address>/<container-name>:<tag name>
进行更改后签署执行环境,并将其推送到自动化中心 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
-
推送执行环境后,进入
。 - 要显示新执行环境,点 Refresh 图标。
- 点镜像的名称查看您推送的镜像。
故障排除
每个执行环境的详细信息页面指示是否已签名。如果详情页面显示镜像为 Unsigned,您可以使用以下步骤从自动化中心签名执行环境:
- 单击执行环境名称,以导航到详细信息页面。
点 ⋮。有三个选项可用:
图标- 签名执行环境
- 在 Controller 中使用
- 删除执行环境
- 从下拉菜单中选择 Sign execution environment。
签名服务为执行环境签名。在对执行环境进行签名后,状态会更改为"signed"。
3.6.5. 带有签名镜像的策略
podman 或其他镜像客户端可以使用策略来确保镜像的有效性,方法是将特定策略分配给该签名。
3.6.6. 使用 podman 确保镜像由特定的签名签名
要确保执行环境由特定签名签名,签名必须首先位于您的本地环境中。
流程
-
在导航面板中,选择
。 - 点您使用的签名旁的 图标。此时应打开一个新窗口,以表示您已下载了该密钥。
3.6.7. 配置客户端以验证签名
要确保从远程 registry 中拉取的执行环境被正确签名,您必须首先在策略文件中使用正确的公钥配置执行环境。
先决条件
- 客户端必须配置 sudo 权限才能验证签名。
流程
打开终端并使用以下命令:
> 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.io
或docker.io
都不执行验证,因为类型是insecureAcceptAnything
,它会覆盖默认的reject
类型。但是<server-address>
将执行验证,因为参数type
被设置为"signedBy"
。注意目前唯一支持的
keyType
是 GPG 密钥。在
<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" } }] } } }
- 保存并关闭该文件。
验证
- 使用 Podman 或您选择的客户端拉取文件:
> podman pull <server-address>/<container-name>:<tag name> --tls-verify=false
此响应验证执行环境是否已签名且没有错误。如果执行环境没有签名,命令会失败。
其他资源
- 如需有关 policy.json 的更多信息,请参阅 containers-policy.json 文档。