CLIから始めるJavaScriptアプリケーションのセキュリティ対策
Gideon Idoko
2023年10月24日
0 分で読めますSnykの2022年オープンソースセキュリティの現状レポートによると、JavaScriptプロジェクトには平均49件の脆弱性があり、安全でない依存関係、クロスサイトスクリプティング(XSS)、不十分な入力検証、クロスサイトリクエストフォージェリ(CSRF)などが含まれます。JavaScriptが広く使われていることを考えると、サイバー攻撃からアプリケーションを守るための強固なセキュリティ対策がますます重要になっています。開発中にこうした対策を実施することは不可欠ですが、早い段階から取り組むことも同じくらい重要です。CLIから始めれば、そのプロセスをより簡単に進められます。
そこでこの記事では、Snyk CLIを使ってJavaScriptアプリケーションを保護する手順をご紹介します。
Snyk CLIとは?
Snyk CLIは、アプリケーション、コンテナ、Infrastructure as Code(IaC)をスキャンして、セキュリティ上の脆弱性を検出・監視できる強力なツールです。開発ワークフローにシームレスに統合できるため、ローカル環境でも継続的インテグレーション/継続的デリバリー(CI/CD)パイプラインでも実行できます。これにより、開発プロセスの早い段階から、セキュリティ上の懸念に先回りして対処できます。
Snyk CLIでJavaScriptプロジェクトをスキャンすると、プロジェクトの依存関係を膨大な脆弱性データベースと照合し、問題があれば報告します。また、問題の修正方法についても情報を提供します。脆弱なパッケージを安全なバージョンにアップグレードする方法や、脆弱性のない別のパッケージを利用する方法などが提示されます。
開発中にSnyk CLIを使うメリット
Snyk CLIを使うことで、プロジェクトのセキュリティ、信頼性、リリース速度を向上できます。主なメリットをいくつかご紹介します。
コードと依存関係のセキュリティスキャン:Snyk CLIはコードベースと依存関係をスキャンして、既知のセキュリティ脆弱性を検出します。また、深刻度や推奨される修正方法など、セキュリティ上の問題に関する詳細情報を提供します。
脆弱性の早期検出:Snyk CLIを使えば、開発ライフサイクルの早い段階で脆弱性を検出できるため、より少ないコストと労力で迅速に対処できます。
脆弱性への対処方法を提示:脆弱性を特定するだけでなく、脆弱な依存関係の更新や代替ライブラリを提案するため、特定された問題を簡単に修正できます。
コンプライアンス要件とベストプラクティスへの対応:ベストプラクティスに準拠しながら、Snyk CLIが生成するレポートを使ってセキュリティ監査を実施し、コンプライアンスを評価できます。
言語とエコシステムのサポート:さまざまなプログラミング言語に対応しているため、Java、Python、.NET、Ruby、PHPなど、幅広いプロジェクトをテストできます。多様な言語を扱うチームに最適です。
開発者にとって使いやすい操作性:Snyk CLIは直感的なターミナルコマンドを備えているため、開発者はセキュリティチェックを開発ワークフローに簡単に組み込めます。CLIに加え、プラグインや拡張機能を使ってIDEからSnykを利用することもできます。
Snyk CLIのインストール方法
Snyk CLIをマシンにインストールする方法はいくつかあります。スタンドアロン実行ファイルを使う方法のほか、macOS向けのHomebrewやWindows向けのScoopなどのパッケージマネージャーを利用できます。
ただし、JavaScriptアプリケーションでSnyk CLIを使う場合は、npmまたはYarnでグローバルインストールするのが最も簡単です。すでにNode.jsがインストールされている可能性が高いためです。Node.jsのバージョンが12以降であることを確認し、次のコマンドを実行してSnyk CLIをnpmパッケージとしてグローバルにインストールしてください。
または、次のコマンドを実行してYarnでグローバルにインストールすることもできます:yarn global add snyk。詳しくはSnyk CLIのインストールガイドをご覧ください。
Snyk CLIでJavaScriptの脆弱性に対処する方法
Snyk CLIをインストールしたら、サンプルのJavaScriptプロジェクトをテストして、利用できる機能を確認しましょう。
サンプルのJavaScriptプロジェクトをローカル環境にセットアップする
Snyk CLIでプロジェクトのテストをすぐに始められるよう、必要なマニフェストファイルを含むサンプルのJavaScriptプロジェクトをこちらのGitHubリポジトリで公開しています。このプロジェクトは、依存関係としてLodashとExpressを使用するシンプルな引用句APIです。引用句APIには、引用句の一覧を返すGET /エンドポイントと、ランダムな引用句を返すGET /randomエンドポイントがあります。
このプロジェクトでは、コンテナ化にDocker、インフラストラクチャの一部にKubernetesを使用しています。ローカルマシンにDockerとKubernetesをセットアップする最も簡単な方法は、Docker Desktopをインストールし、設定でKubernetesを有効にすることです。

サンプルのJavaScriptプロジェクトをセットアップするには、リポジトリをローカルマシンにクローンします。
次に、プロジェクトのディレクトリに移動して、依存関係をインストールします。
プロジェクトのJavaScriptコードはserver.jsファイルにあります。npm startを実行して、ポート3000でアプリを起動します。

次に、以下のDockerコマンドを実行して、アプリのコンテナを作成・起動します。
このコマンドは、DockerfileからvulnnodeというDockerイメージをビルドして実行し、ポート4000でコンテナを公開します。
最後に、アプリ用のKubernetesリソースを作成します。
このコードはkube.ymlマニフェストファイルを使い、ポート5000でアプリを利用できるようにします。これでセットアップは完了です。プロジェクトのスキャンに進みましょう。
マシンを認証する
Snyk CLIを使うにはSnykアカウントとの連携が必要なため、使用前にマシンを認証する必要があります。アカウントをお持ちでない場合は、手順に沿って進められるようSnykの無料アカウントに登録してください。ログインしたら、ターミナルを開いて次のコマンドでSnyk CLIを認証します。
ブラウザーでWebページが開きます。Authenticateボタンをクリックすると、Snyk CLIの認証が完了します。
この認証方法がうまくいかない場合は、APIトークンを直接使用できます。Account Settings > General > API Tokenに移動して、APIトークンをコピーします。次に、ターミナルで以下を実行してトークンを使って認証します。
アカウントが認証され、CLIを使用できる状態になったことを示すメッセージが表示されます。JavaScriptプロジェクトのテストに役立つSnyk CLIコマンドを見ていきましょう。
snyk test
snyk testコマンドは、オープンソースソフトウェアにセキュリティやライセンス上の問題がないかを確認します。プロジェクトの依存関係を分析し、依存関係に既知の脆弱性がないかを特定します。また、脆弱性の種類、説明、脆弱なファイルのパス、対処方法などの情報も報告します。
snyk testを実行すると、Snyk CLIは依存関係を含むマニフェストファイル(セットアップしたプロジェクトのpackage.jsonファイルなど)を自動的に検出してテストします。注:Snykは脆弱性をテストするためにローカルの依存関係を参照するため、セットアップ時にプロジェクトの依存関係をダウンロードしました。
プロジェクトをスキャンするには、同じディレクトリでテストコマンドを実行します。
次のような出力が表示されます。

Snykはプロジェクトの依存関係をテストし、問題を検出して報告しました。報告には、問題ID、深刻度、詳細を確認できるリンクなど、問題の説明が含まれています。
すべての問題はアップグレードで修正できる問題のセクションにまとめられています。つまり、問題に関連付けられたライブラリを更新することで、1つ以上の脆弱性を解消できます。これらの問題の詳しい修正方法は、後ほど説明します。
テストで検出された問題は、次のようなセクションにも分類されます。
パッチ適用可能な問題とは、問題を修正する更新版はないものの、回避策としてパッチを適用できる問題です。
直接アップグレードまたはパッチで修正できない問題とは、問題を修正する更新版やパッチがない問題です。依存関係をそのまま使用するか、別のものに置き換えるかを判断できます。
注:出力をJSONファイルに保存するには、Snyk CLIのコマンドに--json-file-output=./path/to/file.jsonフラグを追加します。
CI/CDパイプラインでは、プロジェクトに脆弱性が含まれる場合にパイプラインを停止するsnyk testを実行できます。つまり、テストコマンドの終了コードが0以外になります。
snyk monitor
snyk monitorコマンドを実行すると、プロジェクトのスナップショットが作成され、データがSnykに送信されます。snyk monitorはsnyk testの代わりではない点に注意してください。主な目的はスナップショットを作成し、時間の経過とともに追跡することです。本番環境にデプロイする前に活用できる便利なツールです。また、プロジェクトに関連する新たな脆弱性や修正方法が見つかると、希望する連絡方法で通知が届きます。
スナップショットを正しい場所に保存するため、組織(--org)やプロジェクト名(--project-name)などの追加情報を指定することをおすすめします。
snyk monitorの動作を確認するには、次のコマンドを実行します。
<YOUR_ORG>を、プロジェクトのスナップショットを保存する組織に置き換えます。コマンドを実行すると、次のように応答にスナップショットへのリンクが表示されます。

リンクをクリックして、Snykダッシュボードでスナップショットを確認します。

snyk ignore
脆弱性を修正するパッチや更新版が存在しない場合や、アプリでその脆弱性を悪用できないと判断した場合があります。そのようなときは、指定した期間にわたって脆弱性を無視するようSnykに指示できます。snyk ignoreコマンドを使うと、すぐに修正できない既知の問題や、プロジェクトの状況に関係のない誤検知を管理できます。
snyk ignoreを使うには、脆弱性IDで問題を特定する必要があります。脆弱性IDはsnyk testコマンドの出力から確認できます。たとえば、このプロジェクトで使用しているLodashパッケージに関連する正規表現サービス拒否(ReDoS)脆弱性のIDはSNYK-JS-LODASH-1018905です。次のコマンドを実行すると、この脆弱性を無視できます。
ここでは、--expiryフラグで問題を無視する期間を指定し、--reasonフラグで無視する理由を指定します。このコマンドは、脆弱性に関する情報を含む.snykポリシーファイルをルートディレクトリに作成します。これにより、今後snyk testを実行したときに脆弱性が報告されなくなります。
snyk container
Snyk CLIには、ローカルまたはリモートのコンテナイメージ(Dockerイメージなど)に既知の脆弱性がないかをテスト・監視するコンテナコマンド(testとmonitor)が2つあります。どちらのコマンドも構文は次のとおりです。
セットアップ時にvulnnodeというイメージをビルドしたので、次のコマンドでテストします。
次のような出力が表示されます。

検出された問題の修正方法は、この記事の後半でご紹介します。snyk monitorコマンドと同様に、次のコマンドを実行するとvulnnodeコンテナイメージを監視し、スナップショットを取得できます。
snyk iac
IaCでは、クラウドリソース、ネットワーク、設定を手作業でセットアップするのではなく、コードを通じて管理・プロビジョニングします。snyk iacコマンドは設定ファイル内のセキュリティ上の脆弱性を特定します。これにより、設定ミスがセキュリティリスクになる前に対処できます。
次のコマンドでKubernetesのIaCファイルをスキャンします。
次のような出力が表示されます。

JavaScriptプロジェクトのスキャンが完了したので、検出された問題を修正する方法を見ていきましょう。
JavaScriptプロジェクトのセキュリティ問題を修正する
snyk testコマンドを実行すると、Snyk CLIの出力に表示された問題は、expressをv4.17.1からv4.18.2に、lodashをv4.17.4からv4.17.21にアップグレードすることで修正できると示されます。package.jsonでバージョンを更新し、npm installを実行して再インストールします。
再インストール後、もう一度snyk testを実行すると、次のような出力が表示されます。

これで、プロジェクトの脆弱性を解決する作業は完了です。注:Gitリポジトリをapp.snyk.io経由でSnykに接続すると、Snykはpackage.jsonのマニフェストファイルにあるセキュリティ問題を修正する依存関係の更新を含むプルリクエストを自動的に作成します。
snyk container testコマンドで検出される問題は、イメージ内のアプリと使用されているベースイメージに起因します。

現在のベースイメージには、重大な問題が1件、高優先度の問題が4件、中優先度の問題が3件あります。悪用された場合、アプリに深刻な影響を及ぼす可能性があるため、重大および高優先度の問題はすぐに解消することをおすすめします。
コンテナの問題を修正するには、Dockerfileでベースイメージを、node:20.5-bookworm-slimなどの推奨イメージにアップグレードします。
注:Gitリポジトリをapp.snyk.io経由でSnykに接続すると、Snykはセキュリティ問題を修正するDockerfileの更新を含むプルリクエストを自動的に作成します。あとはマージするだけです。
次のコマンドを使ってコンテナイメージを再ビルドします。
コンテナのテストを再実行すると、今度は次のような出力が表示されます。

この修正により、重大および高優先度の問題が解消されました。残っている28件の問題はすべて優先度が低いため、そのまま対応を進めても問題ありません。
最後に、snyk iac testコマンドで検出される問題は、kube.ymlのマニフェストファイルに含まれていない設定の一部に起因します。

ここで検出された問題の優先度は中です。Snyk CLIが提案する修正方法を使って、そのうち2件を修正してみましょう。kube.ymlファイルを開き、コンテナを更新します。
snyk iac test kube.ymlをもう一度実行すると、次の結果が表示されます。

これで問題は2件に減り、どちらも優先度が中のため無視できます。
まとめ
この記事では、Snyk CLIでスキャンして脆弱性を特定し、JavaScriptアプリを保護する方法を学びました。
ターミナルが好きですか?Snyk CLIを使えば、コード、アプリケーション、コンテナ、IaCファイルを簡単に保護できます。Snyk CLIは、既存の開発ワークフローにシームレスに統合しながら、潜在的な脅威からプロジェクトを守る、開発者にとって頼もしい味方です。今すぐ無料で登録。
JavaScriptアプリのセキュリティ対策を始めましょう
Snykを無料で利用して、JavaScriptの脆弱性を検出・修正しましょう。
クレジットカードは不要です。
またはAzure AD Docker ID Bitbucketで登録
Snykを利用することで、利用規約およびプライバシーポリシーを含む当社の各種ポリシーに同意したものとみなされます。



