Skip to main content

Snyk Mavenプラグイン:開発者向けのセキュリティ脆弱性スキャンを統合

Integrate security into the CI/CD with the Snyk Maven plugin

2021年4月20日

0 分で読めます

MavenはJavaエコシステムで最も広く使われているビルドシステムであり、長年にわたってその地位を保っています。Mavenを使ったアプリケーションのビルドは簡単です。多くの作業をMavenが担ってくれるからです。Mavenのライフサイクルの各フェーズでは、次のような処理が実行されます。

  • 依存関係のダウンロード

  • Javaコードのコンパイル

  • ユニットテストの実行

  • リリース可能な成果物の作成

  • 統合テスト

  • その他さまざまな処理

Mavenを使えば、チームの各開発者のマシンでもCIパイプラインでも、開発ライフサイクルを同じように実行できます。Mavenが必要な依存関係をダウンロードし、テストを実行してくれるのなら、このライフサイクルに脆弱性スキャンをシームレスに組み込めたら便利だと思いませんか?それを実現するのがSnyk Maven pluginです。

プロジェクトの依存関係をスキャンして、既知のセキュリティ脆弱性を検出することは不可欠です。依存関係のチェックを始める理想的なタイミングは、依存関係を取り込んだその瞬間です。そのため、ビルドサイクルの一環としてサードパーティ製ライブラリのセキュリティ脆弱性をアプリケーションからスキャンできるSnyk Mavenプラグインを開発しました。開発者がセキュリティの専門知識を活用できます。

続きを読む前にプラグインの動作を見たい方に、ぴったりの動画があります。

The Simplest way to Secure your Java Maven Project

Snyk Mavenプラグイン

Maven用のSnykプラグインは一般提供されており、Maven Centralで公開されています。pom.xmlファイルで設定するだけで利用できます。以下はプラグインのデフォルト設定です。

<build>
  <plugins>
    <plugin>
      <groupId>io.snyk</groupId>
      <artifactId>snyk-maven-plugin</artifactId>
      <version>2.0.0</version>
      <inherited>false</inherited>
      <executions>
        <execution>
          <id>snyk-test</id>
          <goals>
            <goal>test</goal>
          </goals>
        </execution>
        <execution>
          <id>snyk-monitor</id>
          <goals>
            <goal>monitor</goal>
          </goals>
        </execution>
      </executions>
      <configuration>
        <apiToken>${env.SNYK_TOKEN}</apiToken>
        <args>
          <arg>--all-projects</arg>
        </args>
      </configuration>
    </plugin>
  </plugins>
</build>

ご覧のとおり、testとmonitorの2つのゴールがあります。プラグインをプロジェクトに追加したら、mvn snyk:testまたはmvn snyk:monitorを実行するだけです。デフォルトでは、snyk testゴールはライフサイクルのMaven testフェーズに関連付けられています。つまり、Maven testフェーズが完了すると、Snyk testゴールが自動的に実行されます。Snyk monitorゴールはinstallフェーズに関連付けられており、同様に動作します。

他のMavenプラグインと同様に、この動作は変更できます。executionの部分に<phase>タグを追加するだけです。test、package、verifyなどの既存フェーズ、またはnoneを指定できます。以下の例では、snyk-testをverifyフェーズに、snyk-monitorをnoneに設定しています。これでmvn snyk:monitorは手動で実行できますが、ビルドライフサイクルのフェーズの一部として自動実行されることはありません。

…
<executions>
   <execution>
       <phase>verify</phase>
       <id>snyk-test</id>
       <goals>
           <goal>test</goal>
       </goals>
   </execution>
   <execution>
       <phase>none</phase>
       <id>snyk-monitor</id>
       <goals>
           <goal>monitor</goal>
       </goals>
   </execution>
</executions>
... 

ライフサイクルでのSnykゴールの実行をスキップするには、コマンドに-Dsnyk.skipを追加するだけです。例:

mvn package -Dsnyk.skip

新しいSnyk Mavenプラグインの仕組み

以前からMaven用のSnykプラグインはありましたが、依存関係ツリーの判定に独自のロジックを使用していました。そのため、CLIと旧Mavenプラグインでは、出力に多少の違いが生じることがありました。

Gradleプラグインと同様に、新しいSnyk Mavenプラグインは内部でSnyk CLIを使用します。適切なCLIバイナリを自動的にダウンロードして更新するため、CLIを事前にインストールする必要はありません。必要なのは、APIトークンを取得するための無料のSnykアカウントだけです。

Snyk Mavenプラグインの設定

プラグインを設定するには、Snykで依存関係のセキュリティスキャンを有効にするためにAPIトークンを設定する必要があります。トークンは、SnykアカウントのGeneral settingsで確認できます。また、サービスアカウント専用のトークンを作成することもできます。

APIトークンセクションと、ユーザーメニューで強調表示された一般設定オプションが表示されたSnykアカウント設定ページ

ブログ記事の最初の例では、トークンをpomファイルに記述していません。代わりに、自分のマシンにグローバル環境変数SNYK_TOKENを作成し、それを参照しています。

この方法なら、秘密のトークンをpomファイルに含めずに済みます。コードをオープンソースリポジトリに公開する場合には特に便利です。

apiToken>${env.SNYK_TOKEN}</apiToken>

設定の<args>部分には、通常CLIに渡す任意のフラグを指定できます。ここでは--all-projectsフラグを指定しています。これにより、エコシステムを問わず、すべてのプロジェクトを一度にスキャンできます。プロジェクト内で複数のpomファイルを使っている場合に特に便利です。

必要に応じて、CLIの設定を細かく指定することもできます。デフォルトでは、CLIは最初の実行時に毎日自動更新されます。特定のバイナリやCLIのバージョンを使いたい場合、または更新方法を変更したい場合は、<configuration>内に<cli>オブジェクトを追加します。設定可能な項目はすべてgithub repoに記載されています。以下の例では、<updatePolicy>をalwaysに変更しています。その結果、プラグインは1日1回ではなく、実行のたびにCLIの新しい更新を確認します。

<configuration>
   ...
   <cli>
      <updatePolicy>always</updatePolicy>
   </cli>
</configuration>

Mavenのライフサイクルにセキュリティを追加

MavenのビルドライフサイクルにSnyk Open Sourceのスキャンを組み込むと、自然でスムーズに運用できます。新しいMaven用Snykプラグインなら、この連携をシームレスに実現し、CIパイプラインを含むあらゆるマシンで同じ方法で実行できます。CLIを手動で呼び出す必要はもうありません。また、Snyk Open Sourceのスキャン設定はプロジェクトの一部として保存されます。開発者の負担をひとつ減らせます。

プラグインの詳細については、Github repositoryをご覧ください。この便利な連携を使う前に、無料のSnykアカウントへの登録もお忘れなく。

ぜひご覧いただきたい関連リソース:

CTFを始めよう

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