コンテントトラストの自動化

既存の自動化システムに Docker コンテントトラストを組み入れて構築することは、ごく普通に行われています。 そのシステムから Docker を通じ、信頼できるコンテントをプッシュできるようにするために、環境変数が用意されています。 これがクライアントに受け渡されます。

本節では DCT によるイメージへのサイン に示した手順を行っているものとします。 したがってその内容はよく読んで、前提条件を理解しておいてください。

Notary クライアントを直接操作する場合は、独自の環境変数のセット を利用します。

委任鍵ペアの秘密鍵の追加

ローカルの Docker トラストの保存場所に向けて、委任鍵ペアの秘密鍵のインポートを自動化するには、新たな鍵に対するパスフレーズを与える必要があります。 このパスフレーズは、委任鍵ペアによってタグにサインを行う際に、毎回必要となるものです。

$ export DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE="mypassphrase123"

$ docker trust key load delegation.key --name jeff
Loading key from "delegation.key"...
Successfully imported key from delegation.key

委任鍵ペアの公開鍵の追加

リポジトリを初期化する際には、同時に委任鍵ペアの公開鍵の登録を行います。 その後にリポジトリ内にトラストデータを生成するわけですが、その際にはローカルの Notary 標準ルート鍵のパスフレーズが必要になります。 リポジトリをすでに初期化済みであれば、リポジトリのパスフレーズだけが必要になります。

# Export the Local Root Key Passphrase if required.
$ export DOCKER_CONTENT_TRUST_ROOT_PASSPHRASE="rootpassphrase123"

# Export the Repository Passphrase
$ export DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE="repopassphrase123"

# Initialise Repo and Push Delegation
$ docker trust signer add --key delegation.crt jeff registry.example.com/admin/demo
Adding signer "jeff" to registry.example.com/admin/demo...
Initializing signed repository for registry.example.com/admin/demo...
Successfully initialized "registry.example.com/admin/demo"
Successfully added signer: registry.example.com/admin/demo

イメージへのサイン

最後に、イメージへのサインを行うには、サインする鍵のパスフレーズを環境変数に設定することが必要です。 docker trust key loadを実行していますから、ローカルの Docker トラストの保存場所に、すでに鍵はロードされ生成されています。

$ export DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE="mypassphrase123"

$ docker trust sign registry.example.com/admin/demo:1
Signing and pushing trust data for local image registry.example.com/admin/demo:1, may overwrite remote trust data
The push refers to repository [registry.example.com/admin/demo]
428c97da766c: Layer already exists
2: digest: sha256:1a6fd470b9ce10849be79e99529a88371dff60c60aab424c077007f6979b4812 size: 524
Signing and pushing trust metadata
Successfully signed registry.example.com/admin/demo:1

コンテントトラストを使ったイメージビルド

イメージをビルドする際に、コンテントトラストを利用することもできます。 docker buildコマンドを実行する前に、環境変数DOCKER_CONTENT_TRUSTを手動で設定しておくか、あるいはスクリプトを用意して設定します。 以下のような単純な Dockerfile を例にして説明します。

# syntax=docker/dockerfile:1
FROM docker/trusttest:latest
RUN echo

FROMタグによって、サイン済みのイメージをプルします。 FROMに指定されたイメージがローカルに存在しない場合、あるいはサインされていない場合、そのイメージをビルドすることはできません。 latestタグに対するコンテントトラストデータがある場合、以下のビルドは成功します。

$  docker build -t docker/trusttest:testing .
Using default tag: latest
latest: Pulling from docker/trusttest

b3dbab3810fc: Pull complete
a9539b34a6ab: Pull complete
Digest: sha256:d149ab53f871

コンテントトラストが有効である場合、トラストデータを用いていない Dockerfile によってビルドを行うと、ビルドコマンドは失敗します。

$  docker build -t docker/trusttest:testing .
unable to process Dockerfile: No trust data for notrust
trust, security, docker, documentation, automation