第8章 コンテナーイメージへの署名

GNU Privacy Guard (GPG) 署名または sigstore 署名を使用して、コンテナーイメージに署名できます。両方の署名手法は、通常、OCI 準拠のコンテナーレジストリーと互換性があります。Podman を使用して、リモートレジストリーにプッシュする前にイメージに署名し、署名されていないイメージが拒否されるようにコンシューマーを設定できます。コンテナーイメージに署名すると、サプライチェーンへの攻撃を防ぐことができます。

GPG キーを使用して署名するには、署名を配布するために別のルックアサイドサーバーをデプロイメントする必要があります。ルックアサイドサーバーは、任意の HTTP サーバーにすることができます。Podman バージョン 4.2 以降では、コンテナー署名の sigstore 形式を使用できます。GPG キーと比較して、sigstore 署名はコンテナーレジストリーに格納されるため、個別のルックアサイドサーバーは必要ありません。

8.1. GPG 署名を使用したコンテナーイメージへの署名

GNU Privacy Guard (GPG) キーを使用してイメージに署名できます。

前提条件

  • container-tools メタパッケージがインストールされている。
  • GPG ツールがインストールされます。
  • ルックアサイド Web サーバーがセットアップされ、その上でファイルを公開できます。

    • システム全体のレジストリー設定は、/etc/containers/registries.d/default.yaml ファイルで確認できます。lookaside-staging オプションは、署名を書き込むためのファイルパスを参照し、通常、署名を発行するホストで設定されます。

      # cat /etc/containers/registries.d/default.yaml
      docker:
          <registry>:
              lookaside: https://registry-lookaside.example.com
              lookaside-staging: file:///var/lib/containers/sigstore
      ...

手順

  1. GPG キーを生成します。

    # gpg --full-gen-key
  2. 公開鍵をエクスポートします。

    # gpg --output <path>/key.gpg --armor --export <username@domain.com>
  3. 現在のディレクトリーで Containerfile を使用してコンテナーイメージをビルドします。

    $ podman build -t <registry>/<namespace>/<image>

    <registry><namespace>、および <image> をコンテナーイメージ識別子に置き換えます。詳細については、コンテナーレジストリー を参照してください。

  4. イメージに署名し、レジストリーにプッシュします。

     $  podman push \
        --sign-by <username@domain.com> \
        <registry>/<namespace>/<image>
    注記

    既存のイメージをコンテナーレジストリー間で移動するときに署名する必要がある場合は、skopeo copy コマンドを使用できます。

  5. オプション: 新しいイメージシグネチャーを表示します。

    # (cd /var/lib/containers/sigstore/; find . -type f)
    ./<image>@sha256=<digest>/signature-1
  6. ローカル署名をルックアサイド Web サーバーにコピーします。

    # rsync -a /var/lib/containers/sigstore <user@registry-lookaside.example.com>:/registry-lookaside/webroot/sigstore

署名は、lookaside-staging オプションによって決定される場所 (この場合は /var/lib/containers/sigstore ディレクトリー) に保存されます。

検証

関連情報