ほとんどのDockerイメージは、それらが主張しているものであるかどうかの検証なしで配布されます。画像にデジタル署名することで、画像の信頼性を高めることができます。これは、詐欺師ではなく、画像を公開したことをユーザーに証明します。
Dockerの署名システムは、コンテンツの信頼として知られています。 docker trust
を通じて公開されます CLIコマンド。コンテンツトラストはキーセットを使用して、レジストリが将来の発行者の身元を確認できるようにします。署名された画像のユーザーは、期待されるソースからのものであると確信できます。
コンテンツトラストの使用を開始するには、キーペアが必要です。キーペアは、認証局によって発行されるか、DockerCLIによって生成されます。
docker trust key generate your-name
を実行します キーを作成します。パスフレーズを入力するように求められます。これは、キーを使用して画像に署名または確認するたびに提供する必要があります。続行するには、各プロンプトでEnterキーを押してください。
完了すると、2つのファイルが~/.docker/trust
に生成されます :秘密鍵とそれに対応する公開鍵。 SSHキーと同様に、秘密キーを共有したり、紛失したりしないでください。マシン間を移動する必要がある場合は、docker trust key load my-key.pem
を使用して、秘密鍵ファイルを別のDockerインストールにインポートできます。 。
Docker Hubは、docker trust
のすべての機能をサポートします 。プライベートDockerレジストリサーバーを使用している場合は、より複雑なセットアッププロセスが必要です。
レジストリサーバーは、組み込みの署名サポートを提供していません。イメージのプッシュとプルの署名検証を処理する別のDockerNotaryサービスが必要です。 Notaryには、サーバー、署名サービス、およびMySQLデータベースの3つのコンポーネントがあります。レジストリサーバーと同じURLにデプロイする必要があります。
DockerComposeファイルを使用してNotaryを起動して実行できます。
git clone https://github.com/theupdateframework/notary.git
docker-compose up -d
この基本的な展開は、自己署名TLS証明書を使用して実行されます。開発用のみを対象としています。認証局ファイルfixtures/root-ca.crt
を信頼する必要があります クライアントが正常に接続できるようになる前に、リポジトリに保存されます。
sudo mkdir -p /usr/share/ca-certificates/extra
sudo cp fixtures/root-ca.crt /usr/share/ca-certificates/extra/notary.crt
sudo update-ca-certificates
上記のコマンドは、証明書ファイルをca-certificates
にコピーします ストレージの場所。 update-ca-certificates
すべての証明書をリロードし、システムに公証人の権限を追加します。
本番環境でNotaryを実行する場合は、認証を設定して、許可されたユーザーのみが新しいキーを追加できるようにする必要があります。 NOTARY_AUTH
docker-compose
を使用してサービスを開始する場合は、環境変数を設定する必要があります 。これは、username:password
でBase64でエンコードされたクレデンシャルを受け入れます フォーマット。公証人とやり取りするときに、これらを提供するように求められます。
export NOTARY_AUTH=$(echo "username" | base64):$(echo "password" | base64)
docker-compose up -d
これで、公開鍵をNotaryサーバーに追加する準備が整いました。キーはリポジトリごとに追加されます。これにより、画像を相互に分離し、委任されたサードパーティの寄稿者をサポートできます。秘密鍵を使用してコマンドを繰り返すようにさせることで、後で公開権限を持つ他の個人を追加できます。
docker trust signer add your-key-name registry.example.com/my-image
キーのパスフレーズを入力する必要があります。その後、レジストリサーバーで利用できるようになります。
キーがレジストリに登録されると、画像への署名を開始できます。 docker trust sign
を使用します 指図。各画像が正しいレジストリURLでタグ付けされていることを確認してください。
docker trust sign registry.example.com/my-image:latest
このコマンドは、キーを使用して画像に署名し、レジストリに直接プッシュします。 docker push
を手動で実行する必要はありません その後。個々のイメージの信頼データを保護するために、リポジトリキーとパスフレーズを設定する必要があります。各プロンプトに従って、署名キーを設定します。
docker push
を使用した既存のワークフローがある場合 、docker trust
の代わりにそのコマンドを選択できます 。上記の手順を実行してキーを作成し、Notaryに追加します。 DOCKER_CONTENT_TRUST
を設定します DockerCLIコマンドがContentTrustを検出し、それを自動的に適用するための環境変数。
export DOCKER_CONTENT_TRUST=1
docker push registry.example.com/my-image:latest
シェルの出力がdocker trust sign
と一致することがわかります を生成します。 Dockerは、より明示的なコマンドと同じアクションを実行します。
DOCKER_CONTENT_TRUST
プルした画像の検証に関しては、変数がより重要に再表示されます。 Dockerは、信頼データが含まれている場合でも、デフォルトではイメージの検証を試みません。コンテンツの信頼性の検証を有効にするには、シェルで環境変数を設定する必要があります。
export DOCKER_CONTENT_TRUST=1
docker pull registry.example.com/my-image:latest
変数が設定されると、すべてのイメージプルがレジストリのNotaryサーバーに対してチェックされます。 Notaryが信頼データを提供できない場合、画像は署名されていないものとして扱われ、プルは中止されます。これにより、本物の発行者になりすました悪意のある俳優によって発行された画像からあなたを保護します。
Docker Enterpriseユーザーは、オプションのデーモン設定を構成して、DockerEngineが既にホスト上にある信頼できないイメージを処理しないようにすることができます。これらはtar
で届いた可能性があります 安全でないソースからのアーカイブ。
/etc/docker/daemon.json
を編集します 次のキーを追加します:
{
"content-trust": {
"mode": "enforced"
}
}
systemctl reload docker
を使用してDockerデーモン構成をリロードします 変更を適用します。
docker trust inspect
を使用して、画像の信頼ステータスを検査できます。 。これにより、画像に関連付けられている署名が表示され、画像が署名されているかどうかを確認できます。
docker trust inspect registry.example.com/my-image:latest
署名する必要がなくなった画像を公開した場合は、docker trust revoke
を使用してください 指図。これにより、イメージの信頼データが削除され、後続のすべてのDockerクライアント検証が失敗します。
docker trust revoke registry.example.com/my-image:latest
Docker Content Trustは、Dockerエコシステムにデジタル署名を追加し、画像を使用する際の安全性を高めます。画像をDockerHubにプッシュすると、この機能を使用するために必要なものがすべて揃っています。 DOCKER_CONTENT_TRUST
を設定します 環境変数を使用し、通常どおりDockerコマンドを使用します。
自己ホスト型レジストリユーザーの場合、セットアップはより複雑ですが、信頼が重要な環境で努力する価値はあります。執筆時点では、Notaryはまだ公式の安定したリリースを取得しておらず、ドキュメントはGitHubリポジトリにあります。