Skip to main content

SnykとHarnessでCI/CDパイプラインの脆弱性を検出・修正

著者

Pas Apicella

Martin Ansong

blog feature snyk harness

2021年12月10日

0 分で読めます

DevOpsが10年以上前に登場した当初の主な目的は、開発チームと運用チームの間にある溝を埋めることでした。そのために、アプリケーションの設計、構築、テスト、デプロイの各プロセスに自動化が導入されました。

しかし、開発チームがより速く、より頻繁にリリースを続ける一方で、セキュリティチームは追いつくのが難しくなっています。多くの場合、セキュリティチームがデリバリーパイプラインのボトルネックになっています。だからこそ、DevOpsプロセスの早い段階からセキュリティを取り入れ、DevSecOps文化を実践することがますます重要になっています。

開発者を中心に据えたSnykのセキュリティプラットフォームを、Harnessの統合デリバリーパイプラインのワークフローに組み込むことで、すべてのリリースにセキュリティとコンプライアンスのテストを含められます。これにより、脆弱な依存関係やコードを含むアプリケーションが本番環境にリリースされるのを防げます。SnykやHarnessのような最新のツールを使えば、CI/CDパイプラインを通じて脆弱性を検出、修正、対処し、ソフトウェアを迅速にリリースする能力を損なうことなく、ビジネスリスクを軽減できます。

Snykを始める

Snykは、コード、依存関係、コンテナ、Infrastructure as Codeに潜むセキュリティ脆弱性をチームが簡単に検出、優先順位付け、修正できる開発者向けセキュリティプラットフォームです。開発ツールやワークフロー、自動化パイプラインに直接統合できます。

業界をリードするアプリケーションとセキュリティのインテリジェンスを基盤とするSnykは、あらゆる開発者のツールキットにセキュリティの専門知識をもたらします。

Snykは無料アカウントに登録するだけで、すぐに使い始められます。

Harnessを始める

Harnessは、CI、CD、Feature Flags、Cloud Cost Managementなど、DevOpsプロセスをAIでシンプルにする業界初のソフトウェアデリバリープラットフォームです。

Harnessを使えば、再利用可能なテンプレートで複雑なデプロイを数分で構築でき、時間と手間を省けます。パイプラインも数分で構築できます。

Harnessはharness.ioにアクセスして無料トライアルアカウントを作成するだけで、すぐに使い始められます。

ビルドとデプロイのプロセスで脆弱性が通過するのを防ぐ

SnykとHarnessの相乗効果を最もよく理解するには、実際に手順を確認し、ご自身で設定して実行するのがおすすめです。この例では、HarnessのワークフローにSnykのテストを自動的に追加し、ビルドとデプロイのプロセスで脆弱性が通過するのを防ぐ方法を紹介します。

次のGitHubリポジトリを使用します: https://github.com/mansong1/springbootemployee-api

一緒に進めるには、次のものが必要です。

  1. Snykアカウント

  2. Harnessアカウント

このチュートリアルを始める前に、Harnessで次の手順を完了しておくと、より理解しやすくなります。

上記の手順を完了、または内容を確認すると、HarnessのCIワークフローの設定方法を学べます。

HarnessでSnykテストを実行する7つの手順

手順1: Snyk APIトークンのシークレットを作成する

Snyk CLIテストを実行するには、Snyk APIトークンが必要です。エンタープライズのお客様は、サービスアカウントを設定し、Snyk Appからトークンを作成できます。無料プランを含むエンタープライズ以外のSnykアカウントでは、メインのユーザートークンを使用できます。

次に、こちらの手順に従ってHarnessにシークレットを作成し、Snyk APIトークンを保存します。

手順2: 新しいパイプラインを作成する

1. まず、Harnessで+Projectをクリックして新しいプロジェクトを作成します

ソフトウェアデリバリーモジュールと「+ Project」ボタンを指す矢印が表示されたHarnessのウェルカム画面。

2. プロジェクトを作成したら、Continuous Integrationモジュールに移動して新しいパイプラインを作成します。

プロジェクトにパイプラインがなく、「パイプラインを作成」ボタンが強調表示されているパイプラインページ。

手順3: コードベースを追加する

パイプラインで最初のCIステージの場合は、CI Stageの設定でClone Codebaseを有効にします。既存のパイプラインにCIステージがある場合は、Codebaseをクリックします。Edit Codebase Configurationを参照してください。

手順4: ビルドファームのインフラを定義する

CIステージのインフラ設定で、Codebase用のビルドファームを定義します。Kubernetes Cluster Build Infrastructure Setupを参照してください。

手順5: Snykテストの実行を設定する

CI ExecutionでAdd Stepをクリックし、次にRunをクリックします。

Run、Plugin、Restore Cache From S3の各オプションが表示されたBuildメニュー

Runステップは、コンテナイメージ上で1つ以上のコマンドを実行します。

Snykは、Snyk CLIを含み、さまざまなプログラミング言語に対応するツールを備えたコンテナイメージを複数提供しています。この例では、サンプルアプリケーションで使用されているMaven版を使います。

Runステップの設定については、Run Step Settingsを参照し、Snyk APIトークンを追加してください。

Privilegedが有効になっている設定パネル。任意のレポートパスと、キーがSNYK_TOKENの環境変数が表示されています。

この環境変数は、設定のCommandセクションで参照できます。

Snyk Pipeline Studioの「Configure Run Step」パネル。Snyk TestのDockerイメージと、APIトークンを設定してsnyk testを実行するコマンドを表示。

手順6: パイプラインを実行する

これでパイプラインを実行できます。

1. Save and Publishをクリックします。

2. Runをクリックします。Pipeline Inputsの設定が表示されます。

3. CI CodebaseでGit Branchをクリックします。

4. Git Branchに、Codebaseがあるブランチ名(masterなど)を入力します。

Git Branchが選択され、ブランチにmasterが設定されたCI Codebase設定を表示するRun Pipelineダイアログ。

5. Run Pipelineをクリックします。

手順7: パイプラインの実行結果を確認する

ワークフローを実行すると、プロジェクトに脆弱な依存関係が含まれているため、SnykのTestステップは失敗します。また、Console Viewの切り替えをクリックして、レポート全体を確認できます。

注: テストをより細かく制御するには、severity-thresholdフラグに、対応するオプション(low|medium|high|critical)のいずれかを指定して、snyk testコマンドに渡します。このフラグを使うと、指定したレベル以上の脆弱性のみが報告されます

失敗と表示されたSnyk Testパイプライン。Initialize、Git clone、Snyk Testの各ステージと、脆弱性エラーのログが表示されています。

パイプライン全体はYAMLでも確認できます。Buildsで:

  1. More Optionsをクリックします。

  2. Edit Pipelineを選択します。

  3. YAMLをクリックします。

「Visual」と「Yaml」タブが表示され、「Yaml」が選択されているPipeline Studioのインターフェース

以下に、パイプライン全体をYAMLで示します。パイプラインの内容を編集して、再度実行できます。

pipeline:
  stages:
      - stage:
            type: CI
            spec:
                infrastructure:
                    type: KubernetesDirect
                    spec:
                        connectorRef: org.GKE
                        namespace: harness-builds
                execution:
                    steps:
                        - step:
                              type: Run
                              spec:
                                  connectorRef: org.Dockerhub
                                  image: snyk/snyk-cli:1.745.0-maven-3.5.4
                                  command: |-
                                      snyk config set api=$SNYK_TOKEN
                                      snyk test
                                  privileged: true
                                  envVariables:
                                      SNYK_TOKEN:  <+secrets.getValue("org.SNYK_TOKEN")>
                                  resources:
                                      limits:
                                          memory: 1Gi
                                          cpu: "1.0"
                              name: Snyk Test
                              identifier: Snyk_Test
                cloneCodebase: true
            name: CI
            identifier: CI
  properties:
      ci:
          codebase:
              repoName: springbootemployee-api
              connectorRef: org.Github
              build: <+input>
  projectIdentifier: Snyk
  orgIdentifier: default
  name: Snyk Test
  identifier: Snyk_Test
  description: Test local project for vulnerabilities.

CI/CDワークフロー

アプリケーションの依存関係をスキャンするだけでなく、使用するコンテナの選択によっても脆弱性が持ち込まれることがあります。さらに、クラウドリソースの設定ミスは、クラウドデータやサービスへのアクセスに悪用される、最も一般的なクラウド脆弱性の原因となります。

この例では、アプリケーションをビルドしてKubernetesにデプロイし、その後Snykで監視します。

Harnessでコンテナをビルドしてプッシュするには、こちらの手順に従ってください。Snyk Containerのスキャンステップの追加方法は、上記のSnyk Testステップと同様です。

コンテナをKubernetesクラスターにデプロイする方法は、Harnessのドキュメントを参照してください。CDパイプラインでは、デプロイの前にKubernetesマニフェストに対してSnykテストを実行します。snyk iac testステップは、Shell Scriptステップを使って追加します。

Pipeline StudioのShell Script設定。リポジトリをクローンし、Snyk Infrastructure as Codeのテストを実行するBashスクリプトを表示

Snyk IaCステップで実行するスクリプトは次のとおりです。

rm -rf springbootemployee-api || true

git clone https://github.com/mansong1/springbootemployee-api
cd springbootemployee-api

SNYK_TOKEN=<+secrets.getValue("org.SNYK_TOKEN")>
snyk config set api=$SNYK_TOKEN
snyk iac test manifests/<+infra.namespace>/templates/*.yaml

CI/CDワークフロー全体は次のようになります。

CI、ステージング環境へのデプロイ、セキュリティテストの各ステージを含む、SpringBoot Employee APIのパイプラインが成功したことを示すSnyk Pipelinesの画面。
CIとデプロイの各ステージを経て、SpringBoot Employee APIがステージング環境に正常にデプロイされたことを示すHarnessパイプラインダッシュボード

前述のとおり、このパイプラインはYAMLで確認できます。GitHubリポジトリにあります。

SnykはKubernetesと連携し、実行中のワークロードをインポートしてテストすることで、関連するイメージや設定の脆弱性を特定できます。インポート後もSnykはワークロードを継続的に監視し、新しいイメージがデプロイされたり、ワークロードの設定が変更されたりするたびに、新たなセキュリティ上の問題を検出します。

HarnessのCDワークフローでデプロイが成功すると、SnykのUIには次のように表示されます。

api/deployment.apps/snyk-employee-apiの重大度別件数と、関連付けられたコンテナイメージを一覧表示するプロジェクトダッシュボード
Kubernetesデプロイの脆弱性、セキュリティ設定チェックの失敗、中程度の深刻度のXXEインジェクション問題を示すSnykのダッシュボード。

今すぐ試す

テクノロジープラットフォームを選ぶ際は、開発者のニーズをソリューションの中心に据えているものを選ぶことが重要です。また、問題を報告するだけでなく、修正に重点を置いている必要があります。開発者を第一に考えるプラットフォームは、パイプライン全体にセキュリティを統合できるため、開発、セキュリティ、運用など、さまざまな関係者が全体像を把握できます。これにより、DevSecOpsの共通意識が根付き、より安全なソフトウェアを利用者に届けられます。

このチュートリアルをご覧いただき、ありがとうございました。ぜひ今日からSnykとHarnessをお試しください。

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

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

著者について

Martin AnsongはHarnessのCommercial Sales部門のSolutions Engineerとして、お客様のソフトウェアライフサイクルにおけるビルドとデリバリーの迅速化を支援しています。

Pas ApicellaはSnykのAPJ担当Principal Solution Engineerとして、Snykプラットフォームを通じてお客様のクラウドネイティブアプリケーションのセキュリティ確保とDevSecOps文化の実現を支援するとともに、ビジネスニーズへの対応にも取り組んでいます。