はじめに
この実験では、docker trust sign
コマンドを使用して Docker イメージをセキュアにする方法を学びます。まず、署名されていないイメージを調べ、署名前の特性を理解します。次に、リポジトリ管理者としてイメージタグに署名し、その信憑性を主張し、その後署名を検証する練習を行います。最後に、指定された署名者としてタグに署名して検証するプロセスを探索し、Docker Content Trust の協調的な性質を実証します。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、docker trust sign
コマンドを使用して Docker イメージをセキュアにする方法を学びます。まず、署名されていないイメージを調べ、署名前の特性を理解します。次に、リポジトリ管理者としてイメージタグに署名し、その信憑性を主張し、その後署名を検証する練習を行います。最後に、指定された署名者としてタグに署名して検証するプロセスを探索し、Docker Content Trust の協調的な性質を実証します。
このステップでは、署名されていない Docker イメージを調べる方法を学びます。Docker Content Trust は、Docker イメージの整合性と信憑性を検証する方法を提供します。ただし、すべてのイメージが署名されているわけではありません。署名されていないイメージを調べることで、署名と検証の概念に深入りする前に、イメージに関する基本的な情報を理解することができます。
まず、Docker レジストリから署名されていないイメージを取得する必要があります。デフォルトでは通常署名されていない hello-world
イメージを使用します。
docker pull hello-world
このコマンドは、Docker Hub レジストリから hello-world
イメージをローカルマシンにダウンロードします。ダウンロードの進捗状況と完了を示す出力が表示されるはずです。
次に、docker inspect
コマンドを使用して取得したイメージを調べます。このコマンドは、イメージ、コンテナ、ボリューム、ネットワークなどの Docker オブジェクトに関する詳細情報を提供します。
docker inspect hello-world
このコマンドの出力は、hello-world
イメージに関するさまざまな詳細を含む大きな JSON ドキュメントになります。この出力を調べることで、イメージ ID、作成日、アーキテクチャ、オペレーティングシステム、構成などの情報を確認できます。
このイメージは署名されていないため、docker inspect
コマンドの出力には署名や信頼に関連する情報は含まれません。これが、Docker Content Trust の観点から見た署名されていないイメージの重要な特徴です。
このステップでは、リポジトリ管理者として Docker イメージのタグに署名する方法を学びます。Docker Content Trust はデジタル署名を使用して、取得するイメージがパブリッシャーが意図したものであることを保証します。リポジトリ管理者として、あなたはイメージタグに署名し、その信憑性を主張する権限を持っています。
イメージに署名する前に、Docker Content Trust を有効にする必要があります。これは、DOCKER_CONTENT_TRUST
環境変数を 1
に設定することで行います。
export DOCKER_CONTENT_TRUST=1
このコマンドは、現在のターミナルセッションで以降の Docker コマンドに対してコンテンツ信頼を有効にします。
では、前のステップで取得した hello-world
イメージに、リポジトリ名を含む新しいタグを付けましょう。プレースホルダーのリポジトリ名 your_docker_username/my-signed-image
を使用します。your_docker_username
を、あなたが持っている場合は実際の Docker Hub ユーザー名に置き換えるか、この実験では labexuser
を使用してください。
docker tag hello-world labexuser/my-signed-image:latest
このコマンドは、hello-world
と同じイメージを指す新しいタグ labexuser/my-signed-image:latest
を作成します。
では、このタグ付きのイメージをレジストリにプッシュしましょう。Docker Content Trust が有効になっている場合、署名されていないイメージタグをプッシュすると、署名するように促されます。
docker push labexuser/my-signed-image:latest
このコマンドを実行すると、Docker は新しい署名キーを作成するか、既存のキーを使用するかを尋ねます。これがおそらくあなたが初めて署名する場合、新しいキーを作成するように求められます。新しいキーにパスフレーズを設定する必要があります。このパスフレーズを覚えておいてください。後で他のイメージに署名したり、キーをローテーションしたりする際に必要になります。
パスフレーズを入力して確認した後、Docker はイメージタグに署名し、それをレジストリにプッシュします。署名プロセスとプッシュの成功を示す出力が表示されるはずです。
このステップでは、前のステップで署名したイメージタグの署名を検証します。リポジトリ管理者として、Docker Content Trust を使用して、取得するイメージが自分が署名したものであることを確認できます。
まず、Docker Content Trust が引き続き有効になっていることを確認しましょう。新しいターミナルセッションを開いた場合は、環境変数を再度設定する必要があるかもしれません。
export DOCKER_CONTENT_TRUST=1
では、署名されたイメージタグを取得してみましょう。Docker Content Trust が有効になっているため、Docker はイメージを取得する前に署名を検証します。
docker pull labexuser/my-signed-image:latest
このコマンドを実行すると、Docker は labexuser/my-signed-image:latest
タグの有効な署名を確認します。署名が有効で信頼できる場合、イメージが取得されます。イメージが取得されていることと、署名が検証されていることを示す出力が表示されるはずです。出力には「Verifying trust data for」と明示的に記載されます。
署名が無効または欠落している場合(かつコンテンツ信頼が有効になっている場合)、取得操作は失敗し、潜在的に危険なイメージの使用を防ぎます。
イメージに関連付けられた信頼情報をさらに調べるには、docker trust inspect
コマンドを使用できます。
docker trust inspect labexuser/my-signed-image:latest
このコマンドは、指定されたイメージタグに関連付けられた署名に関する詳細情報を表示します。署名者と署名されたタグに関する情報が表示されるはずです。この出力は、イメージタグが正常に署名され、その署名が Docker Content Trust によって認識されていることを確認します。
このステップでは、指定された「署名者」が Docker イメージのタグに署名する方法を探ります。実際のシナリオでは、リポジトリに複数の署名者がいる場合があり、それぞれが特定のタグやリリースの署名を担当します。これにより、より分散化された安全な署名プロセスが可能になります。
まず、Docker Content Trust が有効になっていることを確認します。
export DOCKER_CONTENT_TRUST=1
では、署名者が担当する可能性のある別のバージョンやリリースをシミュレートして、イメージに新しいタグを作成しましょう。
docker tag labexuser/my-signed-image:latest labexuser/my-signed-image:v1.0.0
これにより、同じイメージを指す新しいタグ labexuser/my-signed-image:v1.0.0
が作成されます。
この新しいタグを別の「署名者」として署名するには、docker trust sign
コマンドを使用します。このコマンドを使用すると、特定のキーで特定のタグに明示的に署名できます。
docker trust sign labexuser/my-signed-image:v1.0.0
このコマンドを実行すると、Docker は使用する署名キーのパスフレーズを求めます。ステップ 2 で生成した同じキーを使用している場合は、そのパスフレーズを入力します。別のキーを持つ別の署名者である場合は、そのキーのパスフレーズを使用します。
パスフレーズを正常に入力した後、Docker は labexuser/my-signed-image:v1.0.0
タグに署名します。署名プロセスを確認する出力が表示されるはずです。
最後に、更新された信頼データをレジストリにプッシュする必要があります。署名されたタグの docker push
コマンドには、新しい署名情報が含まれます。
docker push labexuser/my-signed-image:v1.0.0
このコマンドは、v1.0.0
タグとそれに関連付けられた署名をレジストリにプッシュします。
この最後のステップでは、前のステップで「署名者」として署名した v1.0.0
イメージタグの署名を検証します。これは、Docker Content Trust を有効にした任意のユーザーが、信頼できる署名者によって署名されたイメージの信憑性を検証できることを示しています。
まず、Docker Content Trust が有効になっていることを確認します。
export DOCKER_CONTENT_TRUST=1
では、v1.0.0
イメージタグを取得してみましょう。コンテンツ信頼が有効になっているため、Docker はこのタグに関連付けられた署名を検証します。
docker pull labexuser/my-signed-image:v1.0.0
ステップ 3 の検証と同様に、Docker がイメージの信頼データを検証し、その後イメージを取得していることを示す出力が表示されるはずです。これは、署名者として適用した署名が有効で認識されていることを確認します。
署名情報をさらに確認するには、再度 docker trust inspect
コマンドを使用できます。
docker trust inspect labexuser/my-signed-image:v1.0.0
このコマンドの出力には、v1.0.0
タグの署名者が表示されます。前のステップで使用した署名者のキー情報がここに表示されるはずです。これは、タグが信頼できるエンティティによって署名されている具体的な証拠を提供します。
以上で、Docker Content Trust を使用した Docker イメージタグの署名と検証の探索を終了します。コンテンツ信頼を有効にし、署名キーを使用することで、使用するイメージの整合性と信憑性を保証することにより、コンテナワークフローのセキュリティを大幅に向上させることができます。
この実験では、まず署名されていないイメージを調べて、その基本情報と署名詳細の欠如を理解することから始め、Docker Content Trust を使用する方法を学びました。次に、リポジトリ管理者として Docker イメージタグに署名するプロセスを探りました。これには、コンテンツ信頼を有効にし、docker trust sign
コマンドを使用してイメージの信憑性を保証することが含まれます。
署名プロセスの後、リポジトリ管理者として署名を検証し、イメージの整合性を確保する方法を学びました。また、指定された署名者としてタグに署名する練習を行い、リポジトリ内での署名権限の委任を実証しました。最後に、署名者として署名を検証し、委任された署名の適用と検証が成功したことを確認しました。