Skip to main content

CLIから始めるJavaScriptアプリケーションのセキュリティ対策

著者
Headshot of Gideon Idoko

Gideon Idoko

feature secure js cli

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パッケージとしてグローバルにインストールしてください。

npm i -g snyk

または、次のコマンドを実行して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を有効にすることです。

Docker Desktopの設定でKubernetesが開かれており、バージョン1.25.4、有効になったKubernetes、「適用して再起動」ボタンが表示されています。

サンプルのJavaScriptプロジェクトをセットアップするには、リポジトリをローカルマシンにクローンします。

git clone https://github.com/IamGideonIdoko/vulnnode.git

次に、プロジェクトのディレクトリに移動して、依存関係をインストールします。

cd vulnnode

npm install

プロジェクトのJavaScriptコードはserver.jsファイルにあります。npm startを実行して、ポート3000でアプリを起動します。

localhost:3000でJSON APIのレスポンスを表示するダークテーマのブラウザーウィンドウ。成功メッセージと、取得した引用文および著者名が表示されています。

次に、以下のDockerコマンドを実行して、アプリのコンテナを作成・起動します。

docker compose up --detach app

このコマンドは、DockerfileからvulnnodeというDockerイメージをビルドして実行し、ポート4000でコンテナを公開します。

最後に、アプリ用のKubernetesリソースを作成します。

kubectl create -f kube.yml 

このコードはkube.ymlマニフェストファイルを使い、ポート5000でアプリを利用できるようにします。これでセットアップは完了です。プロジェクトのスキャンに進みましょう。

マシンを認証する

Snyk CLIを使うにはSnykアカウントとの連携が必要なため、使用前にマシンを認証する必要があります。アカウントをお持ちでない場合は、手順に沿って進められるようSnykの無料アカウントに登録してください。ログインしたら、ターミナルを開いて次のコマンドでSnyk CLIを認証します。

snyk auth

ブラウザーでWebページが開きます。Authenticateボタンをクリックすると、Snyk CLIの認証が完了します。

この認証方法がうまくいかない場合は、APIトークンを直接使用できます。Account Settings > General > API Tokenに移動して、APIトークンをコピーします。次に、ターミナルで以下を実行してトークンを使って認証します。

snyk auth <YOUR_API_TOKEN>

アカウントが認証され、CLIを使用できる状態になったことを示すメッセージが表示されます。JavaScriptプロジェクトのテストに役立つSnyk CLIコマンドを見ていきましょう。

snyk test

snyk testコマンドは、オープンソースソフトウェアにセキュリティやライセンス上の問題がないかを確認します。プロジェクトの依存関係を分析し、依存関係に既知の脆弱性がないかを特定します。また、脆弱性の種類、説明、脆弱なファイルのパス、対処方法などの情報も報告します。

snyk testを実行すると、Snyk CLIは依存関係を含むマニフェストファイル(セットアップしたプロジェクトのpackage.jsonファイルなど)を自動的に検出してテストします。注:Snykは脆弱性をテストするためにローカルの依存関係を参照するため、セットアップ時にプロジェクトの依存関係をダウンロードしました。

プロジェクトをスキャンするには、同じディレクトリでテストコマンドを実行します。

snyk test

次のような出力が表示されます。

`snyk test`のターミナル出力。51件のJavaScript依存関係に9件の問題と10件の脆弱なパスがあることを報告しています。

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の動作を確認するには、次のコマンドを実行します。

snyk monitor --file=package.json  --project-name=vulnnode --org=<YOUR_ORG>

<YOUR_ORG>を、プロジェクトのスナップショットを保存する組織に置き換えます。コマンドを実行すると、次のように応答にスナップショットへのリンクが表示されます。

プロジェクトのスナップショットURL、依存関係の問題に関する通知、実行時間を示すSnyk monitorコマンドのターミナル出力。

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

Snykのプロジェクトダッシュボードに、深刻度の高いLodashのプロトタイプ汚染とqsのプロトタイプポイズニングの脆弱性が表示されており、スコアはそれぞれ731と696です。

snyk ignore

脆弱性を修正するパッチや更新版が存在しない場合や、アプリでその脆弱性を悪用できないと判断した場合があります。そのようなときは、指定した期間にわたって脆弱性を無視するようSnykに指示できます。snyk ignoreコマンドを使うと、すぐに修正できない既知の問題や、プロジェクトの状況に関係のない誤検知を管理できます。

snyk ignoreを使うには、脆弱性IDで問題を特定する必要があります。脆弱性IDはsnyk testコマンドの出力から確認できます。たとえば、このプロジェクトで使用しているLodashパッケージに関連する正規表現サービス拒否(ReDoS)脆弱性のIDはSNYK-JS-LODASH-1018905です。次のコマンドを実行すると、この脆弱性を無視できます。

snyk ignore --id=SNYK-JS-LODASH-1018905 --expiry=2023-07-27 --reason="Not that severe"  

ここでは、--expiryフラグで問題を無視する期間を指定し、--reasonフラグで無視する理由を指定します。このコマンドは、脆弱性に関する情報を含む.snykポリシーファイルをルートディレクトリに作成します。これにより、今後snyk testを実行したときに脆弱性が報告されなくなります。

snyk container

Snyk CLIには、ローカルまたはリモートのコンテナイメージ(Dockerイメージなど)に既知の脆弱性がないかをテスト・監視するコンテナコマンド(testとmonitor)が2つあります。どちらのコマンドも構文は次のとおりです。

snyk container test <image>:<tag>
snyk container monitor <image>:<tag>

セットアップ時にvulnnodeというイメージをビルドしたので、次のコマンドでテストします。

snyk container test vulnnode

次のような出力が表示されます。

vulnodeに対するSnyk Containerのテスト結果を表示するターミナル。OpenSSL/libcryptoに複数の中程度の深刻度の脆弱性があり、修正バージョンが示されています。

検出された問題の修正方法は、この記事の後半でご紹介します。snyk monitorコマンドと同様に、次のコマンドを実行するとvulnnodeコンテナイメージを監視し、スナップショットを取得できます。

snyk container monitor vulnnode

snyk iac

IaCでは、クラウドリソース、ネットワーク、設定を手作業でセットアップするのではなく、コードを通じて管理・プロビジョニングします。snyk iacコマンドは設定ファイル内のセキュリティ上の脆弱性を特定します。これにより、設定ミスがセキュリティリスクになる前に対処できます。

次のコマンドでKubernetesのIaCファイルをスキャンします。

snyk iac test kube.yml

次のような出力が表示されます。

kube.yml の Snyk Infrastructure as Code のテスト結果を示すターミナル出力。重大度の低い Kubernetes セキュリティ問題が4件表示されています。

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を実行すると、次のような出力が表示されます。

Snykのテスト端末の出力。npmプロジェクトで51件の依存関係をテストし、脆弱なパスは見つかりませんでした。

これで、プロジェクトの脆弱性を解決する作業は完了です。注:Gitリポジトリをapp.snyk.io経由でSnykに接続すると、Snykはpackage.jsonのマニフェストファイルにあるセキュリティ問題を修正する依存関係の更新を含むプルリクエストを自動的に作成します。

snyk container testコマンドで検出される問題は、イメージ内のアプリと使用されているベースイメージに起因します。

依存関係の脆弱性と、Node.jsのベースイメージのアップグレードに関する推奨事項を一覧表示したターミナル出力。

現在のベースイメージには、重大な問題が1件、高優先度の問題が4件、中優先度の問題が3件あります。悪用された場合、アプリに深刻な影響を及ぼす可能性があるため、重大および高優先度の問題はすぐに解消することをおすすめします。

コンテナの問題を修正するには、Dockerfileでベースイメージを、node:20.5-bookworm-slimなどの推奨イメージにアップグレードします。

+ FROM node:20.5-bookworm-slim AS development
- FROM node:16.15-alpine3.14 AS development

WORKDIR /app

# …

注:Gitリポジトリをapp.snyk.io経由でSnykに接続すると、Snykはセキュリティ問題を修正するDockerfileの更新を含むプルリクエストを自動的に作成します。あとはマージするだけです。

次のコマンドを使ってコンテナイメージを再ビルドします。

docker compose build app

コンテナのテストを再実行すると、今度は次のような出力が表示されます。

vulnnode Dockerイメージのセキュリティスキャン結果。低深刻度のlibapt-pkg6.0の脆弱性を含む、28件の依存関係の問題が表示されています。

この修正により、重大および高優先度の問題が解消されました。残っている28件の問題はすべて優先度が低いため、そのまま対応を進めても問題ありません。

最後に、snyk iac testコマンドで検出される問題は、kube.ymlのマニフェストファイルに含まれていない設定の一部に起因します。

ターミナルのセキュリティスキャンで、Kubernetesの権限昇格に関する問題が報告され、合計8件(中程度4件、低程度4件)の問題が要約されています。

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

#...      
    spec:
      containers:
      - name: nodeserver
        image: vulnnode:latest
        ports:
        - containerPort: 3000
        imagePullPolicy: Never
        resources:
          requests:
            memory: "64Mi"
            cpu: "500m"
          limits:
            memory: "256Mi"
            cpu: "500m"
        securityContext:
          runAsNonRoot: true
          allowPrivilegeEscalation: false

# …

snyk iac test kube.ymlをもう一度実行すると、次の結果が表示されます。

中程度の深刻度のKubernetesの問題が2件と、問題が合計6件あるテスト概要を示すセキュリティスキャンレポート。

これで問題は2件に減り、どちらも優先度が中のため無視できます。

まとめ

この記事では、Snyk CLIでスキャンして脆弱性を特定し、JavaScriptアプリを保護する方法を学びました。

ターミナルが好きですか?Snyk CLIを使えば、コード、アプリケーション、コンテナ、IaCファイルを簡単に保護できます。Snyk CLIは、既存の開発ワークフローにシームレスに統合しながら、潜在的な脅威からプロジェクトを守る、開発者にとって頼もしい味方です。今すぐ無料で登録。

JavaScriptアプリのセキュリティ対策を始めましょう

Snykを無料で利用して、JavaScriptの脆弱性を検出・修正しましょう。

クレジットカードは不要です。

またはAzure AD Docker ID Bitbucketで登録

Snykを利用することで、利用規約およびプライバシーポリシーを含む当社の各種ポリシーに同意したものとみなされます。

続きを読む

blog feature snyk container custom base recommendations
Blog

Evo Agentic AppSecのご紹介:AI開発のスピードに対応するセキュリティ

AI駆動型開発のスピードに、従来のセキュリティワークフローは追いついていません。SnykのAgentic AppSecは、セキュリティエージェントが脆弱性を継続的に検出、修正、検証し、人が基準を定められるようにします。

blog feature ai violet
Blog

VulnBump:AIエージェントはビルドを壊さずに脆弱な依存関係を修正できるか?

VulnBumpは、実際の依存関係アップグレード307件を対象にAIエージェントをテストします。脆弱性が解消され、ビルドとテストが成功した場合にのみ、修正としてカウントされます。

Blog

フロンティアモデルは脆弱性を発見した。攻撃者だけがエクスプロイトチェーンを見つけた。

静的解析で欠陥は見つかりましたが、ライブ攻撃テストで侵害につながる連鎖を実証できたのは唯一でした。Evo COS、Claude Security、Claude Code Securityを比較します。