Skip to main content

Gradleの依存関係:新しいSnyk Gradleプラグインでスキャン

Blog illustrations gradle feature

2020年10月23日

0 分で読めます

Gradleは、JavaエコシステムだけでなくAndroid開発でも主要なビルドシステムの一つです。Gradleを使うと、依存関係の管理、プロジェクトのビルド、テストを行えます。

プロジェクトの依存関係に既知のセキュリティ脆弱性がないかスキャンすることは重要です。依存関係のスキャンを始める理想的なタイミングは、依存関係をインポートしたその瞬間です。そのため、ビルドサイクルの一環として、サードパーティ製ライブラリのセキュリティ脆弱性をアプリケーションでスキャンできるGradleプラグインを作成しました。

Snyk Gradleプラグイン

Snyk GradleプラグインはGradle Plugin Portalで公開されているため、Gradleプロジェクトに簡単に追加できます。

io.snyk.gradle.plugin.snykplugin の Gradle プラグインページ。Snyk の脆弱性スキャンの詳細、バージョン 0.4、セキュリティタグを表示

plugins DSLを使ってプラグインを宣言するだけで利用できます。

Groovy:

plugins {
  id "io.snyk.gradle.plugin.snykplugin" version "0.4"
}

Kotlin:

plugins {
  id("io.snyk.gradle.plugin.snykplugin") version "0.4"
}

設定

プラグインを使用するにはSnykアカウントが必要です。まだお持ちでない場合は、こちらから作成できます。Snykアカウントは完全無料だということは、もうお伝えしましたか?

APIキーを設定する方法はいくつかあります。

以下で紹介するように、Gradleファイルに直接設定できます。ただし、たとえばプロジェクトがオープンソースの場合、このトークンが公開されないようにしたいでしょう。

もう一つの方法は、APIキーを含む環境変数SNYK_TOKENを設定することです。CIパイプラインでSnykスキャンを利用する場合にも、この方法が推奨されます。

Snykプラグインの設定

APIキーを環境変数として設定していれば、すぐにプラグインを使用できます。ここでは、このプラグインの設定を調整する方法を説明します。

Gradleファイルにsnyk拡張オブジェクトを追加します。

Groovy:

snyk {
    api = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
    severity = 'low'
    autoDownload = true
    autoUpdate = true
    arguments = '--all-sub-projects'
}

Kotlin:

configure<io.snyk.gradle.plugin.SnykExtension> {
   setApi("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")
   setSeverity("high")
   setAutoDownload(true)
   setAutoUpdate(true)
   setArguments("--all-sub-projects")
}
  • apiこれはSnyk APIキーです。ここに設定するか、省略してAPIキーを含む環境変数SNYK_TOKENを設定できます。

  • severity警告の対象とする重大度のしきい値です。low、medium、highのいずれかを指定できます。選択した重大度以上の脆弱性がすべて表示され、ビルドは失敗します。severityの設定を省略すると、検出されたすべての脆弱性が表示されますが、ビルドは失敗しません。

  • autoDownloadSnykはスキャンにCLIバイナリを使用します。たとえばnpm経由でCLIを別途インストールしている場合、GradleプラグインはそのCLIを使用します。システム上にCLIが見つからない場合、Gradleプラグインが最新バージョンを自動的にダウンロードします。このプロパティはデフォルトでtrueなので、指定する必要はありません。自動ダウンロードを無効にするには、このプロパティを指定してfalseに設定します。

  • autoUpdateSnyk CLIが事前にインストールされておらず、プラグインによって自動ダウンロードされる場合、新しいバージョンが利用可能になると更新することもできます。このプロパティのデフォルトはfalseです。たとえばnpmを使ってSnyk CLIを手動でインストール済みの場合、autoUpdateは機能しない点にご注意ください。

  • argumentsGradleプラグインは内部でSnyk CLIを使用します。このプロパティでは、必要に応じてCLIに追加の引数を指定できます。使用可能なフラグの詳細はCLIリファレンスをご覧ください。ヒント:Gradleでサブプロジェクトを使用している場合は、上の例のようにargumentsプロパティに--all-sub-projectsを設定してください。これにより、スキャンの実行時にすべてのGradleサブプロジェクトがスキャンされます。

Snykプラグインの実行

Snykプラグインを使うと、次の2つのタスクを利用できます。

  • snyk-test

  • snyk-monitor

これらのタスクは、個別に実行することも、連続して実行することもできます。

$ gradle snyk-test
$ gradle clean build snyk-test

Snyk test

Snyk testタスクは依存関係をスキャンし、トップレベルと推移的な依存関係の両方に既知の脆弱性がないか確認します。選択した重大度以上の脆弱性が見つかった場合、コンソールに表示され、ビルドは失敗します。

依存関係に関する警告を受け取りつつ、ビルドを失敗させたくない場合は、設定でseverityを省略してください。

Gradleのテストタスクが失敗し、脆弱性のある依存関係パスが1つ特定されたレポートを表示するターミナル。

Snyk monitor

Snyk monitorもsnyk-testタスクと同じ方法で依存関係を収集します。ただし、その時点のスナップショットとしてSnykアカウントに保存し、そのスナップショットを監視します。時間の経過とともに新たな脆弱性が見つかった場合や、脆弱性が修正された場合には、自動的に通知されます。リリースを本番環境にデプロイした後も監視を続けたい場合に最適です。Snyk monitorはビルドを失敗させず、監視のみを行います。

タスクの連携

新しいSnykタスクを既存のタスクと連携させることで、スキャンを自動実行できます。次の例では、Gradleファイルでsnyk-testタスクを通常のtestタスクに連携させています。

Groovy:

test.finalizedBy('snyk-test')

Kotlin:

tasks.test {
   finalizedBy(tasks.`snyk-test`)
}

これで、gradle testを実行するたびに、通常のテストの後にsnyk-testタスクが実行されます。つまり、アプリケーションをビルド(または再ビルド)するたびにsnyk-testタスクが呼び出されます。状況によっては、この方法で脆弱性のテストと監視を徹底できます。


Gradle Tutorial - How to use the Snyk plugin for Gradle