3
1

More than 1 year has passed since last update.

Snyk で稼働中の Kubernetes ワークロードをテストする

Posted at

はじめに

この記事は、Qiita エンジニアフェスタ 2022 「Snykを使って開発者セキュリティに関する記事を投稿しよう!」 の参加記事です。

Snyk の Kubernetes Integration を Amazon EKS 環境で試してわかったことなどをまとめます。

今回は以下の構成で検証しています。

  • Amazon EKS: Kubernetes 1.22
  • Snyk controller: 1.92.2

Kubernetes Integration は Business plan または Enterprise plan で利用できます。Business plan は 14 日間の Free trial を利用することもできます。

Kubernetes Integration と Snyk controller

Snyk の Kubernetse Integration を利用すると、実行中のワークロードリソースをインポートして構成や脆弱性の分析を行うことができます。対象は稼働中のコンテナではなく、あくまでコンテナイメージです。つまり Snyk Container が動作します。

Sysdig Integration を利用することで Sysdig が提供するランタイムデータを使用してワークロードの検出を強化できるようです。本記事では触れません。

コンテナイメージのスキャンは大前提として開発工程や CI/CD の中で行なっていくべきと考えますが、Kubernetes Integration を使うことで

  • 本番環境にデプロイ済みのワークロードに脆弱性が含まれているか確認したい
  • イメージスキャンを行なっていない既存のワークロードを対象とした分析

といった観点、用途での利用にメリットがあると考えます。

Snyk controller は Kubernetes クラスター上で稼働するワークロードを監視し、使用されているイメージの脆弱性スキャンを実行するためのコントローラーです。スキャン結果は Snyk に送信され、Web UI で確認することができます。

Snyk controller で検出可能な Kubernetes のワークロードリソースは以下のとおりです。2022 年 6 月現在でカスタムリソースには対応していませんので、その点は注意が必要かと思います。

  • Deployment
  • ReplicaSet
  • ReplicationController
  • DaemonSet
  • StatefulSet
  • Job
  • CronJob
  • DeploymentConfig (OpenShift)
  • Pod

その他サポートされているコンテナレジストリやプログラミング言語などはドキュメントを参照ください。

Snyk controller のインストール

Snyk controller はベースイメージとして Red Hat UBI (Universal Base Image) を使用します。利用前に RedHat ライセンス契約の END USER LICENSE AGREEMENT に同意する必要があります。

導入方法

Amazon EKS 環境の場合、Snyk controller の導入方法は 2 つあります。

  • AWS クイックスタートで提供される CloudFormation テンプレートを使用する
     
    以下の3パターンのテンプレートが公開されています。

    1. 新しい VPC と EKS クラスターにデプロイ
    2. 既存の VPC の 新しい EKS クラスターにデプロイ
    3. 既存の EKS クラスターにデプロイ

  • 既存の EKS クラスターに Helm Chart からインストールする

今回は Helm Chart から導入を行いました。基本的にドキュメント通りに進めれば OK です。

Helm Chart からインストール

snyk-charts リポジトリを追加します。

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

Snyk controller 用の Namespace を作成します。

$ kubectl create namespace snyk-monitor
namespace/snyk-monitor created

dockercfg.json を以下の内容で作業環境に作成します。

dockercfg.json
{
  "credsStore": "ecr-login"
}

dockercfg.json はプライベートコンテナレジストリにアクセスするためのクレデンシャルを Snyk controller に提供するためのファイルです。ECR 以外のプライベートコンテナレジストリを使用している場合は、以下のドキュメントを参照して作成してください。

dockercfg.jsonIntegration ID を指定して Secret を作成します。

$ kubectl create secret generic snyk-monitor \
>        -n snyk-monitor --from-file=dockercfg.json \
>        --from-literal=integrationId=abcd1234-abcd-1234-abcd-1234abcd1234
secret/snyk-monitor created

Integration ID は Snyk の Web UI で Org Settings から Kubernetes Integration を有効化すると確認できます。

image.png

EKS のマネージドノードグループのノード IAM ロールに AmazonEC2ContainerRegistryReadOnly がアタッチされていることを確認します。

image.png

以下のような内容で values.yaml を作成します。

  • Snyk 上で表示されるクラスタ名を変更したい場合は clusterName を書き換えてください
  • Node IAM Role ARN はノードグループに設定されているノード IAM ロールの ARN に書き換えてください
  • excludedNamespaces を指定すると特定の Namespace を除外するよう Snyk controller を構成できます
    • kube-system などの内部の Namespace はデフォルトで除外されます
values.yaml
clusterName: "Test cluster" 

excludedNamespaces:
  - "snyk-monitor"
  - "kube-system"
  - "kube-public"
  - "kube-node-lease"
  - "local-path-storage"

volumes:
  projected:
    serviceAccountToken: true
    
securityContext:
  fsGroup: 65534

rbac:
  serviceAccount:
    annotations:
      eks.amazonaws.com/role-arn: <Node IAM Role ARN>

Snyk controller をインストールします。

$ helm upgrade --install snyk-monitor snyk-charts/snyk-monitor \
>              --namespace snyk-monitor \
>              -f values.yaml
Release "snyk-monitor" does not exist. Installing it now.
W0621 08:33:51.791629    2383 warnings.go:67] spec.template.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[1].key: beta.kubernetes.io/arch is deprecated since v1.14; use "kubernetes.io/arch" instead
NAME: snyk-monitor
LAST DEPLOYED: Tue Jun 21 08:33:51 2022
NAMESPACE: snyk-monitor
STATUS: deployed
REVISION: 1
TEST SUITE: None

snyk-monitor の pod が正常に起動していることを確認します。

$ kubectl get all -n snyk-monitor
NAME                                READY   STATUS    RESTARTS   AGE
pod/snyk-monitor-6d568f57df-pt559   1/1     Running   0          16s

NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/snyk-monitor   1/1     1            1           16s

NAME                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/snyk-monitor-6d568f57df   1         1         1       16s

インストールが正常に完了すれば Kubernetes Integration の設定で Snyk に接続済みの controller のバージョンが表示されます。

image.png

Kubernetes ワークロードを Snyk に追加する

手動インポート

Add project から Kuberenetes をクリックします。

image.png

テストを行いたいワークロードを選択し、Add selected workloads をクリックします。
Snyk に接続してからクラスター内のすべてのワークロードが表示されるまで少し時間がかかります。

image.png

Import が完了し、コンテナイメージのスキャンが実行されました。

image.png

ログを確認すると Kubernetes からインポートされていることが確認できます。

image.png

自動インポート

Snyk controller インストール時に policyOrgs として Snyk の Organization ID を指定すると、job と pod を除くワークロードを自動でインポートおよび削除します。

values.yaml
+ policyOrgs:
+   - 19982df2-0ed5-4a16-b355-e6535cfc41ef

特定のワークロード単位で自動インポートを指定したい場合は、ワークロードのマニフェストファイルに以下のようなアノテーションを付けます。

deployment.yaml
  apiVersion: apps/v1
  kind: Deployment
  metadata:
  name: my-app-deployment
+   annotations:
+     orgs.k8s.snyk.io/v1: 19982df2-0ed5-4a16-b355-e6535cfc41ef
  spec:
    template:
      spec:
        containers:
        …

詳細はドキュメントを参照してください。

以上です。
参考になれば幸いです。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1