1つのKubernetesクラスターに複数のSnyk Kubernetesコントローラーをインストールする
Pas Apicella
2022年8月15日
0 分で読めますKubernetesを使うと、分散システムをスムーズに実行するためのインターフェースを利用できます。アプリケーションのスケーリングやフェイルオーバーを管理し、デプロイパターンなども提供します。セキュリティに関しては、Kubernetesクラスターにワークロードをデプロイするチームが、アプリケーションセキュリティの要件に応じて、どのワークロードを監視するかを検討する必要があります。
各チームが、スキャンするコンテナイメージや、特に監視するワークロードをそれぞれ管理できるとしたらどうでしょうか。Kubernetesにデプロイするチームが複数あり、監視対象についてそれぞれ異なる要件があるかもしれません。このユースケースには、各チームが独自のSnyk Kubernetesインテグレーションを設定し、必要なワークロードを監視できるようにするのが最適です。仕組みを見ていきましょう。
Snyk Kubernetesインテグレーションの概要
SnykはKubernetesと連携し、実行中のワークロードをインポートして継続的にテストすることで、基盤となるイメージの脆弱性や、ワークロードのセキュリティを低下させる可能性のある設定を特定します。ワークロードのデプロイ後も、Snykは継続して監視を行い、新たに発見された脆弱性への露出や、新しいコンテナのデプロイ、ワークロード設定の変更によって発生する追加のセキュリティ上の問題を特定します。

Kubernetesインテグレーションのアーキテクチャ図
1つのKubernetesクラスターに複数のSnykコントローラーをインストールする方法
ここからが本番です。1つのKubernetesクラスターに複数のSnykコントローラーを設定する手順を、順を追って説明します。以下の手順で進めます。
個別の名前空間を設定する
名前空間ごとにSnyk組織を作成する
最初の名前空間(apples)に
snyk monitorをインストールして設定する2つ目の名前空間(bananas)に
snyk monitorをインストールして設定するデプロイしたワークロードがポリシーによって自動的にインポートされることを確認する
Regoポリシーファイルによって自動インポートされるワークロードをbananasにデプロイする
前提条件
Kubernetesインテグレーションを使用するには、SnykのBusinessまたはEnterpriseアカウントが必要です。お持ちでない場合は、Businessプランの無料トライアルを開始できます。ご自身で試す予定がなくても、1つのKubernetesクラスターに複数のSnykコントローラーをインストールして管理する方法を学ぶために、ぜひ読み進めてください(コードブロックは読み飛ばして構いません)。
AKS、EKS、GKE、Red Hat OpenShift、その他のサポート対象のディストリビューションなどのKubernetesクラスター。
ステップ1:個別の名前空間を設定する
このデモでは、KubernetesクラスターにAzure AKSサービスを使用します。このクラスターに、それぞれ別の名前空間に2つのSnykコントローラーをインストールします。以下の図のように、1つはapples名前空間に、もう1つはbananas名前空間にインストールします。

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

新しい組織
apples名前空間用:

bananas名前空間用:

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


各組織でKubernetesインテグレーションを有効にします。インテグレーションタブを選択し、Kubernetesを選択して、接続をクリックします。その後、Snyk Kubernetesのドキュメントを参照してセットアップを完了してください。
各Snyk組織のKubernetesインテグレーションのインテグレーションIDを控えておいてください。後ほど必要になります。KubernetesインテグレーションIDは、Snykの上部ナビゲーションバーにある組織設定アイコンをクリックし、サイドバーのインテグレーションに移動して、Kubernetesインテグレーションを選択すると確認できます。以下に示します。

ステップ3:apples名前空間にsnyk monitorをインストールして設定する
組織とインテグレーションを設定してクラスターに接続できたので、ターミナルからSnyk Monitorを設定します。
ワークロードイベントをサブスクライブするファイルを作成し、サブスクリプションの条件を定義して、Kubernetes監視用のSnyk Helmチャートをインストールし、モニターを設定して起動します。
レジストリファイルを作成する
ターミナルでapples組織用のディレクトリを作成し、そのディレクトリに移動します。
workload-events.regoというファイルを作成し、以下の内容を記述します。<APPLES_INTEGRATION_ID>を、apples組織のKubernetesインテグレーションのインテグレーションIDに置き換えてください。
以下のRegoポリシーでは、Kubernetesワークロードの種類がCronJobまたはServiceでない限り、apples名前空間のワークロードのみをSnykコントローラーがインポートまたは削除するように指定しています。ワークロードの種類について詳しくは、Snykのドキュメントを参照してください。
workload-events.rego
Snyk Helmチャートをリポジトリに追加する
Kubernetes環境にアクセスし、以下のコマンドを実行してSnyk ChartsリポジトリをHelmに追加します。このHelmチャートをインストールする際に必要になります。
Snyk Monitorの設定を作成し、Helmチャートをデプロイする
Kubernetesシークレットを使うと、認証情報を平文で漏らすことなく実行できます。ここではapples組織の設定をデプロイする際に、シークレットを作成して使用します。
apples名前空間にsnyk-monitorシークレットを作成し、<APPLES_INTEGRATION_ID>をapplesのSnykアプリのKubernetesインテグレーションIDに置き換えます。このデモでは、コンテナレジストリとして公開イメージへのアクセスに認証情報が不要なDocker Hubのパブリックリポジトリを使用します。プライベートコンテナレジストリの使用方法については、Snykコントローラーのドキュメントを参照してください。
次に、Regoポリシーファイルを保存するConfigMapを作成し、snyk-monitorがapples名前空間から何を自動インポートまたは削除するかを判定できるようにします。
次に、applesのSnykアプリのインテグレーションIDをコマンド内の<APPLES_INTEGRATION_ID>に置き換えて、snyk-monitorをapples名前空間にインストールします。
注:「AKS K8s - Apples」というラベルを使うと、まもなく確認するSnyk UIでインポートされたワークロードを見つけられます。
最後に、すべてが正常に起動していることを確認します(このコマンドはjqがインストールされていることを前提としています。インストールされていない場合は、手順の| jqの部分を省略してください)。
ここまでで、独自の名前を持つSnykコントローラーがapples名前空間にインストールされました。後ほど、Kubernetesクラスターのapples名前空間にワークロードをデプロイすると、設定に基づいてこのSnykコントローラーがワークロードを自動的にインポートする様子を紹介します。現時点でapples組織のプロジェクトページを更新すると、Snyk Monitor自体がスキャンされていることに気づくかもしれません。これは、apples名前空間内のDeploymentタイプのワークロードをスキャンするように指定したためです。

ステップ4:bananas名前空間にsnyk monitorをインストールして設定する
bananasというディレクトリを作成し、そのディレクトリに移動します。
次に、workload-events.regoというファイルを作成し、以下の内容を記述します。<BANANAS_INTEGRATION_ID>を、bananasのSnykアプリのKubernetesインテグレーションIDに置き換えてください。
次に、bananas名前空間用のsnyk-monitorシークレットを作成し、BANANAS_INTEGRATION_IDをbananasのSnykアプリのKubernetesインテグレーションIDに置き換えます。
次に、Regoポリシーファイルを保存するConfigMapを作成し、snyk-monitorがbananas名前空間から何を自動インポートまたは削除するかを判定できるようにします。
bananasのSnykアプリのKubernetesインテグレーションIDを指定し、¤BANANAS_INTEGRATION_ID>を置き換えて、snyk-monitorをbananas名前空間にインストールします。
最後に、すべてが正常に起動していることを確認します。
ステップ5:デプロイしたワークロードがポリシーによって自動的にインポートされることを確認する
次に、apples名前空間にワークロードをデプロイし、自動的にインポートされることを確認します。まず、以下のようにKubernetesにデプロイするSpring Bootアプリケーションから始めます。
springbootemployee-K8s.yamlというファイルを作成し、以下の内容を記述します。
次に、デプロイします。
数分後にワークロードがスキャンされ、apples名前空間のSnykコントローラーの指示に従って、Snykアプリのapples組織に自動的にインポートされることを確認します。

ステップ6:bananasにワークロードをデプロイする — Regoポリシーファイルによる自動インポート
snyk-boot-web-deployment.yamlというファイルを作成し、以下の内容を記述します。
以下のようにデプロイします。
約3分後にワークロードがスキャンされ、bananas名前空間のSnykコントローラーの指示に従って、Snykアプリのbananas組織に自動的にインポートされることを確認します。

補足:Snykコントローラーのログを確認する
Kubernetesの設定やYAMLファイルは、扱いが難しいことがあります。モニターの設定で問題が発生した場合は、以下のコマンド例のように各Snykコントローラーのログを確認すると役立つ場合があります。
ApplesのSnykコントローラー
BananasのSnykコントローラー
まとめ
このブログでは、1つのKubernetesクラスターに複数のSnykコントローラーをデプロイし、それぞれが個別の名前空間を監視する方法を紹介しました。コントローラーはKubernetes APIと通信し、Regoポリシーファイルで定義したDeployment、ReplicationController、CronJobなどのワークロードがクラスター上で稼働しているかを確認します。そして、関連するイメージを特定し、クラスター上で直接スキャンして脆弱性を検出します。
ご自身のKubernetesクラスターで、ぜひこの手順をお試しください。Snyk Businessプランの無料トライアルを開始できます。
さらに詳しく知るためのリソース
SnykでKubernetesインテグレーションを簡単に設定できることがわかったところで、コンテナセキュリティの取り組みを始める際に役立つリンクをご紹介します。
Snyk Containerを設定して、Kubernetesワークロードのプロジェクトを自動的にインポート/削除する方法
Styraの優れたチュートリアルコースでRegoを学ぶ
ソースコードの段階からインフラを保護
Snykはワークフロー内のIaCセキュリティとコンプライアンスを自動化し、構成ドリフトや不足しているリソースを検出します。



