第5章 Red Hat Quay の Clair
Clair v4 (Clair) は、静的コード分析を活用してイメージコンテンツを解析し、コンテンツに影響を与える脆弱性を報告するオープンソースアプリケーションです。Clair は Red Hat Quay にパッケージ化されており、スタンドアロンと Operator デプロイメントの両方で使用できます。エンタープライズ環境に合わせてコンポーネントを個別にスケーリングできる、非常にスケーラブルな設定で実行できます。
5.1. Clair 設定の概要
Clair は、構造化された YAML ファイルによって設定されます。各 Clair ノードは、CLI フラグまたは環境変数を使用して、実行するモードと設定ファイルへのパスを指定する必要があります。以下に例を示します。
$ clair -conf ./path/to/config.yaml -mode indexer
または、以下を実行します。
$ clair -conf ./path/to/config.yaml -mode matcher
前述のコマンドはそれぞれ、同じ設定ファイルを使用して 2 つの Clair ノードを開始します。1 つはインデックス作成機能を実行し、もう 1 つはマッチング機能を実行します。
Clair を combo
モードで実行している場合は、設定でインデクサー、matcher、およびノーティファイアー設定ブロックを指定する必要があります。
5.1.1. プロキシー環境での Clair の使用に関する情報
Go 標準ライブラリーが尊重する環境変数は、必要に応じて指定できます。次に例を示します。
HTTP_PROXY
$ export http://<user_name>:<password>@<proxy_host>:<proxy_port>
HTTPS_PROXY
$ export https://<user_name>:<password>@<proxy_host>:<proxy_port>
SSL_CERT_DIR
$ export SSL_CERT_DIR=/<path>/<to>/<ssl>/<certificates>
Clair のアップデーター URL を使用して環境内でプロキシーサーバーを使用している場合は、Clair がスムーズにその URL にアクセスできるように、どの URL をプロキシー許可リストに追加する必要があるかを特定する必要があります。たとえば、osv
アップデーターは、エコシステムデータダンプを取得するために https://osv-vulnerabilities.storage.googleapis.com
にアクセスする必要があります。このような場合、URL をプロキシー許可リストに追加する必要があります。アップデーター URL の完全なリストについては、「Clair のアップデーター URL」を参照してください。
また、標準の Clair URL がプロキシー許可リストに追加されていることを確認する必要があります。
-
https://search.maven.org/solrsearch/select
-
https://catalog.redhat.com/api/containers/
-
https://access.redhat.com/security/data/metrics/repository-to-cpe.json
-
https://access.redhat.com/security/data/metrics/container-name-repos-map.json
プロキシーサーバーを設定するときは、Clair とこれらの URL 間のシームレスな通信を可能にするために必要な認証要件や特定のプロキシー設定を考慮してください。これらの考慮事項をすべて文書化して対処することで、アップデーターのトラフィックをプロキシー経由でルーティングしながら、Clair を効果的に機能させることができます。
5.1.2. Clair 設定リファレンス
次の YAML は、Clair 設定の例を示しています。
http_listen_addr: "" introspection_addr: "" log_level: "" tls: {} indexer: connstring: "" scanlock_retry: 0 layer_scan_concurrency: 5 migrations: false scanner: {} airgap: false matcher: connstring: "" indexer_addr: "" migrations: false period: "" disable_updaters: false update_retention: 2 matchers: names: nil config: nil updaters: sets: nil config: nil notifier: connstring: "" migrations: false indexer_addr: "" matcher_addr: "" poll_interval: "" delivery_interval: "" disable_summary: false webhook: null amqp: null stomp: null auth: psk: nil trace: name: "" probability: null jaeger: agent: endpoint: "" collector: endpoint: "" username: null password: null service_name: "" tags: nil buffer_max: 0 metrics: name: "" prometheus: endpoint: null dogstatsd: url: ""
上記の YAML ファイルには、万全を期すためにすべてのキーがリストされています。この設定ファイルをそのまま使用すると、一部のオプションがデフォルトで正常に設定されない場合があります。
5.1.3. Clair の一般的なフィールド
次の表では、Clair デプロイメントで使用できる一般的な設定フィールドについて説明します。
フィールド | Typhttp_listen_ae | 説明 |
---|---|---|
http_listen_addr | String | HTTP API が公開される場所を設定します。
デフォルト: |
introspection_addr | String | Clair のメトリクスと正常性エンドポイントが公開される場所を設定します。 |
log_level | String | ログレベルを設定します。文字列 debug-color、debug、info、warn、error、fatal、panic のいずれかが必要です。 |
tls | String | TLS/SSL および HTTP/2 の HTTP API を提供するための設定を含むマップ。 |
.cert | String | 使用する TLS 証明書。フルチェーン証明書である必要があります。 |
一般的な Clair フィールドの設定例
次の例は、Clair 設定を示しています。
一般的な Clair フィールドの設定例
# ... http_listen_addr: 0.0.0.0:6060 introspection_addr: 0.0.0.0:8089 log_level: info # ...
5.1.4. Clair インデクサー設定フィールド
次の表では、Clair の indexer
コンポーネントの設定フィールドについて説明します。
フィールド | 型 | 説明 |
---|---|---|
indexer | Object | Clair インデクサーノード設定を提供します。 |
.airgap | Boolean | インデクサーとフェッチャーのインターネットへの HTTP アクセスを無効にします。プライベート IPv4 および IPv6 アドレスが許可されます。データベース接続は影響を受けません。 |
.connstring | String | Postgres 接続文字列。URL または libpq 接続文字列として形式を受け入れます。 |
.index_report_request_concurrency | Integer |
レートは、インデックスレポート作成リクエストの数を制限します。これを
同時実行数を超えた場合、API はステータスコード |
.scanlock_retry | Integer | 秒を表す正の整数。並行インデクサーは、マニフェストスキャンをロックして、上書きを回避します。この値は、待機中のインデクサーがロックをポーリングする頻度をチューニングします。 |
.layer_scan_concurrency | Integer | レイヤーの同時スキャン数を制限する正の整数。インデクサーは、マニフェストのレイヤーを同時にマッチングします。この値は、インデクサーが並行してスキャンするレイヤーの数をチューニングします。 |
.migrations | Boolean | インデクサーノードがデータベースへの移行を処理するかどうか。 |
.scanner | String | インデクサー設定。 Scanner を使用すると、設定オプションをレイヤースキャナーに渡すことができます。スキャナーは、そのように設計されていると、構築時にこの設定を渡します。 |
.scanner.dist | String | 特定のスキャナーの名前と値として任意の YAML を持つマップ。 |
.scanner.package | String | 特定のスキャナーの名前と値として任意の YAML を持つマップ。 |
.scanner.repo | String | 特定のスキャナーの名前と値として任意の YAML を持つマップ。 |
インデクサー設定の例
次の例は、Clair の仮のインデクサー設定を示しています。
インデクサー設定の例
# ... indexer: connstring: host=quay-server.example.com port=5433 dbname=clair user=clairuser password=clairpass sslmode=disable scanlock_retry: 10 layer_scan_concurrency: 5 migrations: true # ...
5.1.5. Clair matcher 設定フィールド
次の表では、Clair の matcher
コンポーネントの設定フィールドについて説明します。
matchers
設定フィールドとは異なります。
フィールド | 型 | 説明 |
---|---|---|
matcher | Object | Clair matcher ノード設定を提供します。 |
.cache_age | String | レスポンスをキャッシュするように、ユーザーに通知する期間を制御します。 |
.connstring | String | Postgres 接続文字列。URL または libpq 接続文字列として形式を受け入れます。 |
.max_conn_pool | Integer | データベース接続プールのサイズを制限します。 Clair では、カスタムの接続プールサイズを使用できます。この数は、同時に許可されるアクティブなデータベース接続の数を直接設定します。 このパラメーターは、将来のバージョンでは無視されます。ユーザーは、接続文字列を使用して、これを設定する必要があります。 |
.indexer_addr | String | matcher は indexer に接続して脆弱性レポートを作成します。このインデクサーの場所は必須です。
デフォルトは |
.migrations | Boolean | matcher ノードがデータベースへの移行を処理するかどうか。 |
.period | String | 新しいセキュリティーアドバイザリーの更新頻度を決定します。
デフォルトは |
.disable_updaters | Boolean | バックグラウンド更新を実行するかどうか。
デフォルト: |
.update_retention | Integer | ガベージコレクションサイクル間で保持する更新操作の数を設定します。これは、データベースサイズの制約に基づいて安全な MAX 値に設定する必要があります。
デフォルトは
|
matcher 設定の例
matcher 設定の例
# ... matcher: connstring: >- host=<DB_HOST> port=5432 dbname=<matcher> user=<DB_USER> password=D<B_PASS> sslmode=verify-ca sslcert=/etc/clair/ssl/cert.pem sslkey=/etc/clair/ssl/key.pem sslrootcert=/etc/clair/ssl/ca.pem indexer_addr: http://clair-v4/ disable_updaters: false migrations: true period: 6h update_retention: 2 # ...
5.1.6. Clair matchers 設定フィールド
次の表では、Clair の matchers
コンポーネントの設定フィールドについて説明します。
matcher
設定フィールドとは異なります。
フィールド | 型 | 説明 |
---|---|---|
matchers | 文字列の配列。 |
ツリー内 |
.names | String |
有効な matchers について matcher ファクトリーに通知する文字列値のリスト。値を |
.config | String | 特定の matcher に設定を提供します。 matchers ファクトリーコンストラクターに提供されるサブオブジェクトを含む matcher の名前をキーとするマップ。以下に例を示します。 |
matchers 設定の例
次の例は、alpine
、aws
、debian
、oracle
matchers のみを必要とする仮の Clair デプロイメントを示しています。
matchers 設定の例
# ... matchers: names: - "alpine-matcher" - "aws" - "debian" - "oracle" # ...
5.1.7. Clair アップデーター設定フィールド
次の表では、Clair の updaters
コンポーネントの設定フィールドについて説明します。
フィールド | 型 | 説明 |
---|---|---|
updaters | Object | matcher の更新マネージャーの設定を提供します。 |
.sets | String | どのアップデーターを実行するかを更新マネージャーに通知する値のリスト。
値を 空白のままにすると、アップデーターは実行されません。 |
.config | String | 特定のアップデーターセットに設定を提供します。 アップデーターセットのコンストラクターに提供されるサブオブジェクトを含むアップデーターセットの名前をキーとするマップ。各アップデーターのサブオブジェクトのリストについては、「詳細なアップデーター設定」を参照してください。 |
アップデーター設定の例
次の設定では、rhel
セットのみが設定されます。rhel
アップデーターに固有の ignore_unpatched
変数も定義されています。
アップデーター設定の例
# ... updaters: sets: - rhel config: rhel: ignore_unpatched: false # ...
5.1.8. Clair ノーティファイアー設定フィールド
Clair の一般的なノーティファイアー設定フィールドを以下に示します。
フィールド | 型 | 説明 |
---|---|---|
notifier | Object | Clair ノーティファイアーノード設定を提供します。 |
.connstring | String | Postgres 接続文字列。形式を URL または libpq 接続文字列として受け入れます。 |
.migrations | Boolean | ノーティファイアーノードがデータベースへの移行を処理するかどうか。 |
.indexer_addr | String | ノーティファイアーはインデクサーに接続して、脆弱性の影響を受けるマニフェストを作成または取得します。このインデクサーの場所は必須です。 |
.matcher_addr | String | ノーティファイアーは matcher に接続して、更新操作をリストし、差分を取得します。この matcher の場所は必須です。 |
.poll_interval | String | ノーティファイアーが matcher に更新操作をクエリーする頻度。 |
.delivery_interval | String | ノーティファイアーが、作成された通知または以前に失敗した通知の配信を試行する頻度。 |
.disable_summary | Boolean | 通知をマニフェストごとに 1 つに要約するかどうかを制御します。 |
ノーティファイアー設定の例
次の notifier
スニペットは、最小設定用です。
ノーティファイアー設定の例
# ... notifier: connstring: >- host=DB_HOST port=5432 dbname=notifier user=DB_USER password=DB_PASS sslmode=verify-ca sslcert=/etc/clair/ssl/cert.pem sslkey=/etc/clair/ssl/key.pem sslrootcert=/etc/clair/ssl/ca.pem indexer_addr: http://clair-v4/ matcher_addr: http://clair-v4/ delivery_interval: 5s migrations: true poll_interval: 15s webhook: target: "http://webhook/" callback: "http://clair-notifier/notifier/api/v1/notifications" headers: "" amqp: null stomp: null # ...
5.1.8.1. Clair Webhook 設定フィールド
次の Webhook フィールドを Clair ノーティファイアー環境で使用できます。
.webhook | Object | Webhook 配信のノーティファイアーを設定します。 |
.webhook.target | String | Webhook が配信される URL。 |
.webhook.callback | String | 通知を取得できるコールバック URL。この URL に通知 ID が追加されます。 これは通常、Clair ノーティファイアーがホスティングされている場所です。 |
.webhook.headers | String | ヘッダー名を値のリストに関連付けるマップ。 |
Webhook 設定の例
Webhook 設定の例
# ... notifier: # ... webhook: target: "http://webhook/" callback: "http://clair-notifier/notifier/api/v1/notifications" # ...
5.1.8.2. Clair amqp 設定フィールド
次の Advanced Message Queuing Protocol (AMQP) フィールドを Clair ノーティファイアー環境で使用できます。
.amqp | Object | AMQP 配信のノーティファイアーを設定します。 [注記] ==== Clair は独自に AMQP コンポーネントを宣言しません。エクスチェンジまたはキューを使用しようとするすべての試みは、パッシブのみであり、失敗します。ブローカー管理者は、事前にエクスチェンジとキューをセットアップする必要があります。==== |
.amqp.direct | Boolean |
|
.amqp.rollup | Integer |
|
.amqp.exchange | Object | 接続先の AMQP エクスチェンジ。 |
.amqp.exchange.name | String | 接続先のエクスチェンジの名前。 |
.amqp.exchange.type | String | エクスチェンジのタイプ。通常は、direct、fanout、topic、headers のいずれかです。 |
.amqp.exchange.durability | Boolean | 設定されたキューが永続的かどうか。 |
.amqp.exchange.auto_delete | Boolean |
設定されたキューが |
.amqp.routing_key | String | 各通知が送信されるルーティングキーの名前。 |
.amqp.callback | String |
|
.amqp.uris | String | 接続先の 1 つ以上の AMQP ブローカーのリスト (優先順位順)。 |
.amqp.tls | Object | AMQP ブローカーへの TLS/SSL 接続を設定します。 |
.amqp.tls.root_ca | String | ルート CA を読み取ることができるファイルシステムパス。 |
.amqp.tls.cert | String | TLS/SSL 証明書を読み取ることができるファイルシステムパス。
[注意] ==== Go |
.amqp.tls.key | String | TLS/SSL 秘密鍵を読み取ることができるファイルシステムパス。 |
AMQP 設定の例
次の例は、Clair の仮の AMQP 設定を示しています。
AMQP 設定の例
# ... notifier: # ... amqp: exchange: name: "" type: "direct" durable: true auto_delete: false uris: ["amqp://user:pass@host:10000/vhost"] direct: false routing_key: "notifications" callback: "http://clair-notifier/notifier/api/v1/notifications" tls: root_ca: "optional/path/to/rootca" cert: "madatory/path/to/cert" key: "madatory/path/to/key" # ...
5.1.8.3. Clair STOMP 設定フィールド
次の Simple Text Oriented Message Protocol (STOMP) フィールドを Clair ノーティファイアー環境で使用できます。
.stomp | Object | STOMP 配信のノーティファイアーを設定します。 |
---|---|---|
.stomp.direct | Boolean |
|
.stomp.rollup | Integer |
|
.stomp.callback | String |
|
.stomp.destination | String | 通知を配信する STOMP の宛先。 |
.stomp.uris | String | 接続先の 1 つ以上の STOMP ブローカーのリスト (優先順位順)。 |
.stomp.tls | Object | STOMP ブローカーへの TLS/SSL 接続を設定しました。 |
.stomp.tls.root_ca | String | ルート CA を読み取ることができるファイルシステムパス。
[注意] ==== Go |
.stomp.tls.cert | String | TLS/SSL 証明書を読み取ることができるファイルシステムパス。 |
.stomp.tls.key | String | TLS/SSL 秘密鍵を読み取ることができるファイルシステムパス。 |
.stomp.user | String | STOMP ブローカーのログインの詳細を設定します。 |
.stomp.user.login | String | 接続に使用する STOMP ログイン。 |
.stomp.user.passcode | String | 接続に使用する STOMP パスコード。 |
STOMP 設定の例
次の例は、Clair の仮の STOMP 設定を示しています。
STOMP 設定の例
# ... notifier: # ... stomp: desitnation: "notifications" direct: false callback: "http://clair-notifier/notifier/api/v1/notifications" login: login: "username" passcode: "passcode" tls: root_ca: "optional/path/to/rootca" cert: "madatory/path/to/cert" key: "madatory/path/to/key" # ...
5.1.9. Clair 認可設定フィールド
Clair では、次の認可設定フィールドを使用できます。
フィールド | 型 | 説明 |
---|---|---|
auth | Object |
Clair の外部およびサービス内 JWT ベースの認証を定義します。複数の |
.psk | String | 事前共有キー認証を定義します。 |
.psk.key | String | JWT の署名と検証を行うすべての当事者間で配布される、base64 でエンコードされた共有キー。 |
.psk.iss | String | 確認する JWT 発行者のリスト。空のリストは、JWT クレームで任意の発行者を受け入れます。 |
認可設定の例
次の authorization
スニペットは、最小設定用です。
認可設定の例
# ...
auth:
psk:
key: MTU5YzA4Y2ZkNzJoMQ== 1
iss: ["quay"]
# ...
5.1.10. Clair トレース設定フィールド
Clair では、次のトレース設定フィールドを使用できます。
フィールド | 型 | 説明 |
---|---|---|
trace | Object | OpenTelemetry に基づいて分散トレース設定を定義します。 |
.name | String | トレースが属するアプリケーションの名前。 |
.probability | Integer | トレースが発生する確率。 |
.jaeger | Object | Jaeger トレースの値を定義します。 |
.jaeger.agent | Object | Jaeger エージェントへの配信を設定するための値を定義します。 |
.jaeger.agent.endpoint | String |
トレースを送信できる |
.jaeger.collector | Object | Jaeger コレクターへの配信を設定するための値を定義します。 |
.jaeger.collector.endpoint | String |
トレースを送信できる |
.jaeger.collector.username | String | Jaeger ユーザー名。 |
.jaeger.collector.password | String | Jaeger パスワード。 |
.jaeger.service_name | String | Jaeger に登録されているサービス名。 |
.jaeger.tags | String | 追加のメタデータを提供するキーと値のペア。 |
.jaeger.buffer_max | Integer | 保管および分析のために Jaeger バックエンドに送信される前にメモリーにバッファーできるスパンの最大数。 |
トレース設定の例
次の例は、Clair の仮のトレース設定を示しています。
トレース設定の例
# ... trace: name: "jaeger" probability: 1 jaeger: agent: endpoint: "localhost:6831" service_name: "clair" # ...
5.1.11. Clair メトリクス設定フィールド
Clair では、次のメトリクス設定フィールドを使用できます。
フィールド | 型 | 説明 |
---|---|---|
metrics | Object | OpenTelemetry に基づいて分散トレース設定を定義します。 |
.name | String | 使用中のメトリクスの名前。 |
.prometheus | String | Prometheus メトリクスエクスポーターの設定。 |
.prometheus.endpoint | String | メトリクスが提供されるパスを定義します。 |
メトリクス設定の例
次の例は、Clair の仮のメトリクス設定を示しています。
メトリクス設定の例
# ... metrics: name: "prometheus" prometheus: endpoint: "/metricsz" # ...