在 Container Registry 中加密图像以实现内容机密性
您可以保护 IBM Cloud® Container Registry 映像的机密性,并确保不可信的主机无法运行这些映像。
创建加密映像,以便没有 专用密钥一种算法模式,用于对消息进行加密,加密后的消息只能使用对应的公用密钥进行解密。 专用密钥还用于解密由对应的公用密钥加密的消息。 专用密钥保存在用户系统上,并通过密码进行保护。 的人员无法访问内容。 通过使用 RSA 公用-专用密钥对来加密和解密已加密的映像。 公用密钥不是私钥,任何人都可以使用它来加密映像。 专用密钥是私钥,只有具有该专用密钥的用户才能使用该私钥对映像进行解密。
在 IBM Cloud Container Registry 中支持加密,并符合以下标准:
有关加密映像的更多信息,请参阅 加密容器映像以实现静态容器映像安全性 和 通过容器映像加密提高映像安全性和合规性。
准备工作
- 完成 IBM Cloud Container Registry 入门中的指示信息。
- 确保您拥有 IBM Cloud CLI 的最新版本
container-registry
CLI 插件,请参阅 更新container-registry
CLI 插件。 - 确保您具有要将加密映像推送到的专用名称空间,请参阅 设置名称空间。
- 安装 Buildah V 1.15或更高版本,以便您可以构建加密映像。 Buildah 仅在 Linux® 环境中工作。 作为 Linux®的替代方法,您可以使用虚拟机或 Docker 映像来运行 Buildah 以构建映像。
- 安装 Podman。
创建公用-专用密钥对
使用 OpenSSL 命令创建公用-专用密钥对。
-
创建工作目录 (例如,
USER_KEYS
),在其中存储密钥并切换到该目录:mkdir USER_KEYS; cd USER_KEYS
-
使用 OpenSSL 来创建专用密钥,其中
USER_KEY
是密钥身份的名称:openssl genrsa --out USER_KEYPrivate.pem
-
创建公用密钥:
openssl rsa -in USER_KEYPrivate.pem -pubout -out USER_KEYPub.pem
要在生产中使用专用密钥,必须在适当的商店中安全地存储和保护专用密钥。 您可能还希望以相同方式管理公用密钥。 更多信息,请参阅 存储密钥。
-
列出密钥以确保创建这些密钥:
ls -l
-
要使用此密钥对来加密映像,请通过运行以下
cat
命令来显示公用密钥:cat USER_KEYPub.pem
您会得到类似下面输出的响应:
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv8Ny7dCWQ8Pdq1ddYSwk QOCB3lUEZVEyj9StX3jnISF/rxIsUZzJfbOrQN0fGkm+1sCCtltgQdztTjito8Fh DGflqQBSmV40XP3iZnNUJDrHuAol463Z/BuxxFXL3ry6rTosLGfrRwdQjxp8RSsn WyIIO2rmcqXZYe4SCtiMjMejLlTIDWLIMdYL3d6hA4DpgDLoh6EPmhKMVVwRt5b0 ew5eMLcDuq6ButOM5yv4zYVHNrajY41NK+abSlFb6wzMg2AUDiC/MxV1LRq6mpyZ GJllx3LS1M1j7fDO3pmh/M0X7yD/4RgHwFaW4/4CQBw3fyxrOv0pZzZay+o -----END PUBLIC KEY-----
加密映像
使用公用密钥对映像进行加密,然后使用 Dockerfile一种文本文件,包含用于构建 Docker 映像的指令。构建容器映像。
-
转至存储应用程序的目录,例如
MY_APP
。cd MY_APP
-
运行以下命令创建 Dockerfile:
cat << EOF >> Dockerfile FROM nginx:latest RUN echo "some secret" > /secret-file EOF
-
使用 Buildah 通过运行以下命令来创建未加密的映像,其中
NAMESPACE
是您的名称空间:buildah bud -t us.icr.io/NAMESPACE/MY_APP .
us.icr.io/NAMESPACE/MY_APP
已落实到本地映像存储。 -
通过使用公用密钥对映像进行加密,并通过运行以下命令并通过指定 JSON Web 加密 (
jwe
) 协议将映像上载到注册表来对映像进行加密,其中USER_KEYS/USER_KEYPub.pem
是加密密钥。buildah push --encryption-key jwe:..USER_KEYS/USER_KEYPub.pem us.icr.io/NAMESPACE/MY_APP
Buildah V 1.15或更高版本使用 Docker的登录凭证进行认证。 如果这些凭证不起作用,或者您想要使用 API 密钥用于验证和授权API请求的唯一代码。 代码被传递给应用程序接口(API),用于识别调用应用程序或用户,并跟踪和控制API的使用情况。,那么可以提供
—-creds <username>
选项,其中<username>
是用户名。 如果使用—-creds <username>
选项,请在请求时输入注册表凭证的密码。您会收到一个响应,通知您清单已写入映像目标 (即注册表)。
-
检入注册表以确保映像存在。
拉取并解密映像
从注册表中提取映像,并使用专用密钥对其进行解密。
-
要确保您正在从注册表中拉取并且不使用本地高速缓存,请在本地除去该映像:
buildah rmi -f us.icr.io/NAMESPACE/MY_APP
-
(可选) 您可以尝试在不提供解密密钥的情况下拉取映像,以确认无法解密该映像:
buildah pull us.icr.io/NAMESPACE/MY_APP
输出结果包含与以下信息类似的信息:
...<truncated>... Error decrypting layer sha256:ab4ea03582e08a8e8fc35b778cc6f1a1fa797469fa9cc61cee85f703b316bb12: missing private key needed for decryption ERRO exit status 125
-
使用 Buildah 来拉取具有解密密钥的映像,其中
USER_KEYS/USER_KEYPrivate.pem
是解密密钥,us.icr.io/NAMESPACE/MY_APP
是注册表:buildah pull --decryption-key ../USER_KEYS/USER_KEYPrivate.pem us.icr.io/NAMESPACE/MY_APP
将从注册表检索加密映像,对其进行解密并将其存储在本地映像存储中。
-
通过运行 Podman来确认映像是否已存储:
podman run -it us.icr.io/NAMESPACE/MY_APP /bin/bash
存储密钥
要在生产中使用专用密钥,必须安全地存储和保护专用密钥。 您可能还希望以相同的方式管理公用密钥,以控制谁可以构建映像。 您可以使用 IBM Key Protect 来存储和保护密钥。
IBM Key Protect 存储对称密钥,而不是用于映像加密的非对称 PKI 密钥。 您可以使用仪表板,CLI 或 API 将密钥单独添加为两个 IBM Key Protect 标准密钥。IBM Key Protect 要求仅导入 Base64 数据。 要获取纯 Base64 数据,您可以通过在装入 Base64 内容之前运行 "openssl enc -base64 -A -in USER_KEYPrivate.pem -out USER_KEYPrivate.b64"
来对 PEM 文件进行编码,然后通过运行 "openssl enc -base64 -A -d -in USER_KEYPrivate..b64 -out USER_KEYPrivate.pem"
来撤销此操作以再次获取可用密钥。
有关如何使用 IBM Key Protect 来存储和保护密钥的更多信息,请参阅 将加密密钥引入云 和 导入您自己的密钥。
作为替代方法,您可以使用 IBM Key Protect 根密钥来保护自己商店中的密钥。 此操作意味着必须使用 IBM Key Protect 和有效的根密钥再次将其解包。
例如,要使用 CLI 来打包密钥,请运行命令 "ibmcloud kp key wrap ROOT_KEY_ID -p <base64 encoded image key>"
,要解包密钥,请运行命令 "ibmcloud kp key unwrap ROOT_KEY_ID -p <base64 cyphertext>
,其中 ROOT_KEY_ID
是您正在使用的根密钥的标识。
有关如何使用 IBM Key Protect 根密钥对自己的商店中的密钥进行保护的更多信息,请参阅 包装密钥。
Vulnerability Advisor不会扫描已加密的映像。
后续步骤
使用 Image Key Synchronizer 集群附加组件 在 Red Hat® OpenShift® on IBM Cloud® 集群中运行加密映像。