IBM Cloud Docs
在 Container Registry 中加密图像以实现内容机密性

在 Container Registry 中加密图像以实现内容机密性

您可以保护 IBM Cloud® Container Registry 映像的机密性,并确保不可信的主机无法运行这些映像。

创建加密映像,以便没有 专用密钥一种算法模式,用于对消息进行加密,加密后的消息只能使用对应的公用密钥进行解密。 专用密钥还用于解密由对应的公用密钥加密的消息。 专用密钥保存在用户系统上,并通过密码进行保护。 的人员无法访问内容。 通过使用 RSA 公用-专用密钥对来加密和解密已加密的映像。 公用密钥不是私钥,任何人都可以使用它来加密映像。 专用密钥是私钥,只有具有该专用密钥的用户才能使用该私钥对映像进行解密。

在 IBM Cloud Container Registry 中支持加密,并符合以下标准:

有关加密映像的更多信息,请参阅 加密容器映像以实现静态容器映像安全性通过容器映像加密提高映像安全性和合规性

准备工作

创建公用-专用密钥对

使用 OpenSSL 命令创建公用-专用密钥对。

  1. 创建工作目录 (例如,USER_KEYS),在其中存储密钥并切换到该目录:

    mkdir USER_KEYS; cd USER_KEYS
    
  2. 使用 OpenSSL 来创建专用密钥,其中 USER_KEY 是密钥身份的名称:

    openssl genrsa --out USER_KEYPrivate.pem
    
  3. 创建公用密钥:

    openssl rsa -in USER_KEYPrivate.pem -pubout -out USER_KEYPub.pem
    

    要在生产中使用专用密钥,必须在适当的商店中安全地存储和保护专用密钥。 您可能还希望以相同方式管理公用密钥。 更多信息,请参阅 存储密钥

  4. 列出密钥以确保创建这些密钥:

    ls -l
    
  5. 要使用此密钥对来加密映像,请通过运行以下 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 映像的指令。构建容器映像。

  1. 转至存储应用程序的目录,例如 MY_APP

    cd MY_APP
    
  2. 运行以下命令创建 Dockerfile:

    cat << EOF >> Dockerfile
    FROM nginx:latest
    RUN echo "some secret" > /secret-file
    EOF
    
  3. 使用 Buildah 通过运行以下命令来创建未加密的映像,其中 NAMESPACE 是您的名称空间:

    buildah bud -t us.icr.io/NAMESPACE/MY_APP .
    

    us.icr.io/NAMESPACE/MY_APP 已落实到本地映像存储。

  4. 通过使用公用密钥对映像进行加密,并通过运行以下命令并通过指定 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> 选项,请在请求时输入注册表凭证的密码。

    您会收到一个响应,通知您清单已写入映像目标 (即注册表)。

  5. 检入注册表以确保映像存在。

拉取并解密映像

从注册表中提取映像,并使用专用密钥对其进行解密。

  1. 要确保您正在从注册表中拉取并且不使用本地高速缓存,请在本地除去该映像:

    buildah rmi -f us.icr.io/NAMESPACE/MY_APP
    
  2. (可选) 您可以尝试在不提供解密密钥的情况下拉取映像,以确认无法解密该映像:

    buildah pull us.icr.io/NAMESPACE/MY_APP
    

    输出结果包含与以下信息类似的信息:

    ...<truncated>...
    Error decrypting layer sha256:ab4ea03582e08a8e8fc35b778cc6f1a1fa797469fa9cc61cee85f703b316bb12: missing private key needed for decryption
    ERRO exit status 125
    
  3. 使用 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
    

    将从注册表检索加密映像,对其进行解密并将其存储在本地映像存储中。

  4. 通过运行 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® 集群中运行加密映像。