Skip to main content

Snyk fix:Snyk CLIによる脆弱性の自動修正

2021年10月7日

0 分で読めます

Snyk CLIに、脆弱性の検出と修正をこれまで以上に簡単にする新しいコマンドsnyk fixのオープンベータ版が登場しました。

Snyk CLIはすでに非常に汎用性が高く強力なツールです。開発者はこれを活用し、ローカルの開発環境で手動で、またはCI/CDパイプラインの一環として自動で、プロジェクトの脆弱性を検出して修正できます。

snyk testを実行すると、プロジェクトがスキャンされ、検出されたすべての脆弱性の一覧が表示されます。脆弱性を修正できる依存関係のアップグレード方法がある場合、Snyk CLIはその推奨事項に加えて、アップグレード方法と脆弱性の修正に必要な情報を提示します。

新しいsnyk fixコマンドは、推奨事項を自動で適用し、さらに一歩進んだ対策を実現します。ローカルの開発ワークフローで修正をすばやく適用したい開発者や、CI/CDの一環として修正を自動化したい方に特に便利です。

詳しく見ていく前に、利用可能な環境とサポート対象のエコシステムについて、いくつかお知らせします。

  • snyk fixコマンドはオープンベータ版のため、使用中に問題が発生する可能性があります。

  • 現在サポートされているのは、Pip、Pipenv、Poetryを使用するPythonプロジェクトのみです。詳しくはsnyk fixのドキュメントをご覧ください。

さっそく始めましょう。

Snyk CLIをセットアップする

まず、Snyk CLIがインストールされていることを確認してください。すでに使い慣れていてインストール済みの場合は、バージョンがv1.715.0以降であることを確認しましょう。

Snyk CLIのセットアップは簡単です。npmまたはHomebrewを使ってすばやくインストールし、Snykアカウントで認証するだけです(まだアカウントをお持ちでない場合は、こちらから無料で登録できます)。

npm install -g snyk
snyk auth

CLIの認証を求める画面がブラウザーで開きます。認証を完了してください。これで、Snyk CLIを使ってプロジェクトの脆弱性をスキャンする準備が整いました。

まずはSnyk CLIを実行してテストしてみましょう。ここでは、PyGoatプロジェクトのこちらのフォークを使用します。

pip install -r requirements.txt
snyk test
PyGoatプロジェクトで`snyk test`を実行しているターミナル。依存関係の脆弱性8件、アップグレードの推奨事項、ライセンスの問題が表示されている。

上のテスト結果からわかるように、Snyk CLIは8件の脆弱性を検出し、修正に向けたアップグレードを推奨しています。

次はどうすればよいでしょうか。テスト結果の末尾で、Snyk CLIが新しいsnyk fixコマンドの有効化を推奨しています。次のステップに進みましょう。

snyk fixを有効にする

冒頭でお伝えしたとおり、新しいsnyk fixコマンドは現在オープンベータ版です。利用するには、まず機能を有効にする必要があります。Snyk UI内にある専用エリアSnyk Previewから有効化できます。ここでは、開発中の新機能を利用できます。

SnykでSettings、次にSnyk Previewの順に移動します。「Automatically apply recommended remediation in CLI」の下にあるsnyk fix(1)を有効にし、Save changesボタン(2)をクリックして変更を適用します。

修正機能の有効化トグルと、強調表示された「変更を保存」ボタンが表示されたSnykのプレビュー設定ページ。

ローカル環境で脆弱性を修正する

新しいコマンドを有効にできたので、さっそく試してみましょう。CLIで次のコマンドを入力します。

snyk fix 

Snyk CLIは、可能な場合、検出された脆弱性の修正に必要なバージョンへのアップグレードを自動で適用し、結果の概要を出力します。

requirements.txt内のPython依存関係をアップグレードし、6件の問題を正常に修正するSnyk fixコマンドを表示したターミナル。

今回のPyGoatアプリケーションでは、8件中6件の脆弱性が修正されました。再度スキャンすると、2件の問題が残っています。Jinja2パッケージの中程度の深刻度の脆弱性と、psycopg2パッケージで検出されたLGPLv3.0ライセンスです。

次のステップとして、Snyk CLIでプロジェクトを継続的に監視し、残る脆弱性の修正が利用可能になったときや、これらの依存関係で新たな脆弱性が見つかったときに通知を受け取ることができます。次のコマンドを実行してください。

snyk monitor

CI/CDの一環として脆弱性を修正する

新しいsnyk fixコマンドを使えば、CI/CDパイプラインでの修正も自動化できます。GitHub Actionsを使った例を見てみましょう。

GitHub Actionsは、継続的インテグレーションに関するワークフローを開発者が自動化できるよう、GitHubが提供を開始した機能です。SnykのGitHub Actionsを使うと、Snykをこれらのワークフローに簡単に統合し、自動化されたCI/CDワークフローの一環として、GitHub上で直接プロジェクトの脆弱性をテストできます。このワークフローの一環として、脆弱性の修正もできるようになりました。

具体的には、次のワークフローを実行するこちらのアクションを使用します。

  • Init - バージョンが段階的にアップグレードされるのを防ぐため、ワークフローの最初に直近のコミットメッセージを確認します。すでに自動修正が行われている場合、snyk fixを再実行しません。

  • Security - ワークフローでsnyk fixを実行して脆弱性をスキャンし、アップグレード方法が見つかった場合はPRを作成します。

アクションの使い方は簡単です。

SnykのGitHub Actionでは、SNYK_TOKENという環境変数を使用します。これはSnyk APIトークンです。GitHub Actionを設定する前に取得してください。Snyk UIのSettingsページで確認できます。

APIトークンのセクションにぼかされたトークン、作成日、「取り消して再生成」ボタンが表示されたSnykアカウント設定ページ

トークンを取得したら、リポジトリの設定にあるSettings | Secretsでシークレットとして登録します。

「SNYK_TOKEN」という名前と、ぼかされた値フィールドが表示されたGitHub Actionsのシークレットフォーム。

これでSnyk Actionを設定する準備ができました。GitHubリポジトリでActionsタブを開き、左上のNew workflowボタンをクリックします。

GitHubでは、リポジトリのプログラミング言語に応じたテンプレートアクションがいくつか用意されています。Snyk GitHub Actionを設定するには、ページ上部のset up a workflow yourselfをクリックします。

「ワークフローを自分で設定する」リンクを矢印で示したGitHub Actionsのセットアップページ。

サンプルコードをこちらのコードに置き換えます(設定内の該当する名前空間に、使用するブランチ名を入力してください)。

name: Example workflow using Snyk fix
on: pull_request
jobs:
    init:
      runs-on: ubuntu-latest
      outputs:
        skip: ${{ steps.ci-skip-step.outputs.ci-skip }}
        skip-not: ${{ steps.ci-skip-step.outputs.ci-skip-not }}
      steps:
        - uses: actions/checkout@v2
          with:
            fetch-depth: 0
        - id: ci-skip-step
          uses: mstachniuk/ci-skip@master
          with:
            commit-filter: 'Merge pull request'
    security:
      runs-on: ubuntu-latest
      needs: init
      if: ${{ needs.init.outputs.skip == 'false' }}
      steps:
        - uses: actions/checkout@master
        - name: Run Snyk to check for vulnerabilities
          uses: snyk/actions/python-3.8@master
          env:
            SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
          with: 
            command: fix # adding this option to run snyk fix
            base: master    
        - name: create a PR
          uses: peter-evans/create-pull-request@v3
          with:
            base: main
        - name: get PR info
          run: |
            echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}"
            echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}"      
        - name: Run a multi-line script
          run: |
            echo Add other actions to build,
            echo test, and deploy your project.

これで完了です。新しいファイルをコミットするとPRが作成され、ワークフローが起動します。これにより、snyk fixコマンドを使った修正の自動化をシミュレーションできます。すべての手順を示したこちらのワークフローをご覧ください。

Snykの脆弱性スキャンワークフローが成功し、各ステップが完了したことを示すGitHub Actionsのセキュリティジョブ。

ワークフローの設定どおり、推奨される修正を含む新しいPRが作成されます。

requirements.txtファイル内の依存関係のバージョン更新を示すGitHubのプルリクエスト

snyk fixをぜひお試しください。

Snyk Previewを提供している理由の一つは、開発中やベータ版の機能をいち早く試せるようにするためです。snyk fixは、正式リリース前にユーザーコミュニティからぜひフィードバックをいただきたい新機能の好例です。ぜひお試しいただき、ご意見をsnyk-fix-feedback@snyk.ioまでお寄せください。

新しいコマンドの使い方や、サポート対象・対象外について詳しくは、snyk fixのドキュメントをご覧ください。

快適な修正を!

CTFを始めよう

オンデマンドのバーチャル入門ワークショップで、CTFチャレンジの解き方を学びましょう。