第7章 Clair セキュリティースキャン
Clair は、Red Hat Quay と共に使用できるマイクロサービスのセットで、一連の Linux オペレーティングシステムに関連付けられたコンテナーイメージの脆弱性スキャンを実行します。Clair のマイクロサービス設計は、エンタープライズ環境に合わせてコンポーネントを個別に拡張できるような、高いスケーラビリティーを持った設定で実行するのに適しています。
クレアは、以下の脆弱性データベースを利用して、お客様のイメージの問題点をスキャンします。
- アルパイン SecDB データベース
- AWS UpdateInfo
- Debian Oval データベース
- Oracle Oval データベース
- RHEL Oval データベース
- SUSE Oval データベース
- Ubuntu Oval データベース
- Pyup.io (python) データベース
Clair が異なるデータベースとのセキュリティーマッピングを行う方法については、ClairCore Severity Mapping を参照してください。
Red Hat Quay 3.4 のリリースに伴い、以前の Clair V2 (image quay.io/redhat/clair-jwt) が新しい Clair V4 (image registry.redhat.io/quay/clair-rhel8) に完全に置き換わりました。V4 の更新中に V2 をリードオンリーモードで動作させる方法は以下を参照してください。
7.1. Red Hat Quay OpenShift デプロイメントでの Clair の設定
7.1.1. Quay Operator によるデプロイ
OpenShift 上の新しい Red Hat Quay デプロイメントに Clair V4 をセットアップするには、Quay Operator を使用することを強くお勧めします。デフォルトでは、Quay Operator は、Red Hat Quay のデプロイとともに Clair のデプロイメントをインストールまたはアップグレードし、Clair のセキュリティースキャンを自動的に設定します。
7.1.2. 手動で Clair をデプロイ
Clair V2 を実行している既存の Red Hat Quay OpenShift デプロイメントに Clair V4 を設定するには、まず Red Hat Quay が少なくともバージョン 3.4.0 にアップグレードされていることを確認します。その後、以下の手順で Clair V4 を Clair V2 と一緒に手動で設定します。
現在のプロジェクトを、Red Hat Quay が実行されているプロジェクトの名前に設定します。以下に例を示します。
$ oc project quay-enterprise
Clair v4 用の Postgres デプロイファイル (例:
clairv4-postgres.yaml
) を以下のように作成します。clairv4-postgres.yaml
--- apiVersion: apps/v1 kind: Deployment metadata: name: clairv4-postgres namespace: quay-enterprise labels: quay-component: clairv4-postgres spec: replicas: 1 selector: matchLabels: quay-component: clairv4-postgres template: metadata: labels: quay-component: clairv4-postgres spec: volumes: - name: postgres-data persistentVolumeClaim: claimName: clairv4-postgres containers: - name: postgres image: postgres:11.5 imagePullPolicy: "IfNotPresent" ports: - containerPort: 5432 env: - name: POSTGRES_USER value: "postgres" - name: POSTGRES_DB value: "clair" - name: POSTGRES_PASSWORD value: "postgres" - name: PGDATA value: "/etc/postgres/data" volumeMounts: - name: postgres-data mountPath: "/etc/postgres" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: clairv4-postgres labels: quay-component: clairv4-postgres spec: accessModes: - "ReadWriteOnce" resources: requests: storage: "5Gi" volumeName: "clairv4-postgres" --- apiVersion: v1 kind: Service metadata: name: clairv4-postgres labels: quay-component: clairv4-postgres spec: type: ClusterIP ports: - port: 5432 protocol: TCP name: postgres targetPort: 5432 selector: quay-component: clairv4-postgres
以下のように、postgres データベースをデプロイします。
$ oc create -f ./clairv4-postgres.yaml
Clair v4 で使用する Clair
config.yaml
ファイルを作成します。以下に例を示します。config.yaml
introspection_addr: :8089 http_listen_addr: :8080 log_level: debug indexer: connstring: host=clairv4-postgres port=5432 dbname=clair user=postgres password=postgres sslmode=disable scanlock_retry: 10 layer_scan_concurrency: 5 migrations: true matcher: connstring: host=clairv4-postgres port=5432 dbname=clair user=postgres password=postgres sslmode=disable max_conn_pool: 100 run: "" migrations: true indexer_addr: clair-indexer notifier: connstring: host=clairv4-postgres port=5432 dbname=clair user=postgres password=postgres sslmode=disable delivery: 1m poll_interval: 5m migrations: true auth: psk: key: MTU5YzA4Y2ZkNzJoMQ== 1 iss: ["quay"] # tracing and metrics trace: name: "jaeger" probability: 1 jaeger: agent_endpoint: "localhost:6831" service_name: "clair" metrics: name: "prometheus"
- 1
- Clair の PSK (pre-shared key) を生成するには、ユーザーインターフェイスの Security Scanner セクションで
scanning
を有効にし、Generate PSK
をクリックします。
Clair の設定フォーマットの詳細は、アップストリームの Clair ドキュメント に記載されています。
Clair の
config.yaml
からシークレットを作成します。$ oc create secret generic clairv4-config-secret --from-file=./config.yaml
Clair v4 のデプロイメントファイル (例:
clair-combo.yaml
) を作成し、必要に応じて修正します。clair-combo.yaml
--- apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: quay-component: clair-combo name: clair-combo spec: replicas: 1 selector: matchLabels: quay-component: clair-combo template: metadata: labels: quay-component: clair-combo spec: containers: - image: registry.redhat.io/quay/clair-rhel8:v3.5.7 1 imagePullPolicy: IfNotPresent name: clair-combo env: - name: CLAIR_CONF value: /clair/config.yaml - name: CLAIR_MODE value: combo ports: - containerPort: 8080 name: clair-http protocol: TCP - containerPort: 8089 name: clair-intro protocol: TCP volumeMounts: - mountPath: /clair/ name: config imagePullSecrets: - name: redhat-pull-secret restartPolicy: Always volumes: - name: config secret: secretName: clairv4-config-secret --- apiVersion: v1 kind: Service metadata: name: clairv4 2 labels: quay-component: clair-combo spec: ports: - name: clair-http port: 80 protocol: TCP targetPort: 8080 - name: clair-introspection port: 8089 protocol: TCP targetPort: 8089 selector: quay-component: clair-combo type: ClusterIP
- 1
- イメージを最新のクレアのイメージ名とバージョンに変更します。
- 2
- サービスを clairv4 に設定すると、Clair v4 のスキャナーエンドポイントは、Red Hat Quay の config.yaml の
SECURITY_SCANNER_V4_ENDPOINT
に以下のように入力します。http://clairv4
.
以下のように Clair v4 の配置を作成します。
$ oc create -f ./clair-combo.yaml
Red Hat Quay 配置の
config.yaml
ファイルを変更して、最後に以下のエントリーを追加します。FEATURE_SECURITY_SCANNER: true SECURITY_SCANNER_V4_ENDPOINT: http://clairv4 1
- 1
- Clair v4 サービスのエンドポイントの特定
修正した
config.yaml
を、そのファイルを含むシークレット (たとえばquay-enterprise-config-secret
) に再デプロイします。$ oc delete secret quay-enterprise-config-secret $ oc create secret generic quay-enterprise-config-secret --from-file=./config.yaml
-
新しい
config.yaml
を有効にするには、Red Hat Quay の Pod を再起動する必要があります。quay-app
の Pod を削除するだけで、更新された設定の Pod がデプロイされます。
この時点で、名前空間のホワイトリストで特定された組織のイメージは、Clair v4 によってスキャンされます。