第12章 イメージの署名
12.1. 概要
Red Hat Enterprise Linux (RHEL) システムでのコンテナーイメージの署名により、以下を実行できます。
- コンテナーイメージの起点の検証
- イメージが改ざんされていないことの確認
- ホストにプルできる検証済みイメージを判別するポリシーの設定
RHEL システムでのコンテナーイメージの署名についてのアーキテクチャーの詳細は、「Container Image Signing Integration Guide」を参照してください。
OpenShift Container レジストリーは、REST API 経由で署名を保存する機能を提供します。oc
CLI を使用して、検証済みのイメージを web コンソールまたは CLI に表示し、イメージの署名を検証することができます。
イメージ署名の保存についての初期サポートは OpenShift Container Platform 3.3 で追加されています。イメージ署名の検証についての初期サポートは OpenShift Container Platform 3.6 で追加されています。
12.2. Atomic CLI を使用したイメージの署名
OpenShift Container Platform はイメージの署名を自動化しません。署名には、通常はワークステーションに安全に保存される開発者のプライベート GPG キーが必要になります。本書では、このワークフローについて説明します。
atomic
コマンドラインインターフェース (CLI)(バージョン 1.12.5 以降) は、OpenShift Container レジストリーにプッシュできるコンテナーイメージに署名するためのコマンドを提供します。atomic
CLI は、Red Hat ベースのディストリビューション (RHEL、Centos、および Fedora) で利用できます。atomic
CLI は RHEL Atomic Host システムには事前にインストールされます。atomic パッケージの RHEL ホストへのインストールについての詳細は、「イメージ署名サポートの有効化」を参照してください。
atomic
CLI は、oc login
で認証された証明書を使用します。atomic
および oc
コマンドの両方で同じホストの同じユーザーを使用するようにしてください。たとえば、atomic
CLI を sudo
として使用する場合、OpenShift Container Platform に sudo oc login
を使用してログインします。
署名をイメージに割り当てるには、ユーザーに image-signer
クラスターロールがなければなりません。クラスター管理者は以下を使用してこれを追加できます。
$ oc adm policy add-cluster-role-to-user system:image-signer <user_name>
イメージにはプッシュ時に署名できます。
$ atomic push [--sign-by <gpg_key_id>] --type atomic <image>
署名は、atomic
トランスポートタイプの引数が指定される際に OpenShift Container Platform に保存されます。詳細は、「Signature Transports」を参照してください。
atomic
CLI を使用してイメージをセットアップし、実行する方法についての詳細は、「RHEL Atomic Host Managing Containers: Signing Container Images」ドキュメントか、または atomic push --help
出力で引数の詳細を参照してください。
atomic
CLI および OpenShift Container レジストリーの使用についてのワークフローの特定の例については、「Container Image Signing Integration Guide」で説明されています。
12.3. OpenShift CLI を使用したイメージ署名の検証
oc adm verify-image-signature
コマンドを使用して、OpenShift Container レジストリーにインポートされたイメージの署名を検証できます。このコマンドは、イメージ署名に含まれるイメージ ID が信頼できるかどうかを検証します。ここでは、パブリック GPG キーを使用して署名自体を検証し、提供される予想 ID と指定イメージの ID (プル仕様) のマッチングが行われます。
デフォルトで、このコマンドは通常 $GNUPGHOME/pubring.gpg にあるパブリック GPG キーリングをパス ~/.gnupg で使用します。デフォルトで、このコマンドは検証結果をイメージオブジェクトに保存し直すことはありません。これを実行するには、以下に示すように --save
フラグを指定する必要があります。
イメージの署名を検証するには、ユーザーに image-auditor
クラスターロールがなければなりません。クラスター管理者は、以下を使用してこれを追加できます。
$ oc adm policy add-cluster-role-to-user system:image-auditor <user_name>
検証済みのイメージで無効な GPG キーまたは無効な予想 ID と共に --save
フラグを使用すると、保存された検証ステータスおよびすべての署名が削除され、イメージは未検証の状態になります。
誤ってすべての署名を削除してしまうことを避けるために、最初は --save
フラグなしでコマンドを実行し、ログで潜在的な問題の有無を確認できます。
イメージ署名を検証するには、以下の形式を使用します。
$ oc adm verify-image-signature <image> --expected-identity=<pull_spec> [--save] [options]
<pull_spec
> はイメージストリームを記述して確認でき、<image>
はイメージストリームタグを記述して確認することができます。以下のコマンド出力例を参照してください。
イメージ署名の検証例
$ oc describe is nodejs -n openshift Name: nodejs Namespace: openshift Created: 2 weeks ago Labels: <none> Annotations: openshift.io/display-name=Node.js openshift.io/image.dockerRepositoryCheck=2017-07-05T18:24:01Z Docker Pull Spec: 172.30.1.1:5000/openshift/nodejs ... $ oc describe istag nodejs:latest -n openshift Image Name: sha256:2bba968aedb7dd2aafe5fa8c7453f5ac36a0b9639f1bf5b03f95de325238b288 ... $ oc adm verify-image-signature \ sha256:2bba968aedb7dd2aafe5fa8c7453f5ac36a0b9639f1bf5b03f95de325238b288 \ --expected-identity 172.30.1.1:5000/openshift/nodejs:latest \ --public-key /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release \ --save
12.4. レジストリー API の使用によるイメージ署名へのアクセス
OpenShift Container レジストリーは、イメージ署名の書き込みおよび読み取りを実行できる extensions
エンドポイントを提供します。イメージ署名は、Docker レジストリー API 経由で OpenShift Container Platform の KVS (key-value store) に保存されます。
このエンドポイントは実験段階にあり、アップストリームの Docker レジストリープロジェクトではサポートされていません。Docker レジストリー API の一般的な情報については、アップストリーム API のドキュメントを参照してください。
12.4.1. API 経由でのイメージ署名の書き込み
新規署名をイメージに追加するには、HTTP PUT
メソッドを使用して JSON ペイロードを extensions
エンドポイントに送信できます。
PUT /extensions/v2/<namespace>/<name>/signatures/<digest>
$ curl -X PUT --data @signature.json http://<user>:<token>@<registry_endpoint>:5000/extensions/v2/<namespace>/<name>/signatures/sha256:<digest>
署名コンテンツを含む JSON ペイロードの構造は以下のようになります。
{ "version": 2, "type": "atomic", "name": "sha256:4028782c08eae4a8c9a28bf661c0a8d1c2fc8e19dbaae2b018b21011197e1484@cddeb7006d914716e2728000746a0b23", "content": "<cryptographic_signature>" }
name
フィールドには、<digest>@<name>
形式の一意の値であるイメージ署名の名前が含まれます。<digest>
はイメージ名を表し、<name>
は署名の名前になります。署名の名前には 32 文字の長さが必要です。<cryptographic_signature>
は、コンテナー/イメージライブラリーで説明されている仕様に従っている必要があります。
12.4.2. API 経由でのイメージ署名の読み取り
署名済みのイメージが OpenShift Container レジストリーにすでにプッシュされていることを仮定した場合、以下のコマンドを使って署名を読み取ることができます。
GET /extensions/v2/<namespace>/<name>/signatures/<digest>
$ curl http://<user>:<token>@<registry_endpoint>:5000/extensions/v2/<namespace>/<name>/signatures/sha256:<digest>
<namespace>
は OpenShift Container Platform プロジェクト名またはレジストリーのリポジトリー名を表し、<name>
はイメージリポジトリーの名前を指します。digest
はイメージの SHA-256 チェックサムを表します。
指定されたイメージに署名データが含まれる場合、上記のコマンド出力により、以下の JSON 応答が生成されます。
{ "signatures": [ { "version": 2, "type": "atomic", "name": "sha256:4028782c08eae4a8c9a28bf661c0a8d1c2fc8e19dbaae2b018b21011197e1484@cddeb7006d914716e2728000746a0b23", "content": "<cryptographic_signature>" } ] }
name
フィールドには、<digest>@<name>
形式の一意の値であるイメージ署名の名前が含まれます。<digest>
はイメージ名を表し、<name>
は署名の名前になります。署名の名前には 32 文字の長さが必要です。<cryptographic_signature>
は、コンテナー/イメージライブラリーで説明されている仕様に従っている必要があります。
12.4.3. 署名ストアからのイメージ署名の自動インポート
OpenShift Container Platform は、署名ストアがすべての OpenShift Container Platform マスターノードに設定されている場合に、レジストリー設定ディレクトリーを使用してイメージ署名を自動インポートします。
レジストリー設定ディレクトリーには、各種レジストリー (リモートコンテナーイメージを保存するサーバー) およびそれらに保存されるコンテンツの設定が含まれます。この単一ディクトリーを使用すると、設定がコンテナー/イメージのすべてのユーザー間で共有されるように、各コマンドのコマンドラインオプションでその設定を指定する必要がありません。
デフォルトのレジストリー設定ディレクトリーは、/etc/containers/registries.d/default.yaml ファイルにあります。
すべての Red Hat イメージについてイメージ署名の自動インポートを実行する設定例:
docker:
registry.access.redhat.com:
sigstore: https://access.redhat.com/webassets/docker/content/sigstore 1
- 1
- 署名ストアの URL を定義します。この URL は、既存署名の読み取りに使用されます。
OpenShift Container Platform によって自動的にインポートされる署名は、デフォルトで 未検証 の状態になり、イメージ管理者による検証が必要になります。
レジストリー設定ディレクトリーについての詳細は、「Registries Configuration Directory」を参照してください。