はじめに
この実験では、docker scout attestation add コマンドを使用して Docker イメージにアテステーション (証明書) を添付する方法を学びます。アテステーションは、イメージの起源、ビルドプロセス、セキュリティスキャン結果などの重要な情報を提供できる貴重なメタデータです。
まず、Docker イメージと簡単なアテステーションファイルを準備します。次に、--file フラグを使用して docker scout attestation add コマンドを実行し、アテステーションをイメージに添付します。また、--predicate-type フラグを使用して、アテステーションの特定の述語タイプ (predicate type) を指定する方法も探ります。最後に、アテステーションがイメージに正常に追加されたことを検証します。
イメージとアテステーションファイルを準備する
このステップでは、Docker イメージとアテステーションファイルを準備します。アテステーションは、イメージの構築方法、脆弱性スキャンの結果、署名情報など、イメージに関する情報を提供するメタデータです。この例では、簡単なテキストファイルをアテステーションファイルとして使用します。
まず、使用する基本的な Docker イメージを取得しましょう。軽量な Linux ディストリビューションである alpine イメージを使用します。
docker pull alpine:latest
イメージが取得され、ダウンロードされていることを示す出力が表示されるはずです。
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
次に、簡単なアテステーションファイルを作成します。このファイルには任意の JSON データが含まれます。実際のシナリオでは、このファイルにはイメージに関する構造化データ、例えばビルド情報、スキャン結果、署名の詳細などが含まれます。
~/project ディレクトリに attestation.json という名前のファイルを作成します。
nano ~/project/attestation.json
nano エディタ内で、以下の JSON 内容を貼り付けます。
{
"predicateType": "https://example.com/attestation/v1",
"data": {
"key": "value",
"another_key": 123
}
}
Ctrl + X を押し、次に Y を押し、最後に Enter を押してファイルを保存します。
cat コマンドを使用してファイルの内容を確認できます。
cat ~/project/attestation.json
出力は、先ほど貼り付けた JSON 内容になるはずです。
これで、Docker イメージ (alpine:latest) とアテステーションファイル (~/project/attestation.json) が両方とも次のステップの準備ができました。
--file を使用してイメージにアテステーションを追加する
このステップでは、前のステップで作成したアテステーションファイルを alpine:latest イメージに追加します。--attestation-file フラグを使用して docker buildx imagetools create コマンドを実行します。このコマンドを使用すると、アテステーションを含む追加のメタデータを持つ新しいイメージマニフェストを作成できます。
アテステーションファイルを追加する基本的な構文は次の通りです。
docker buildx imagetools create <source_image> --attestation-file <attestation_file_path> --tag <new_image_tag>
ここで、<source_image> はアテステーションを追加する対象のイメージ、<attestation_file_path> はアテステーションファイルのパス、<new_image_tag> はアテステーションを含む新しいイメージマニフェストのタグです。
~/project/attestation.json ファイルを alpine:latest イメージに追加し、新しいイメージに alpine:attested というタグを付けましょう。
docker buildx imagetools create alpine:latest --attestation-file ~/project/attestation.json --tag alpine:attested
新しいイメージマニフェストが作成され、プッシュされていることを示す出力が表示されるはずです。
...
unpacking to docker.io/library/alpine:attested done
このコマンドは、~/project/attestation.json のアテステーションデータを含む alpine:attested タグの新しいイメージマニフェストを作成します。元の alpine:latest イメージは変更されません。
これで、新しく作成された alpine:attested イメージを確認するために、Docker イメージを一覧表示できます。
docker images
一覧には alpine:latest と alpine:attested の両方が表示されるはずです。
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine attested <image_id> ... ...
alpine latest <image_id> ... ...
...
imagetools create は多くの場合、基になるイメージレイヤーを再利用し、新しいマニフェストのみを作成するため、両方のイメージの IMAGE ID は同じになることに注意してください。
--predicate-type を使用して特定の述語タイプでアテステーションを追加する
前のステップでは、--attestation-file フラグを使用してアテステーションを追加しました。Docker は JSON ファイル内の predicateType フィールドから述語タイプを自動的に推測します。ただし、--predicate-type フラグを使用して述語タイプを明示的に指定することもできます。これは、アテステーションデータに predicateType フィールドが含まれていない場合、またはファイル内の述語タイプを上書きしたい場合に便利です。
特定の述語タイプでアテステーションを追加する基本的な構文は次の通りです。
docker buildx imagetools create <source_image> --attestation-file <attestation_file_path> --predicate-type <predicate_type_url> --tag <new_image_tag>
ここで、<predicate_type_url> はアテステーションのタイプを表す URL です。
同じ ~/project/attestation.json ファイルを再度 alpine:latest イメージに追加しましょう。ただし、今回は述語タイプを明示的に https://example.com/another-attestation/v2 に設定し、新しいイメージに alpine:attested-v2 というタグを付けます。
docker buildx imagetools create alpine:latest --attestation-file ~/project/attestation.json --predicate-type https://example.com/another-attestation/v2 --tag alpine:attested-v2
前のステップと同様の出力が表示され、新しいイメージマニフェストが作成されていることが示されるはずです。
...
unpacking to docker.io/library/alpine:attested-v2 done
このコマンドは、alpine:attested-v2 タグの新しいイメージマニフェストを作成します。attestation.json ファイルには "predicateType": "https://example.com/attestation/v1" が含まれていますが、--predicate-type フラグによってこれが上書きされ、新しいマニフェスト内のアテステーションの述語タイプは https://example.com/another-attestation/v2 になります。
新しいタグを確認するために、再度イメージを一覧表示しましょう。
docker images
これで、alpine:latest、alpine:attested、および alpine:attested-v2 が表示されるはずです。
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine attested-v2 <image_id> ... ...
alpine attested <image_id> ... ...
alpine latest <image_id> ... ...
...
次のステップでは、アテステーションが正しく追加されていることを検証し、その内容を調べます。
追加されたアテステーションを検証する
この最後のステップでは、アテステーションがイメージに正常に追加されたことを検証し、その内容を調べます。docker buildx imagetools inspect コマンドを使用して、関連するアテステーションに関する情報を含むイメージのマニフェストを表示できます。
イメージマニフェストを調べる基本的な構文は次の通りです。
docker buildx imagetools inspect <image_tag>
まず、--attestation-file フラグを使用して作成した alpine:attested イメージを調べましょう。
docker buildx imagetools inspect alpine:attested
イメージマニフェストに関する詳細な出力が表示されるはずです。「attestations」に関連するセクションを探してください。述語タイプが https://example.com/attestation/v1 で、attestation.json ファイルのデータが含まれるエントリが見つかるはずです。
...
"attestations": [
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"payload": "...",
"predicateType": "https://example.com/attestation/v1"
}
],
...
次に、--predicate-type フラグを使用して述語タイプを上書きして作成した alpine:attested-v2 イメージを調べましょう。
docker buildx imagetools inspect alpine:attested-v2
再び、「attestations」セクションを探してください。今回は、アテステーションデータの内容は前と同じでも、述語タイプが https://example.com/another-attestation/v2 のエントリが表示されるはずです。
...
"attestations": [
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"payload": "...",
"predicateType": "https://example.com/another-attestation/v2"
}
],
...
これにより、Docker イメージにアテステーションを正常に追加できたこと、および --predicate-type フラグを使用して述語タイプを明示的に設定できることが確認されます。
これで、イメージとアテステーションファイルを準備し、--attestation-file および --predicate-type フラグを使用してイメージにアテステーションを追加し、docker buildx imagetools inspect を使用して追加されたアテステーションを検証する方法を学びました。
まとめ
この実験 (Lab) では、docker scout attestation add コマンドを使用して Docker イメージにアテステーションを添付する方法を学びました。まず、Docker イメージ (alpine:latest) を準備し、簡単な JSON アテステーションファイルを作成しました。次に、--file フラグを使用して docker scout attestation add コマンドを実行し、アテステーションファイルをイメージに添付しました。また、--predicate-type フラグを使用してアテステーションにカスタムの述語タイプ (predicate type) を指定する方法も調べました。最後に、アテステーションがイメージに正常に追加されたことを検証しました。



