Skip to main content

1つのKubernetesクラスターに複数のSnyk Kubernetesコントローラーをインストールする

著者

Pas Apicella

feature multispace k8s

2022年8月15日

0 分で読めます

Kubernetesを使うと、分散システムをスムーズに実行するためのインターフェースを利用できます。アプリケーションのスケーリングやフェイルオーバーを管理し、デプロイパターンなども提供します。セキュリティに関しては、Kubernetesクラスターにワークロードをデプロイするチームが、アプリケーションセキュリティの要件に応じて、どのワークロードを監視するかを検討する必要があります。

各チームが、スキャンするコンテナイメージや、特に監視するワークロードをそれぞれ管理できるとしたらどうでしょうか。Kubernetesにデプロイするチームが複数あり、監視対象についてそれぞれ異なる要件があるかもしれません。このユースケースには、各チームが独自のSnyk Kubernetesインテグレーションを設定し、必要なワークロードを監視できるようにするのが最適です。仕組みを見ていきましょう。

Snyk Kubernetesインテグレーションの概要

SnykはKubernetesと連携し、実行中のワークロードをインポートして継続的にテストすることで、基盤となるイメージの脆弱性や、ワークロードのセキュリティを低下させる可能性のある設定を特定します。ワークロードのデプロイ後も、Snykは継続して監視を行い、新たに発見された脆弱性への露出や、新しいコンテナのデプロイ、ワークロード設定の変更によって発生する追加のセキュリティ上の問題を特定します。

Kubernetes連携のお客様がKubernetes、Snyk Controller、Snyk Platformを接続する様子を示したシステムコンテキスト図。

Kubernetesインテグレーションのアーキテクチャ図

1つのKubernetesクラスターに複数のSnykコントローラーをインストールする方法

ここからが本番です。1つのKubernetesクラスターに複数のSnykコントローラーを設定する手順を、順を追って説明します。以下の手順で進めます。

  1. 個別の名前空間を設定する

  2. 名前空間ごとにSnyk組織を作成する

  3. 最初の名前空間(apples)にsnyk monitorをインストールして設定する

  4. 2つ目の名前空間(bananas)にsnyk monitorをインストールして設定する

  5. デプロイしたワークロードがポリシーによって自動的にインポートされることを確認する

  6. Regoポリシーファイルによって自動インポートされるワークロードをbananasにデプロイする

前提条件

  1. Kubernetesインテグレーションを使用するには、SnykのBusinessまたはEnterpriseアカウントが必要です。お持ちでない場合は、Businessプランの無料トライアルを開始できます。ご自身で試す予定がなくても、1つのKubernetesクラスターに複数のSnykコントローラーをインストールして管理する方法を学ぶために、ぜひ読み進めてください(コードブロックは読み飛ばして構いません)。

  2. AKS、EKS、GKE、Red Hat OpenShift、その他のサポート対象のディストリビューションなどのKubernetesクラスター。

ステップ1:個別の名前空間を設定する

このデモでは、KubernetesクラスターにAzure AKSサービスを使用します。このクラスターに、それぞれ別の名前空間に2つのSnykコントローラーをインストールします。以下の図のように、1つはapples名前空間に、もう1つはbananas名前空間にインストールします。

ApplesとBananasの名前空間に分かれたKubernetesクラスターの図。それぞれにNode.js、Python、Snyk Controllerのコンポーネントが含まれています。

以下のように名前空間を作成します。

➜  kubectl create namespace apples
namespace/apples created
➜  kubectl create namespace bananas
namespace/bananas created

ステップ2:名前空間ごとにSnyk組織を作成する

Snyk組織を分けることで、ワークロードのスキャンを分離できます。各機能チームがそれぞれ独自の組織を使うことで、ワークロードやイメージのスキャンをより適切に管理できます。デプロイする各Snykコントローラーで同じ組織を使用することもできますが、今回は組織を分けます。いずれの場合も、Snykコントローラーのインストール時に設定するラベルを使ってワークロードが表示されます。

組織選択メニュー。組織の一覧と、丸で囲まれた「新しい組織を作成」オプションが表示されています

新しい組織

apples名前空間用:

赤い車のサムネイルと「aks-apples-kubernetes」のラベルが表示された紫色のSnykバナー

bananas名前空間用:

赤い小さな車の画像と、ドロップダウン矢印付きの「aks-bananas-kubernetes」というテキストを表示する紫色のSnykバナー

作成すると、Snykアプリ内に空の組織が2つ表示されます。後ほど使用します。

Apples Inc.と「aks-apples-kubernetes」「aks-bananas-kubernetes」というグループが表示された、組織の検索画面。赤い楕円で強調されています。
「aks-bananas-kubernetes」プロジェクトのセレクターと、強調表示された設定アイコンがあるSnykダッシュボードのヘッダー

各組織でKubernetesインテグレーションを有効にします。インテグレーションタブを選択し、Kubernetesを選択して、接続をクリックします。その後、Snyk Kubernetesのドキュメントを参照してセットアップを完了してください。

各Snyk組織のKubernetesインテグレーションのインテグレーションIDを控えておいてください。後ほど必要になります。KubernetesインテグレーションIDは、Snykの上部ナビゲーションバーにある組織設定アイコンをクリックし、サイドバーのインテグレーションに移動して、Kubernetesインテグレーションを選択すると確認できます。以下に示します。

接続済みクラスター、インテグレーションID、コピーボタン、ドキュメント、コントローラーのバージョンを表示するSnyk Kubernetesインテグレーションの設定。

ステップ3:apples名前空間にsnyk monitorをインストールして設定する

組織とインテグレーションを設定してクラスターに接続できたので、ターミナルからSnyk Monitorを設定します。

ワークロードイベントをサブスクライブするファイルを作成し、サブスクリプションの条件を定義して、Kubernetes監視用のSnyk Helmチャートをインストールし、モニターを設定して起動します。

レジストリファイルを作成する

ターミナルでapples組織用のディレクトリを作成し、そのディレクトリに移動します。

➜  mkdir apples
➜  cd apples

workload-events.regoというファイルを作成し、以下の内容を記述します。<APPLES_INTEGRATION_ID>を、apples組織のKubernetesインテグレーションのインテグレーションIDに置き換えてください。

以下のRegoポリシーでは、Kubernetesワークロードの種類がCronJobまたはServiceでない限り、apples名前空間のワークロードのみをSnykコントローラーがインポートまたは削除するように指定しています。ワークロードの種類について詳しくは、Snykのドキュメントを参照してください。

workload-events.rego
package snyk
orgs := ["<APPLES_INTEGRATION_ID>"]
default workload_events = false
workload_events {
  input.metadata.namespace == "apples"
  input.kind != "CronJob"
  input.kind != "Service"
}

Snyk Helmチャートをリポジトリに追加する

Kubernetes環境にアクセスし、以下のコマンドを実行してSnyk ChartsリポジトリをHelmに追加します。このHelmチャートをインストールする際に必要になります。

➜  helm repo add snyk-charts https://snyk.github.io/kubernetes-monitor --force-update
"snyk-charts" has been added to your repositories

Snyk Monitorの設定を作成し、Helmチャートをデプロイする

Kubernetesシークレットを使うと、認証情報を平文で漏らすことなく実行できます。ここではapples組織の設定をデプロイする際に、シークレットを作成して使用します。

apples名前空間にsnyk-monitorシークレットを作成し、<APPLES_INTEGRATION_ID>をapplesのSnykアプリのKubernetesインテグレーションIDに置き換えます。このデモでは、コンテナレジストリとして公開イメージへのアクセスに認証情報が不要なDocker Hubのパブリックリポジトリを使用します。プライベートコンテナレジストリの使用方法については、Snykコントローラーのドキュメントを参照してください。

➜ kubectl create secret generic snyk-monitor -n apples \
    --from-literal=dockercfg.json={} \
    --from-literal=integrationId=<APPLES_INTEGRATION_ID>
secret/snyk-monitor created

次に、Regoポリシーファイルを保存するConfigMapを作成し、snyk-monitorがapples名前空間から何を自動インポートまたは削除するかを判定できるようにします。

➜ kubectl create configmap snyk-monitor-custom-policies -n apples \       --from-file=./workload-events.rego
configmap/snyk-monitor-custom-policies created

次に、applesのSnykアプリのインテグレーションIDをコマンド内の<APPLES_INTEGRATION_ID>に置き換えて、snyk-monitorをapples名前空間にインストールします。

➜ helm upgrade --install snyk-monitor-apples snyk-charts/snyk-monitor \
        --namespace apples \
        --set clusterName="AKS K8s - Apples" \
        --set policyOrgs=<APPLES_INTEGRATION_ID> \
        --set workloadPoliciesMap=snyk-monitor-custom-policies

Release "snyk-monitor-apples" does not exist. Installing it now.
LAST DEPLOYED: Thu Jul 14 19:29:28 2022
NAMESPACE: apples
STATUS: deployed
REVISION: 1
TEST SUITE: None

注:「AKS K8s - Apples」というラベルを使うと、まもなく確認するSnyk UIでインポートされたワークロードを見つけられます。

最後に、すべてが正常に起動していることを確認します(このコマンドはjqがインストールされていることを前提としています。インストールされていない場合は、手順の| jqの部分を省略してください)。

➜ helm ls -A -o json | jq
[
  {
"name": "snyk-monitor-apples",
"namespace": "apples",
"revision": "1",
"updated": "2022-07-14 19:45:56.681028 +1000 AEST",
"status": "deployed",
"chart": "snyk-monitor-1.92.10",
"app_version": ""
  }
]

➜ kubectl get pods -n apples
NAME                             READY   STATUS RESTARTS   AGE
snyk-monitor-apples-797cd64c-sqvj4   1/1 Running   0      16m

ここまでで、独自の名前を持つSnykコントローラーがapples名前空間にインストールされました。後ほど、Kubernetesクラスターのapples名前空間にワークロードをデプロイすると、設定に基づいてこのSnykコントローラーがワークロードを自動的にインポートする様子を紹介します。現時点でapples組織のプロジェクトページを更新すると、Snyk Monitor自体がスキャンされていることに気づくかもしれません。これは、apples名前空間内のDeploymentタイプのワークロードをスキャンするように指定したためです。

Snyk Projectsのダッシュボード。2つのKubernetesプロジェクトの脆弱性の深刻度別件数と、プロジェクトを追加するオプションが表示されています。

ステップ4:bananas名前空間にsnyk monitorをインストールして設定する

bananasというディレクトリを作成し、そのディレクトリに移動します。

➜ cd ..
➜ mkdir bananas
➜ cd bananas

次に、workload-events.regoというファイルを作成し、以下の内容を記述します。<BANANAS_INTEGRATION_ID>を、bananasのSnykアプリのKubernetesインテグレーションIDに置き換えてください。

package snyk
orgs := ["<BANANAS_INTEGRATION_ID>"]
default workload_events = false
workload_events {
      input.metadata.namespace == "bananas"
      input.kind != "CronJob"
      input.kind != "Service"
}

次に、bananas名前空間用のsnyk-monitorシークレットを作成し、BANANAS_INTEGRATION_IDをbananasのSnykアプリのKubernetesインテグレーションIDに置き換えます。

➜  ~/snyk/SE/blogs/snyk-multi-namespace-controllers/bananas kubectl create secret generic snyk-monitor -n bananas \
  --from-literal=dockercfg.json={} \
  --from-literal=integrationId=BANANAS_INTEGRATION_ID
secret/snyk-monitor created

次に、Regoポリシーファイルを保存するConfigMapを作成し、snyk-monitorがbananas名前空間から何を自動インポートまたは削除するかを判定できるようにします。

➜ kubectl create configmap snyk-monitor-custom-policies -n bananas --from-file=./workload-events.rego
configmap/snyk-monitor-custom-policies created

bananasのSnykアプリのKubernetesインテグレーションIDを指定し、‰¤BANANAS_INTEGRATION_ID>を置き換えて、snyk-monitorをbananas名前空間にインストールします。

➜ helm upgrade --install snyk-monitor-bananas snyk-charts/snyk-monitor \
      --namespace bananas \
      --set clusterName="K8s - Bananas" \
      --set policyOrgs=<BANANAS_INTEGRATION_ID> \
      --set workloadPoliciesMap=snyk-monitor-custom-policies
Release "snyk-monitor-bananas" does not exist. Installing it now.
NAME: snyk-monitor-bananas
LAST DEPLOYED: Thu Jul 14 20:19:36 2022
NAMESPACE: bananas
STATUS: deployed
REVISION: 1
TEST SUITE: None

最後に、すべてが正常に起動していることを確認します。

➜ helm ls -A -o json | jq .
[
  {
"name": "snyk-monitor-apples",
"namespace": "apples",
"revision": "1",
"updated": "2022-07-14 19:45:56.681028 +1000 AEST",
"status": "deployed",
"chart": "snyk-monitor-1.92.10",
"app_version": ""
  },
  {
"name": "snyk-monitor-bananas",
"namespace": "bananas",
"revision": "1",
"updated": "2022-07-14 20:19:36.563328 +1000 AEST",
"status": "deployed",
"chart": "snyk-monitor-1.92.10",
"app_version": ""
  }
]

➜ kubectl get pods -n bananas
NAME                                  READY   STATUS   RESTARTS  AGE
Snyk-monitor-bananas-54b8c4bf89-r6tf2   1/1 Running   0      3m38s

ステップ5:デプロイしたワークロードがポリシーによって自動的にインポートされることを確認する

次に、apples名前空間にワークロードをデプロイし、自動的にインポートされることを確認します。まず、以下のようにKubernetesにデプロイするSpring Bootアプリケーションから始めます。

springbootemployee-K8s.yamlというファイルを作成し、以下の内容を記述します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-employee-api-apples
  namespace: apples
spec:
  selector:
matchLabels:
  app: springboot-employee-api-apples
  replicas: 1
  template:
metadata:
  labels:
    app: springboot-employee-api-apples
spec:
  containers:
    - name: springboot-employee-api-apples
      image: pasapples/springbootemployee:multi-stage-add-layers
      imagePullPolicy: Always
      ports:
        - containerPort: 8080

次に、デプロイします。

➜ kubectl apply -f springbootemployee-K8s.yaml
deployment.apps/springboot-employee-api-apples created

数分後にワークロードがスキャンされ、apples名前空間のSnykコントローラーの指示に従って、Snykアプリのapples組織に自動的にインポートされることを確認します。

aks-apples-kubernetes組織のKubernetesプロジェクトと、問題の深刻度別件数を表示するSnyk Projectsダッシュボード

ステップ6:bananasにワークロードをデプロイする — Regoポリシーファイルによる自動インポート

snyk-boot-web-deployment.yamlというファイルを作成し、以下の内容を記述します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: snyk-boot-web
  namespace: bananas
spec:
  selector:
    matchLabels:
      app: snyk-boot-web
  replicas: 1
  template:
    metadata:
      labels:
        app: snyk-boot-web
    spec:
      containers:
        - name: snyk-boot-web
          image: pasapples/snyk-boot-web:v1
          imagePullPolicy: Always
          ports:
            - containerPort: 5000

以下のようにデプロイします。

➜ kubectl apply -f snyk-boot-web-deployment.yaml
deployment.apps/snyk-boot-web created

約3分後にワークロードがスキャンされ、bananas名前空間のSnykコントローラーの指示に従って、Snykアプリのbananas組織に自動的にインポートされることを確認します。

Kubernetesプロジェクト、脆弱性の深刻度別件数、レポートの表示やプロジェクトの追加オプションが表示されたSnyk Projectsダッシュボード。

補足:Snykコントローラーのログを確認する

Kubernetesの設定やYAMLファイルは、扱いが難しいことがあります。モニターの設定で問題が発生した場合は、以下のコマンド例のように各Snykコントローラーのログを確認すると役立つ場合があります。

ApplesのSnykコントローラー

export APPLES_POD=`kubectl get pods --namespace apples -l "app.kubernetes.io/name=snyk-monitor-apples" -o jsonpath="{.items[0].metadata.name}"`

kubectl logs -n apples $APPLES_POD -f

BananasのSnykコントローラー

export BANANAS_POD=`kubectl get pods --namespace bananas -l "app.kubernetes.io/name=snyk-monitor-bananas" -o jsonpath="{.items[0].metadata.name}"`

kubectl logs -n bananas $BANANAS_POD -f

まとめ

このブログでは、1つのKubernetesクラスターに複数のSnykコントローラーをデプロイし、それぞれが個別の名前空間を監視する方法を紹介しました。コントローラーはKubernetes APIと通信し、Regoポリシーファイルで定義したDeployment、ReplicationController、CronJobなどのワークロードがクラスター上で稼働しているかを確認します。そして、関連するイメージを特定し、クラスター上で直接スキャンして脆弱性を検出します。

ご自身のKubernetesクラスターで、ぜひこの手順をお試しください。Snyk Businessプランの無料トライアルを開始できます。

さらに詳しく知るためのリソース

SnykでKubernetesインテグレーションを簡単に設定できることがわかったところで、コンテナセキュリティの取り組みを始める際に役立つリンクをご紹介します。

ソースコードの段階からインフラを保護

Snykはワークフロー内のIaCセキュリティとコンプライアンスを自動化し、構成ドリフトや不足しているリソースを検出します。

続きを読む

feature insights context
Blog

自律型攻撃はすでに始まっている。防御もそのスピードに追いつかなければならない。

自律型攻撃者によって、防御に使える時間は短くなっています。継続的な検出、修復、検証、予防で、セキュリティチームが攻撃に歩調を合わせる方法をご紹介します。

Blog

Evo ADSのエージェント動作ガバナンスが一般提供開始:MCPの利用を管理

Evo ADSのエージェント動作ガバナンスが、MCPガバナンスから一般提供を開始しました。主要なAIコーディングエージェント全体で、MCPサーバーの利用を検出、承認、監視、記録、ブロックできます。

illustration hero ai
Blog

Agentic AppSecとは?

Agentic AppSecが、根拠に基づき、範囲を限定され、独立して検証されるAIエージェントを活用して、アプリケーションセキュリティの一連のプロセスを実行する方法をご紹介します。