
# Kubernetes内のイメージスキャン

{% hint style="info" %}
この機能は次の場合にのみ利用できます **Pro** と **Advanced** プラン。 **お問い合わせ** 詳細はチャットでお問い合わせください。
{% endhint %}

Aikido の Kubernetes 連携では、コンテナレジストリを Aikido に接続しなくても、Kubernetes クラスター内のコンテナイメージをスキャンできます。

## クラスター内イメージスキャンの利点

* **完全なカバレッジ** クラスターにデプロイされたすべてのイメージ（公開イメージを含む）を対象に。
* **リアルタイムスキャン**：Pod が新しいイメージで起動されるたびに、Aikido がそれをスキャンし、検出結果は数分以内に Aikido フィードへ反映されます。
* **イメージは環境外に出ません**：Aikido エージェントは SBOM のみをプラットフォームに報告します。
* **帯域幅の削減**：Aikido エージェントはまず Kubernetes ノード上にキャッシュされたイメージの使用を試み、見つからないかアクセスできない場合にのみレジストリから取得します。これは、トラフィック量に応じて課金するコンテナレジストリを利用している組織に特に重要です。

## はじめに

Kubernetes クラスターのオンボーディング中にイメージスキャンを有効にできます

<figure><img src="https://help.aikido.dev/_assets/550d13ffcee2/image-188.png" alt="Aikido Kubernetes cluster onboarding with image scanning enabled" width="375"><figcaption><p>イメージスキャンを有効にした Kubernetes クラスターのオンボーディング</p></figcaption></figure>

その際には、次の設定も必要です `sbomCollector.enabled=true` Helm チャートをインストールする際にこの値を設定してください。

起動すると、Aikido で以下にイメージが表示されます [コンテナページ](https://app.aikido.dev/containers).

<figure><img src="https://help.aikido.dev/_assets/83245b203219/image-187.png" alt="Container images reported via the in-cluster Kubernetes scanning"><figcaption><p>Aikido に報告されたコンテナ</p></figcaption></figure>

#### イメージスキャンの挙動を選択

{% hint style="info" %}
スキャンの挙動は、同じイメージの複数のバージョン/タグ（例： `busybox:1.37` と `busybox:1.36`）をクラスター内で実行している場合に関係します。
{% endhint %}

クラスター内イメージスキャンを有効にすると、Aikido が稼働中のイメージをどのように追跡するかを選べます：

* **実行中の各イメージにつき 1 つのタグのみをスキャン**

よりシンプルなオプションです。同じイメージの複数タグが実行されている場合でも、クラスター内のイメージリポジトリごとにコンテナを 1 つだけ保持したいならこちらを選択してください。Aikido はそのイメージについて 1 つのコンテナを追跡し、最も最近デプロイされたバージョン/タグをスキャンします。

* **実行中のすべてのイメージタグをスキャン**

Kubernetes ワークロードごとに実行中のイメージを追跡したい場合は、このオプションを選択してください。同じイメージが複数のワークロードに異なるタグでデプロイされている場合、各タグは Aikido 上で個別のコンテナとして表示されます。

#### スキャン動作の設定場所

スキャン動作はクラスターごとの設定です。Kubernetes クラスターのオンボーディング時に選択するか、後で変更できます:

1. 次へ移動します： [クラウド](https://app.aikido.dev/clouds)、または開く **設定** を選択し、】【t\_0ba1b49c **クラウド** タブを選択します。
2. Kubernetes クラスターの横にある3つの点をクリックし、 **クラウドの設定**.
3. 選択 **クラスター設定** に移動し、 **「続行」**.
4. 次を確認してください: **クラスター内イメージスキャン** が有効になっています。
5. 次の項目の下で **イメージスキャンの動作**、希望するオプションを選択します。 **実行中の各イメージにつき 1 つのタグのみをスキャン** はドロップダウンに次のように表示されます **各イメージについて、最も最近デプロイされたタグのみをスキャンする**.
6. クリックします **「保存」**.

### イメージの取得方法

エージェント（別名 SBOM コレクター）は、ローカルのノードキャッシュからイメージを取得しようとします（そのため既定では DaemonSet として root ユーザーで実行され、containerd と Docker のソケットをマウントできるようになっています）。

SBOM コレクターがノードキャッシュからイメージを見つけられない場合（またはランタイムのソケットをマウントできない場合）、対応するレジストリからイメージを取得します。プライベートレジストリへのアクセスでは、ほとんどの認証方式（ノード IAM ロール、imagePullSecrets、workload identity）に対応しています。詳細と、必要に応じたアクセス設定方法については、 [Helm チャートの README](https://github.com/AikidoSec/helm-charts?tab=readme-ov-file#in-cluster-image-scanning).

{% hint style="info" %}
**SBOM コレクターのシークレットへのアクセス**

既定では、SBOM コレクターはクラスター内のすべてのシークレットにアクセスできます。これは、 `imagePullSecret` が使われる場合のアクセスを許可するためだけのものです。次のようにできます [シークレット名を指定する](https://github.com/AikidoSec/helm-charts/blob/main/kubernetes-agent/values.yaml#L75) ことで、レジストリへのアクセス資格情報を含むシークレットに限定し、SBOM コレクターに付与するアクセスを最小限にできます。
{% endhint %}

## FAQ

* **イメージの新しいバージョン/タグをデプロイするとどうなりますか？**

選択したイメージスキャンの挙動によって異なります。

次を使用している場合 `実行中の各イメージにつき 1 つのタグのみをスキャン`、Aikido はクラスター内のイメージリポジトリごとにコンテナを 1 つだけ保持します。同じイメージの新しいタグがデプロイされると、Aikido は追跡中のそのコンテナを最新のデプロイ済みバージョンに更新します。

次を使用している場合 `実行中のすべてのイメージタグをスキャン`、Aikido は Kubernetes ワークロードごとにイメージを追跡します。あるワークロードが `busybox:1.32` を `busybox:1.33`へ移行すると、Aikido は対応するコンテナを更新してスキャンし、異なるタグを実行している他のワークロードは引き続き個別のコンテナとして表示されます。

* **このスキャン方法は、Aikido が提供する他のコンテナ関連機能の恩恵も受けられますか？**

はい。クラスター内スキャンでスキャンされたイメージは、ノイズ削減、リポジトリへのリンク、AutoFix、Aikido Images など、Aikido が提供するすべての機能の恩恵を受けます。

* **特定のイメージを無視できますか？**

クラスター内スキャンでは、クラスターのオンボーディング時に設定した除外対象の namespace が尊重されます。スキャン対象の namespace から特定のイメージを除外したい場合は、次を推奨します [Aikido でそのコンテナを無効化する](https://app.aikido.dev/settings/container-image-registry).

* **Aikido が、もう存在しないコンテナのタスクトラッカー チケットを作成し続けます。どうすればよいですか？**

これは、デプロイ手順で既存のもののイメージを更新するのではなく新しい Kubernetes Deployment を作成している場合や、（CronJob で管理されていない）頻繁な Kubernetes Job を実行している場合に発生することがあります

このような場合には、 `実行中の各イメージにつき 1 つのタグのみをスキャン` スキャン挙動を使うと、イメージリポジトリごとにコンテナを 1 つだけ保持できるため、より整理されたインベントリになり、チケットの作成・終了を避けられます。

これは OpenShift クラスターでもよくあることで、多くのワークロードが同じイメージリポジトリから異なるタグを使用することがあります。たとえば `openshift/release`.

* **特定の Kubernetes namespace のコンテナ問題だけを表示できますか？**

はい。Aikido は、コンテナが実行されている Kubernetes namespace を次のように表示します [コンテナラベル](https://help.aikido.dev/getting-started/manage-teams-and-applications/add-labels-to-resources#manage-labels-on-a-container)。ラベルの形式は `k8s/namespace:<namespace>`。これにより、次のことが可能になります [これらのラベルに基づいてフィードを絞り込む](https://help.aikido.dev/getting-started/manage-teams-and-applications/add-labels-to-resources#filter-the-issue-feed-by-labels).
