跳到主要内容

管理容器注册表镜像信任策略

概述

podman 镜像信任 set|show [选项] 注册表[/存储库]

描述

管理基于其位置的作为容器镜像来源的信任注册表。(此选项不适用于远程 Podman 客户端,包括 Mac 和 Windows(排除 WSL2)机器)

位置由镜像的传输方式和注册表主机决定。以这个容器镜像 docker://docker.io/library/busybox 为例,docker 是传输方式,docker.io 是注册表主机。

信任在 /etc/containers/policy.json 中定义,并在用户尝试从注册表拉取远程镜像时强制执行。policy.json 中的信任策略描述了信任的作用域(注册表和/或存储库)。这种信任可以使用签名镜像的公钥。

信任的作用域从最具体到最不具体进行评估。换句话说,策略可以是:

  • 定义为整个注册表。
  • 定义为该注册表中的特定存储库。
  • 定义为注册表内的特定签名镜像。

以下是从最具体到最不具体的 policy.json 中使用的有效作用域值的示例:

docker.io/library/busybox:notlatest

docker.io/library/busybox

docker.io/library

docker.io

如果未找到这些作用域中的任何配置,则使用默认值(通过使用“default”而不是 REGISTRY[/REPOSITORY] 指定)。

类型 信任提供了一种方式来:

允许列表(“accept”)或 拒绝列表(“reject”)注册表或 要求简单的签名签名(“signedBy”), 要求 sigstore 签名(“sigstoreSigned”)。

可以使用 podman 镜像信任 set 命令更新现有信任作用域的信任。

选项

--help, -h

打印使用说明。

set 选项

(此处应列出与 set 命令相关的选项,但原文中并未提供,因此无法翻译。通常这些选项会包括如何设置信任策略的具体参数,例如指定作用域、信任类型等。)

--pubkeysfile, -f=KEY1

本地系统上导出的公钥的路径。这些密钥路径在 policy.json 中被引用。任何文件路径都可以使用,但建议将文件放在 /etc/pki/containers 中。这个选项可以多次使用,以要求镜像由多个密钥签名。--pubkeysfile 选项对于 signedBysigstoreSigned 类型是必需的。

--type, -t=value

此策略条目的信任类型。 接受的值: signedBy(默认):要求具有相应公钥列表的简单签名签名 sigstoreSigned:要求具有相应公钥列表的 sigstore 签名 accept:不需要此注册表作用域的任何签名 reject:不接受此注册表作用域的镜像

show 选项

--json, -j

以 JSON 格式输出信任信息,以便机器解析

--noheading

(此处应提供 --noheading 选项的描述,但原文中并未提供。通常这个选项用于控制输出是否包含标题或头部信息。)

--raw

以原始 JSON 格式输出信任策略文件

示例

接受来自注册表的所有无签名镜像:

sudo podman image trust set --type accept docker.io

修改默认信任策略:

sudo podman image trust set -t reject default

显示系统信任策略:podman image trust show

该命令用于显示当前系统的镜像信任策略。这个命令会输出当前配置的信任策略,包括接受、拒绝、签名等规则,以及与之关联的公钥文件等信息。这些信息可以帮助用户了解当前系统的镜像信任状态,以及镜像在拉取和运行时需要满足的安全要求。

当你运行 podman image trust show 命令时,它会读取并显示 /etc/containers/policy.json 文件的内容,这个文件包含了 Podman 的镜像信任策略设置。

输出的内容通常包括以下几个部分:

  1. default:这是默认的信任策略,如果没有其他特定的策略匹配,就会使用这个策略。它可能设置为接受、拒绝、需要签名等。

  2. type:这是信任的类型,比如 signedBy 表示需要由指定的公钥签名的镜像,accept 表示接受所有镜像,reject 表示拒绝所有镜像。

  3. keys:这是与信任策略关联的公钥列表。对于 signedBy 类型的策略,这里会列出所有用于验证镜像签名的公钥文件的路径。

  4. registries:这是针对不同注册表的特定信任策略。你可以为特定的注册表(比如 docker.io 或私有的容器镜像仓库)设置不同的信任策略。

运行 podman image trust show 时,你可能需要 root 权限或使用 sudo,因为读取 /etc/containers/policy.json 文件通常需要较高的权限。

例如,一个典型的输出可能看起来像这样:

{
"default": [
{
"type": "reject"
}
],
"registries": [
{
"docker.io": {
"type": "signedBy",
"keys": [
"/etc/containers/registries.d/my-registry.key"
]
}
},
{
"localhost:5000": {
"type": "accept"
}
}
]
}

在这个例子中,默认的信任策略是拒绝所有镜像。但是,对于 docker.io 上的镜像,它要求由 /etc/containers/registries.d/my-registry.key 指定的公钥签名的镜像才能被接受。而对于 localhost:5000 上的镜像,它接受所有镜像,不要求签名。

如果你想要以更友好的格式查看输出,你可以使用 jq 这样的 JSON 处理工具来格式化输出,例如:

podman image trust show | jq .

这将以更易读的格式显示 JSON 数据。如果你没有安装 jq,你可以使用其他 JSON 处理工具或手动解析输出。

传输方式        名称                         类型        ID                   存储位置
all 默认 拒绝
存储库 docker.io/library 接受
存储库 registry.access.redhat.com 已签名 security@redhat.com https://access.redhat.com/webassets/docker/content/sigstore
存储库 registry.redhat.io 已签名 security@redhat.com https://registry.redhat.io/containers/sigstore
存储库 docker.io 拒绝
docker-daemon 接受

这个输出列出了不同类型的镜像信任策略:

  • TRANSPORT 列表示策略适用的传输方式(例如 all 表示适用于所有传输方式,repository 表示适用于特定存储库,docker-daemon 表示适用于 Docker 守护进程)。
  • NAME 列表示策略适用的名称,例如存储库的域名(docker.io/libraryregistry.access.redhat.com 等)。
  • TYPE 列表示信任策略的类型,例如 accept 表示接受该来源的镜像,reject 表示拒绝该来源的镜像,signed 表示只接受已签名的镜像。
  • ID 列提供了与签名策略相关的标识符或电子邮件地址(如果适用)。
  • STORE 列提供了与签名策略相关的存储位置或URL(如果适用)。

在这个例子中,Podman 配置了多种信任策略。例如,对于来自 docker.io/library 的镜像,它接受(accept)这些镜像;而对于来自 docker.io(未指定具体的库)的镜像,它则拒绝(reject)。对于来自 Red Hat 相关的存储库(registry.access.redhat.comregistry.redhat.io),它只接受已签名的镜像。对于通过 Docker 守护进程导入的镜像,它接受这些镜像。这些策略确保了只有可信的镜像才会被 Podman 使用。

显示信任策略文件:

podman image trust show --raw
{
"default": [
{
"type": "reject"
}
],
"transports": {
"docker": {
"docker.io": [
{
"type": "reject"
}
],
"docker.io/library": [
{
"type": "insecureAcceptAnything"
}
],
"registry.access.redhat.com": [
{
"type": "signedBy",
"keyType": "GPGKeys",
"keyPath": "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release"
}
],
"registry.redhat.io": [
{
"type": "signedBy",
"keyType": "GPGKeys",
"keyPath": "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release"
}
]
},
"docker-daemon": {
"": [
{
"type": "insecureAcceptAnything"
}
]
}
}
}

以 JSON 形式显示:

podman image trust show --json
[
{
"transport": "all",
"name": "* (default)",
"repo_name": "default",
"type": "reject"
},
{
"transport": "repository",
"name": "docker.io",
"repo_name": "docker.io",
"type": "reject"
},
{
"transport": "repository",
"name": "docker.io/library",
"repo_name": "docker.io/library",
"type": "accept"
},
{
"transport": "repository",
"name": "registry.access.redhat.com",
"repo_name": "registry.access.redhat.com",
"sigstore": "https://access.redhat.com/webassets/docker/content/sigstore",
"type": "signed",
"gpg_id": "security@redhat.com"
},
{
"transport": "repository",
"name": "registry.redhat.io",
"repo_name": "registry.redhat.io",
"sigstore": "https://registry.redhat.io/containers/sigstore",
"type": "signed",
"gpg_id": "security@redhat.com"
},
{
"transport": "docker-daemon",
"type": "accept"
}
]

另请参阅

containers-policy.json(5) - 这个手册页面详细描述了 containers-policy.json 文件的格式和用途。这个文件是 Podman 和其他容器工具用来定义镜像信任策略的地方。通过查阅这个手册,你可以了解如何配置和修改镜像的信任策略。

历史

January 2019, updated by Tom Sweeney (tsweeney at redhat dot com) December 2018, originally compiled by Qi Wang (qiwan at redhat dot com) - 这部分记录了该文档的历史更新记录,包括更新的时间和贡献者。这些信息有助于用户了解文档的变化和更新情况。

注意事项

  • podman image trust 命令是用于管理 Podman 镜像信任策略的工具。通过设置信任策略,你可以控制哪些镜像可以被接受或拒绝,以及需要满足哪些签名要求。这对于确保从不受信任的源拉取的镜像的安全性至关重要。

  • containers-policy.json 文件是 Podman 信任策略的核心配置文件。它包含了默认的信任策略以及针对特定注册表的特定策略。通过修改这个文件,你可以自定义你的镜像信任策略,以满足你的安全需求。

  • 在配置信任策略时,你需要特别注意公钥的管理和安全性。确保公钥文件的路径正确无误,并且只有受信任的人员能够访问和修改这些文件。此外,定期更新和验证公钥的有效性也是保持系统安全的重要步骤。

  • 当你遇到问题时,可以查看 Podman 的官方文档、社区论坛或相关邮件列表以获取帮助。此外,了解容器镜像的安全性和签名机制也是非常重要的,这有助于你更好地理解信任策略的作用和配置方法。