SnykでJHipsterのセキュリティスキャン
2020年10月8日
0 分で読めますJHipsterは、最新のWebアプリケーションやマイクロサービスアプリケーションをすばやく生成、開発、デプロイできる、よく知られたオープンソースプラットフォームです。JHipster CLIを使うと、アプリケーションで使いたいフレームワークやプラットフォームを選択できます。
さまざまなフレームワークを簡単に組み合わせられます。たとえば、バックエンドにはSpring Bootを使ったJava、データベースにはMongoDB、フロントエンドにはAngularまたはReactを選べます。お気に入りのテストフレームワークを組み合わせれば、必要なボイラープレートを含むアプリケーションがその場で生成されます。

セキュリティを組み込んだアプリケーションの作成
アプリケーションをスキャフォールディングし、複数のエコシステムを同時に使うと、選択した各エコシステムから多くの依存関係が取り込まれます。依存関係の健全性を常に把握することが欠かせません。利用している多数の依存関係のいずれかにセキュリティ上の問題が見つかった場合は、すぐに通知を受け取りたいものです。

コマンドラインでJHipsterプロジェクトをスキャンする
無料のSnyk脆弱性スキャナーを使って、アプリケーションの依存関係をテストします。JHipsterのインストールにnpmを使ったので、次のコマンドを実行するだけで、ローカルマシンにSnykをインストールできます。
最初に認証を行います。スキャン機能を使うには、無料のSnykアカウントが必要です。snyk authと入力するとCLIがWebブラウザーを開くので、無料アカウントを作成するか、サインインしてください。すでにSnykアカウントをお持ちの場合は、APIキーsnyk auth <api key>を使うか、環境変数SNYK_TOKENに設定することもできます。
プロジェクトをスキャンするときは、次のコマンドを実行するだけです。
フォルダー内に複数のプロジェクトがある場合もあるため、all-projectsフラグの使用をおすすめします。このフラグを指定すると、Snykは現在のディレクトリとそのサブディレクトリにある複数のマニフェストファイルを検索します。
JHipsterで小規模なモノリシックアプリケーションを作成した場合、フォルダー内にはバックエンド用のJavaマニフェストファイルと、フロントエンド用のNode.jsマニフェストファイルの両方があるかもしれません。どちらもスキャンしましょう。
スキャン結果から、脆弱性のあるライブラリが含まれているか、簡単に修正できるかを確認できます。直接アップグレードできるバージョンがまだない場合でも、ライブラリを手動でアップグレードできることがあります。Mavenでの解決方法の例をご覧ください。

CI/CDパイプラインで依存関係をスキャンする
jhipster ci-cdを実行すると、CIパイプラインをいくつかの選択肢から作成できます。このパイプラインの一部として、依存関係もスキャンできると便利です。ここでもSnykを使います。必要なのは無料のSnykアカウントだけです。APIキーを使ってスキャンできます。
次の例では、JHipsterで作成できるさまざまなパイプラインにCLIを統合する方法を紹介します。最近ローカルマシンで使ったものと同じCLIで、同様の出力が得られます。
また、ビルド後も依存関係を監視したい場合があります。時間の経過とともに脆弱性が見つかることがあるため、依存関係を継続的に監視できると便利です。パイプラインでsnyk monitorを使う方法を紹介します。
Jenkins
Jenkinsパイプラインを選択すると、新しいsrc/main/docker/jenkins.ymlファイルが生成されます。次のコマンドでDockerコンテナを実行できます。docker-compose -f src/main/docker/jenkins.yml up
Jenkinsを使う場合、2つの方法があります。Jenkinsの画面からSnykプラグインをインストールし、パイプラインで使えるように設定できます。
または、Snyk CLIバイナリでアプリケーションをスキャンし、jhipster ci-cdジェネレーターが生成したJenkinsfileに処理を記述する方法もあります。
最新のSnyk CLIをダウンロードしてスキャンするには、次のステージをJenkinsfileに追加します。
注:(無料)アカウントのSnyk APIトークンを環境変数SNYK_TOKENとして追加する必要があります。

Jenkinsfileには3つのタスクが含まれます。
最新のSnyk CLIバイナリをダウンロードする
Snyk Test — アプリケーションをスキャンして脆弱性を表示する
Snyk Monitor — 現在の状態のスナップショットを作成し、継続的な監視のためにSnykへ送信する
Snyk TestとSnyk Monitorのどちらにも--severity-threshold=<low|medium|high>を追加すると、指定した深刻度以上の脆弱性だけが通知されます。
Github Actions
GitHubをリポジトリとして使う場合、GitHub Actionsはパイプラインを構築する最も一般的な方法の1つです。jhipster ci-cdジェネレーターで「Github Actions」を選ぶと、JHipsterが.github/workflow/github-ci.ymlファイルを生成します。ワークフローフォルダー内のYAMLファイルは、プッシュのたびにGitHubによって「アクション」として実行されます。

Snykを統合する方法はいくつかあります。
個別のGithub Actions
Snyk Test用に個別のGitHub Actionsを作成することもできます。その場合は、ワークフローフォルダーに別のYAMLファイルを作成します。このアクションは、JHipsterが作成したパイプラインと並行して実行されます。
エコシステムに応じたアクションを追加する必要があります。アクションの例はこちらのリポジトリにあります。
生成されたパイプラインにSnykのテストを統合する
追加のステップとして、JHipsterが生成したパイプラインにSnykを統合することもできます。
まず、Snyk APIトークンを環境変数に追加します。スクリプトのenv部分に追加できます。
トークンを外部に公開しないよう、Settings Secrets New secretを選択してシークレットに追加してください。

以下のステップを追加すると、次の処理を行えます。
最新のCLIバイナリをダウンロードする
Snyk Testでアプリケーションをテストする
Snyk Monitorで現在のスナップショットを監視する
npmを使ってバイナリをインストールする方法もあります。ただし、パイプライン内にnpmがインストールされている必要があります。JavaScriptベースのフロントエンドを選択している場合は、すでにインストールされています。その場合は、「Install Snyk CLI」ステップを次の内容に置き換えられます。
Snyk TestとSnyk Monitorのどちらにも--severity-threshold=<low|medium|high>を追加すると、指定した深刻度以上の脆弱性だけが通知されます。
Travis CI
jipster ci-cdジェネレーターでこのオプションを選択すると、JHipsterは.travisファイルを生成します。スクリプトセクションに次の内容を追加するだけで、Snykを簡単に統合できます。

Snyk APIキーを環境変数SNYK_TOKENとして追加する必要があります。Snyk TestとSnyk Monitorのどちらにも--severity-threshold=<low|medium|high>を追加すると、指定した深刻度以上の脆弱性だけが通知されます。
Circle CI
Circle CIを使う場合、2つの方法があります。インテグレーションのドキュメントの説明に従って、Circle CIのインスタンスでSnyk Orbを使用するよう設定できます。もう1つの方法は、JHipster ci-cdが生成したconfig.ymlに次の内容を追加し、最新バージョンのCLIでスキャンすることです。

Snyk APIキーを環境変数SNYK_TOKENとして追加する必要があります。Snyk TestとSnyk Monitorのどちらにも--severity-threshold=<low|medium|high>を追加すると、指定した深刻度以上の脆弱性だけが通知されます。
GitLab CI
GitLab CIでも、Snyk CLIを使ってCIパイプラインでプロジェクトをスキャンできます。JHipster ci-cdが生成した.gitlab-ci.ymlファイルの末尾に、次の例を追加すると、プロジェクトをスキャンして監視できます。

ここでも、Snyk APIキーを環境変数SNYK_TOKENとして追加する必要があります。Snyk TestとSnyk Monitorのどちらにも--severity-threshold=<low|medium|high>を追加すると、指定した深刻度以上の脆弱性だけが通知されます。
まとめ
サードパーティ製ライブラリにセキュリティ上の問題がないか確認することは、言うまでもなく重要です。脆弱性のあるライブラリが修正済みバージョンに置き換えられず、深刻な問題に発展した事例は数多くあります。Snykでスキャンすれば、開発中のローカルマシンでもCIパイプラインでも、こうした問題を防ぐのに役立ちます。
ご覧のとおり、JHipsterプロジェクトの依存関係は簡単にスキャンできます。この記事で紹介したCIパイプラインのコード例は、JHipsterのサンプルプロジェクトをご覧ください。JHipsterで素早く開発し、Snykで安全を守りましょう。
CTFを始めよう
オンデマンドのバーチャル入門ワークショップを視聴して、CTFの課題の解き方を学びましょう。



