Pulumiを使ってSnyk ContainerのKubernetesインテグレーションを自動化する
Pas Apicella
2022年2月9日
0 分で読めますInfrastructure as Code(IaC)という言葉はよく耳にしますが、この文脈におけるコードは、プログラミング言語で書かれたコードとは少し異なります。IaCは通常、Terraform、CloudFormation、Kubernetes YAML、Azure Resource Managerテンプレートなどのツールを使ってインフラストラクチャを構成することを指し、インフラストラクチャをどのように作成するかを定義するものです。こうした構成では、最新のプログラミング言語がもたらす柔軟性や機能を活用できません。つまり、IaCもコードではありますが、通常はそういう種類のコードではありません。
このブログでは、JavaScript、Typescript、Python、Goなど複数の言語でコードを記述できるオープンソースツール、Pulumiを使って、Snyk ContainerのKubernetesインテグレーションの設定に必要なものをすべて作成する手順を紹介します。
Snyk Kubernetesインテグレーションの概要
SnykはKubernetesと連携し、稼働中のワークロードをインポートしてテストすることで、関連するイメージや構成に含まれる脆弱性を特定します。こうした脆弱性は、ワークロードのセキュリティを損なうおそれがあります。インポート後もSnykはワークロードを継続的に監視し、新しいイメージのデプロイやワークロード構成の変更に伴って発生するセキュリティ上の問題を検出します。
Pulumiとは?
Pulumiは、広く利用されているプログラミング言語を活用し、クラウドリソースのプロビジョニングと管理を簡素化するオープンソースのIaCツールです。
2017年の創業以来、PulumiはDevOpsチームのInfrastructure as Codeへの取り組み方を根本から変えてきました。ドメイン固有言語に頼る代わりに、実際のプログラミング言語を使ってクラウドネイティブなインフラストラクチャをプロビジョニング、廃止できます。
Pulumiがサポートするプログラミング言語:
Python
JavaScript
Go
TypeScript
.NET言語(C#、F#、VB)
PulumiでSnyk Kubernetesインテグレーションをインストールする方法
いよいよ実践です。Pulumiをセットアップして自動化を開始するまで、順を追って説明します。以下の手順で進めます。
前提条件
Kubernetesインテグレーションを利用するには、SnykのBusinessまたはEnterpriseアカウントが必要です。アカウントをお持ちでない場合は、Businessを14日間無料でお試しください。
今回はGoogle Cloudにデプロイするため、アカウントが必要です。アカウントをお持ちでない場合は、こちらから無料で登録してください。いずれの場合も、こちらの手順に従ってPulumiをGoogle Cloudアカウントに接続してください。
この例では、
gcloudCLIがパスに設定されていることを前提としています。これはGoogle Cloud SDKの一部としてインストールされます。Python 3、Pulumiアカウント、Pulumi CLIが必要です。
Pulumiでは、環境のデフォルトとしてPython 3が設定されている必要があります。Python 2とPython 3を両方インストールしている場合、エイリアスの作成が必要になることがあります。次のコマンドを実行し、最新の3.xバージョンを使用していることを確認してください。
ステップ1:SnykアプリでKubernetesインテグレーションIDを設定する
Snykにログインし、Kubernetesインテグレーションを自動設定する組織を選択します。空の組織でも、プロジェクトがある既存の組織でも構いません。この例では、選択した組織でKubernetesインテグレーションがまだ設定されていないことを確認してください。
次に、インテグレーション > Kubernetes > 接続をクリックします。SnykのBusinessまたはEnterpriseアカウントをお持ちでない場合、この手順は実行できません。
後で必要になるため、インテグレーションIDを控えておきます。
![Kubernetesインテグレーションが未接続と表示されたSnykのプロジェクト設定画面。[接続]ボタンが強調表示されています。](https://res.cloudinary.com/snyk/image/upload/f_auto,w_2560,q_auto/v1663751141/wordpress-sync/blog-pulumi-k8s-settings.jpg)
これで準備完了です。Pulumi Infrastructure as Codeを使って、Snyk Kubernetesインテグレーションのデモをセットアップできます。Pulumiでは次の処理を行います。
GKEクラスターを作成する
クラスターにSnykコントローラーをデプロイする0
K8sワークロードをSnykに自動インポートするため、Snyk Kubernetesインテグレーションを設定する
Regoポリシーファイルに従い、
apples名前空間にサンプルワークロードをデプロイする
ステップ2:サンプルリポジトリをクローンする
以下の手順に沿って、次のデモ用GitHubリポジトリをクローンします。
リポジトリをクローンしたら、そのディレクトリにcdで移動し、次のコマンドを実行します…
ステップ3:Google Cloudで認証する
このデモをデプロイするには、ローカル認証を使ってGoogle Cloudで認証します。PulumiとGoogle Cloudの連携には他の方法もありますが、このデモではこれが最も簡単です。
ステップ4:新しいPulumiスタックを作成する
この例の独立したデプロイ先となる新しいスタックを作成します。例としてdevを使用します。
ステップ5:必要なPulumi構成変数を設定する
多くの場合、同じプロジェクト内のスタックごとに異なる値が必要になります。たとえば、Google Cloud Computeインスタンスのサイズを変えたり、開発用スタックと本番用スタックでKubernetesクラスターのサーバー数を変えたりできます。
スタックのキーと値のペアはプロジェクトのスタック設定ファイルに保存されます。このファイルは自動的にPulumi.<stack-name>.yamlという名前になります。通常、このファイルを意識する必要はありませんが、プロジェクトのソースコードとともにチェックインしてバージョン管理することもできます。
以下のように、次の構成変数をスタックに追加します。
デフォルトでは、クラスターにはn1-standard-1タイプのノードが3つ作成されます。この設定は変更できます。たとえば、n1-standard-2タイプのノードを5つにする場合は、次のコマンドを実行します。
最後に、Snyk Kubernetesインテグレーションをクラスターに自動設定するために必要な設定を行います。KubernetesインテグレーションIDとSnyk組織IDが必要です。この例では、両者は同じです。
このように、スタックは便利な形で構成できます。プロビジョニング後に変更することも可能です。
完了すると、次の内容を含むPulumi.dev.yamlファイルが作成されます。
ステップ6:pulumi upで一式をデプロイする
pulumi upコマンドで一式をデプロイすると、GKEクラスターやSnykコントローラーのHelmチャートなど、Snyk Kubernetesインテグレーションに必要なGoogle Cloudリソースがすべてプロビジョニングされます。続いて、Spring Bootアプリケーションを実行するKubernetesデプロイメントが作成されます。
プレビューが表示され、確認を求められた後、Snyk Kubernetesインテグレーションのデモに必要なリソースのプロビジョニングが始まります。
約5分後、クラスターの準備が整い、Snykコントローラーがインストールされ、サンプルワークロードのデプロイメントがSnyk組織に自動インポートされます。
以下のスクリーンショットで、すべてが想定どおりに作成されたことを確認できます。
Google Cloudに作成されたGKEクラスター:

自動設定されたSnyk Kubernetesインテグレーション:

apples名前空間から自動インポートされたサンプルワークロード:


構成を詳しく見る
Pythonファイル__main__.pyを詳しく見て、Snyk Kubernetesインテグレーションがどのようにインストール、設定されたのかを確認しましょう。
Snykコントローラーが使用するRegoポリシーファイルは現在、apples名前空間のワークロードのみをインポートし、CronJobまたはServiceタイプのものは除外するようにハードコードされています。この設定は__main__.pyで変更できます。また、Pythonコードに直接記述する代わりに、外部ファイルとして使用することもできます。
以下は、Helmチャートを使ってSnykコントローラーをインストールするPythonコードです。Helmチャートを取得するリポジトリを指定し、Snyk組織IDと先ほどのカスタムポリシーファイルを指定している点に注目してください。これらはすべて、GKEクラスターにSnykコントローラーをインストールし、Snykと連携するために必要です。
Pythonコードでは、apples名前空間にSpring Bootのサンプルアプリケーションもデプロイしています。このアプリケーションは、SnykコントローラーによってSnykアプリに自動インポートされました。デプロイに使用したPythonコードは次のとおりです。
ステップ7:Kubernetes構成を取得する
ここで取得した構成は、~/.kube/configファイルに使用するか、ローカルに保存してKUBECONFIG環境変数に設定できます。もちろん、普段使っているGoogle Cloudのコマンドもすべて使用できます。
たとえば、次のようにします。
いくつかのkubectlコマンドを使って、snyk-monitor名前空間にインストールされたSnykコントローラーと、Pulumiで管理されるようになったConfigMapおよびSecretを表示しています。
ステップ8:セットアップ全体を破棄する
作業が完了したら、すべてのリソースとスタックを破棄できます。
まとめると、Pulumiを使ってSnyk Kubernetesインテグレーションをインストール、設定する方法を学びました。このインテグレーションを使うと、稼働中のワークロードをインポートしてテストし、関連するイメージや構成に含まれる脆弱性を特定できます。こうした脆弱性は、ワークロードのセキュリティを損なうおそれがあります。
その他のリソース
Pulumiを使い、PythonからSnyk Kubernetesインテグレーションを簡単に設定する方法を学びました。コンテナセキュリティへの取り組みを始める際に役立つリンクをご紹介します。
Kubernetesインテグレーションの概要ドキュメント
Styraの優れたチュートリアルコースでRegoを学ぶ
ソースコードの段階からインフラを保護
Snykはワークフロー内のIaCセキュリティとコンプライアンスを自動化し、構成ドリフトや不足しているリソースを検出します。
