New RelicのSnyk連携機能を試してみた

New Relicの脆弱性管理機能(パブリックプレビュー)で追加されたSnyk連携を使って、Snykで管理している脆弱性情報をNew Relicのダッシュボードで可視化します。
2022.12.18

どーも、AWS事業本部コンサルティング部のイシザワです。

この記事は「New Relic Advent Calender 2022」18日目の記事です。

と、同時に「Snyk Advent Calender 2022」18日目の記事でもあります。

New Relicって?

New Relicはデータの収集・分析・可視化をエンドツーエンドで行える可観測性プラットフォームです。

エージェントやOSSによって収集されたデータを保管するTelemetry Data Platform、収集したデータをエンドツーエンドで分析・可視化するFull-Stack Observability、アラートの整理やAIを使った異常検知を行うAlerts and Applied Intelligenceの三つからNew Relicは構成されています。

メトリクス・ログ・トレースといったテレメトリーデータの収集から、分析・可視化、異常の検知までNew Relicひとつで行えることができるのが魅力です。

Snykって?

Snykは開発者のためのセキュリティプラットフォームで、ソースコード、依存先のライブラリ、コンテナイメージ等々の脆弱性をスキャンするSaaSサービスです。

IDEやソースコントロール、CI/CDパイプラインに組み込むことができ、ソフトウェア開発ライフサイクルの各所にセキュリティチェックを導入することができます。

Snyk連携機能って?

パブリックプレビューとなっている脆弱性管理機能で追加されたNew Relicの新機能です。 脆弱性管理機能によって、可観測性のためのテレメトリーデータだけでなくセキュリティ情報の管理もNew Relic上で行えるようになります。

脆弱性管理機能で追加された機能の一つとして、AWS Security HubやDependabot、Snyk等のサードパーティーのセキュリティツールとの統合があります。 これにより、ざっくり以下のような利点が考えられます。

  • セキュリティ問題を確認するサービスをNew Relicに一本化できる。(熱い!)
  • 様々なセキュリティツールから集積されたセキュリティ情報を、New Relicで分析・可視化できる。(熱々!)

今回は特にSnyk連携に焦点を絞って、Snykから取得した脆弱性情報をダッシュボードで可視化しようと思います。

Snyk連携してみた

公式の方法では連携にAzure Functionを使っていますが、今回はAWS Lambdaを使って連携を行います。

方針

Snyk Webhookを使ってSnykプロジェクトとIssueの情報を取得し、取得した脆弱性情報をNew RelicセキュリティデータAPI経由でNew Relicに流します。

Snyk Webhookはプロジェクトがテストされる度にトリガーされ、前回テスト時からのIssueの差分が取得できます。 しかし、Snyk Webhookはプロジェクトの作成時にトリガーされないため、初回作成時のIssueを取得することができません。 そこで、以下の動作で初回作成時のIssueを取得できるようにします。

  1. Snyk Webhookがトリガーされる。
  2. DynamoDBに、トリガーされたプロジェクトのプロジェクトIDが記録されているか確認する。
    1. 記録されていた場合は、Issueの差分をNew Relicに送信する。
    2. 記録されていない場合は、Snykにプロジェクトの全Issueを問い合わせてNew Relicに送信する。DynamoDBにプロジェクトIDを記録する。

アーキテクチャ

アーキテクチャは以下のようになります。

手順

ソースコードはこれになります。cdk deploy でデプロイできます。

SSMパラメータストアのSecure Stringなパラメータはデプロイされないので以下のパラメータを手動で追加します。

パラメータ名
/SnykIntegration/SNYK_WEBHOOK_SECRET <ランダムな文字列>
/SnykIntegration/SNYK_ORGANIZATION_ID <取得対象となるSnykのOrganization ID>
/SnykIntegration/SNYK_API_KEY <SnykのAPIキー>
/SnykIntegration/NEW_RELIC_INSIGHTS_URL https://insights-collector.newrelic.com/v1/accounts/<New RelicのアカウントID>/events
/SnykIntegration/NEW_RELIC_LICENSE_KEY <New Relicのライセンスキー>

デプロイされたAPI GatewayのURLを確認します。

Snyk APIでWebhookを作成します。 URI ParameterとBodyに入れるパラメータの内容は以下の通りです。

パラメータ
orgId <取得対象となるSnykのOrganization ID>
url <前の手順で確認したAPI GatewayのURL>
secret </SnykIntegration/SNYK_WEBHOOK_SECRETに設定した値>

以上でSnyk連携は完了です。Snykプロジェクトのスナップショットが作成される度にNew Relicにプロジェクトの脆弱性情報が取り込まれます。

脆弱性情報をながめる

New Relicにログインして左ペインの All capabilityies > Security で脆弱性管理機能にアクセスできます。 Snyk連携により、脆弱性情報がNew Relicに取り込まれていることが確認できます。

Vulnerabilitiesタグを選択することで個々の脆弱性について調査をすることができます。

Entitiesタグを選択することで、各エンティティ(データの報告元)における脆弱性をスコアリングして一覧表示することができます。 また、各エンティティ名を押下することで、そのエンティティの脆弱性情報を参照することができます。

次に、Snyk用のダッシュボードを使って、Snykから集めた脆弱性情報を可視化します。

サマリーページに戻り、画面右のInstallを押下します。

次にDashboardsタグにあるSnyk Application Securityを選択してダッシュボードを作成します。

SnykのDashboardが作成されますが、なぜかSeverityまわりの可視化が上手くいっていないようです。

ウィジェットの編集を行います。Severity関連のウィジェットについて以下のような感じで修正を加えていきます。

Severityまわりの可視化ができました!

このようにSnyk連携機能を使うことで、SnykのデータをNew Relicのダッシュボードで可視化することができます。

まとめ

New RelicのSnyk連携機能を使って、Snykで管理している脆弱性情報をNew Relicに取り込み、New Relic上で脆弱性情報の管理をしてみました。 また、ダッシュボードを使ってSnykの脆弱性情報の可視化も行いました。

脆弱性管理機能はSnyk連携の他にも様々なセキュリティ関連の機能が追加されています。 引き続き新たなセキュリティ機能もリリースされていく予定のようなので、今後の情報も要チェックです。