Red Hat Training

A Red Hat training course is available for RHEL 8

8.7. 秘密鍵と Rekor を使用した sigstore 署名によるコンテナーイメージの署名

Podman バージョン 4.4 以降、Rekor サーバーとともにコンテナー署名の sigstore 形式を使用できるようになりました。パブリック署名をパブリック rekor.sigstore.dev サーバーにアップロードすることもでき、これにより Cosign との相互運用性が向上します。その後、rekor を明示的に無効にしなくても、cosign verify コマンドを使用して署名を検証できます。

前提条件

  • container-tools モジュールがインストールされている。

手順

  1. sigstore 公開鍵/秘密鍵ペアを生成します。

    $ skopeo generate-sigstore-key --output-prefix myKey
    • 公開鍵と秘密鍵 myKey.pubmyKey.private が生成されます。
  2. 次の内容を /etc/containers/registries.conf.d/default.yaml ファイルに追加します。

    docker:
        <registry>:
            use-sigstore-attachments: true
    • use-sigstore-attachments オプションを設定することで、Podman と Skopeo はコンテナーの sigstore 署名をイメージと共に読み書きし、署名されたイメージと同じリポジトリーに保存できます。

      注記

      /etc/containers/registries.d ディレクトリー内の任意の YAML ファイルのレジストリーまたはリポジトリー設定セクションを編集できます。単一のスコープ (default-docker、レジストリー、または名前空間) は、/etc/containers/registries.d ディレクトリー内の 1 つのファイルにのみ存在できます。/etc/containers/registries.d/default.yaml ファイルでシステム全体のレジストリー設定を編集することもできます。すべての YAML ファイルが読み取られ、ファイル名は任意であることに注意してください。

  3. 現在のディレクトリーで Containerfile を使用してコンテナーイメージをビルドします。

    $ podman build -t <registry>/<namespace>/<image>
  4. file.yml ファイルを作成します。

    privateKeyFile: "/home/user/sigstore/myKey.private"
    privateKeyPassphraseFile: "/mnt/user/sigstore-myKey-passphrase"
    rekorURL: "https://<your-rekor-server>"
    • file.yml は、sigstore 署名の作成に必要なオプションを保存するために使用される sigstore 署名パラメーター YAML ファイルです。
  5. イメージに署名し、レジストリーにプッシュします。

    $ podman push --sign-by-sigstore=file.yml <registry>/<namespace>/<image>
    • あるいは、同様の --sign-by-sigstore オプションを指定して skopeo copy コマンドを使用して、既存のイメージをコンテナーレジストリー間で移動しながら署名することもできます。
警告

パブリックサーバーへの送信には、公開鍵に関するデータと署名に関するメタデータが含まれることに注意してください。

検証

  • 次のいずれかの方法を使用して、コンテナーイメージが正しく署名されていることを確認します。

    • cosign verify コマンドを使用します。

      $ cosign verify <registry>/<namespace>/<image> --key myKey.pub
  • podman pull コマンドを使用します。

    • /etc/containers/policy.json ファイルに rekorPublicKeyPath フィールドまたは rekorPublicKeyData フィールドを追加します。

      {
        ...
        "transports": {
      	"docker": {
              "<registry>/<namespace>": [
                  {
                      "type": "sigstoreSigned",
                      "rekorPublicKeyPath": "/path/to/local/public/key/file",
                  }
              ]
      	...
      	}
        }
        ...
      }
    • イメージをプルします:

      $ podman pull <registry>/<namespace>/<image>
      • podman pull コマンドは、設定どおりに署名の存在を強制します。追加のオプションは必要ありません。

関連情報