Node.jsのセキュリティスキャンAPIを構築し、Platformatic Cloudにデプロイする
Matteo Collina
2024年1月5日
0 分で読めますこのガイドでは、PlatformaticとFastifyを組み合わせ、堅牢性とセキュリティを重視しながらバックエンドを迅速に開発する方法を紹介します。
Node.jsの経験豊富な開発者にも、これから始める方にも、この記事はPlatformaticなどのNode.js PaaS環境への理解を深めるのに役立ちます。Snykをワークフローにシームレスに統合して、コードに脆弱性やシークレットの漏えいがない状態を保つ方法と、Snyk APIを使ってセキュリティアプリケーションを構築する方法を解説します。
Platformaticとは何ですか?
Platformaticは、Node.jsでのAPIやバックエンドの構築・管理を効率化するクラウドホスティングプラットフォームです。Platformaticを使えば、ルーティング、データベース連携、認証などのタスクを簡素化するさまざまなツールや機能を活用して、開発者はスケーラブルで効率的なAPIを簡単に作成できます。Fastifyとの連携により、パフォーマンスと開発者エクスペリエンスがさらに向上します。
Fastifyとは?
Fastifyは、高いパフォーマンスと低いオーバーヘッドで知られる、Node.js向けのモダンなオープンソースWebフレームワークです。Expressを使った経験がある方なら、Fastifyに組み込まれた開発者体験や、軽量でありながら高機能な点に魅力を感じるでしょう。速度と効率を重視したFastifyは、シンプルで直感的なAPI、簡単なリクエストとレスポンスの処理に加え、スキーマベースのバリデーションとシリアライズを標準でサポートしています。
Platformaticは、包括的なツール一式を統合されたパッケージとして提供することで、Node.js開発者がバックエンドインフラストラクチャの細部に煩わされることなく、アプリケーションの中核機能の開発に集中できるようにします。
Platformatic serviceでNode.jsアプリケーションのひな形を作成する
まず、Node.jsアプリケーションを配置する新しいディレクトリを作成します。
次に、以下のnpmコマンドを実行してPlatformaticプロジェクトジェネレーターをインストールします。
このコマンドを実行すると、最新バージョンのplatformatic npmパッケージをダウンロードするか確認されます。
続いて、以下のプロンプトに回答し、新しいNode.js APIサービスのひな形を作成します。
これで、platformatic-serviceディレクトリにPlatformatic serviceプロジェクトが作成されます。プレーンなJavaScriptを使用し、GitHub Actionsとの統合に加えて、各PRでサービスの不変のスナップショットを提供するPlatformaticの連携型PRレビュー機能も備えています。
ディレクトリとファイルの構成は、次のようになります。
Node.js Platformatic serviceを起動する
生成されたPlatformatic serviceは、起動できる状態になっています。アプリを起動しましょう。まず、ディレクトリを変更します。
次に、以下を実行します。
生成されたNode.jsアプリケーションが起動し、ポート3042でHTTPリクエストを受け付けるようになりました。デフォルトのGET /エンドポイントでは、次の入門ガイドが表示されます。

このインデックスページは、Platformatic CLIによって提供されるもので、ローカル開発専用です。Node.jsアプリケーションサービスとともにデプロイされる、クライアント側のブラウザーコードには含まれません。
Platformatic serviceを詳しく見る
このNode.jsアプリケーションの仕組みをさらに理解するため、Platformaticの設定とディレクトリ構成を詳しく見ていきましょう。
platformatic.service.jsonでは、HTTPリクエストを待ち受けるポートや、読み込むプラグイン、ルート(これもプラグインとして定義)など、デプロイするPlatformatic service全体の設定を定義します。生成されたサービス設定ファイルは次のとおりです。
上記の設定では、pluginsに./routesが含まれており、APIルートを読み込むディレクトリを指定しています。
HTTPルートはroutes/root.jsファイルで定義されています。標準で用意されているサンプルでは、パスパラメーター/exampleに次のGETエンドポイントが設定されています。
次のHTTPリクエストをGET /exampleに送信して、動作を確認しましょう。
npmパッケージのセキュリティ脆弱性をテストする新しいルートを追加する
次に、ユーザーがパッケージ名とバージョンを入力すると、既知のセキュリティ脆弱性がないか検査できる機能を、Node.js APIに追加しましょう。
このチュートリアルのセクションで行う作業は次のとおりです。
Snyk CLIをインストールしてセットアップする
Snyk APIトークンを取得する
APIトークンを使ってSnyk APIにHTTPリクエストを送信する
Node.js Platformatic serviceに新しい
POST /test/vulnerabilitiesAPIエンドポイントを定義する
Snyk CLIをインストールしてセットアップし、APIトークンを取得する
Snyk CLIの利用は、npmパッケージをインストールするだけですぐに始められます。
Snykをnpmのグローバルパッケージとしてインストールすると、開発中のJavaScriptプロジェクトのコードやセキュリティに関するさまざまな項目をテストできるので便利です。さらに、SnykはPython、Java、Ruby、PHPなどの言語のコードや依存関係もテストできます。
次に、パッケージの脆弱性をAPIで照会できるよう、無料のSnykユーザーを作成します。次のコマンドを実行してください。
CLIの手順に従ってください。完了したら、snyk configコマンドを実行してAPIトークンを取得できます。このコマンドはAPI設定キーを返します。
APIトークンは、すぐ使えるよう手元に保存しておきましょう(誤ってインターネット上に漏えいしないよう十分注意してください)。
これで、コードと依存関係のセキュリティ脆弱性をテストする準備ができました。この機会に、Node.js Platformatic Serviceアプリケーションもテストしてみましょう。
脆弱性ゼロのプロジェクトツールをリリースしたPlatformaticチームに拍手を送りましょう。
Snyk CLIの使用方法について詳しくは、Snyk User Docsと、便利なSnyk CLI Cheat Sheetをご覧ください。
POST /test/vulnerabilities Node.js APIエンドポイントを定義する
routes/root.jsファイルを開き、既存のfastify.get()コードの直後に、新しいFastify APIルートの宣言を追加します。
このコードでは、Snyk v1 APIエンドポイントを使用してnpmパッケージの脆弱性をチェックするAPIエンドポイントを設定します。各部分を順に見ていきましょう。
まず、Fastifyのルート作成です。
この行は、/test/vulnerabilitiesに新しいPOSTエンドポイントを作成します。ここでは、高速かつ軽量なNode.js向けWebフレームワークであるFastifyを使用しています。asyncキーワードは、この関数が非同期処理を実行できることを示します。
次に、HTTPリクエストからクエリパラメーターを取り出します。
これらのパラメーターで、ユーザーが脆弱性をチェックしたいnpmパッケージとそのバージョンを指定します。
次の部分でSnyk APIと連携します。
パッケージ名と明示的なバージョン番号を使って、Snyk APIエンドポイントのURLを組み立てます(タグは使用できないため、「latest」はサポートされません)。次に、リクエストヘッダーに認証トークンを指定し、Snyk APIに非同期でfetchリクエストを送信します。これはsnyk configコマンドで取得したAPIトークンです。
最後に、指定したnpmパッケージで見つかった脆弱性をエンドポイントから返します。レスポンスに問題が含まれないケースに対応するため、オプショナルチェーン演算子(?.)を使用しています。
最後に、リクエストとレスポンスのスキーマを定義すれば、POST /test/vulnerabilitiesエンドポイントのFastifyルート定義をさらに改善できます。入力検証を追加できるほか、OpenAPIのAPIルートドキュメントにも自動的に反映されます。Platformatic DBでREST APIを構築する方法については、Platformatic movie app tutorialとSimon Plenderleith blog postを参考にしてください。
APIキーなどの機密情報を漏えいさせないよう注意してください。
APIトークンをコードに直接書き込んでいたことに気付きましたか?これは絶対に避けるべきことです。
もちろん見落としてはいません。VS Code IDEにSnyk拡張機能をインストールしているので、シークレット検出が自動的に有効になり、自分のコードにセキュリティ脆弱性を招く可能性のある問題があれば警告してくれます。

VS Code IDEからSnyk拡張機能を直接インストールするか、詳しくはVS Code MarketplaceのSnyk extensionsをご覧ください。
では、シークレット検出のアラートを受けて、認証情報の漏えいを修正しましょう。まず、.envに新しい環境変数を定義し、「1234」を自分のSnyk APIトークンに置き換えます。
次に、platformatic.service.json設定ファイルで、配列内にある既存の./routes文字列キーを、optionsキーを受け取るオブジェクトに変更して追加します。
npm run startを使ってNode.js Platformatic Serviceを実行している場合、このコマンドを再実行する必要はありません。自動再読み込みに対応しているため、ルートやプラグインファイルを保存するたびにサーバーコードが更新されます。
新しいNode.js API serviceを使ってnpmパッケージのセキュリティ脆弱性をテストする
SnykとNode.js Platformatic API Serviceの連携ができたので、すべてが正しく動作することを確認しましょう。
信頼できないコードを実行する際にセキュリティサンドボックスとして使う開発者もいるvm2 npmパッケージの最新版が安全かどうかをテストしてみましょう。
次のHTTPリクエストでは、パッケージ名とnpmjsレジストリに登録されている最新バージョンを指定し、結果をjqツールに渡して整形済みのJSONレスポンスを表示します。
動作しましたね。SnykとPlatformaticを使って初めてのセキュリティツールを構築できました。おめでとうございます。
引き続き、このWebアプリケーションのフロントエンドを構築し、Node.js APIをPlatformatic Cloudにデプロイしましょう。
セキュリティ脆弱性をスキャンするVueフロントエンドアプリケーション
このセクションでは、Platformatic serviceで構築したNode.jsバックエンドAPIと通信するフロントエンドWebアプリケーションの基本要素を確認します。

フロントエンドWebアプリケーションは、次の要素で構成されています。
Vue.js 3 + Viteのクライアントサイドフロントエンド
Tailwind CSS
フロントエンドは、パッケージ名とバージョンを入力するテキストフィールドを備えたシンプルなフォームで、入力内容はNode.js Platformatic APIに送信されます。
以下は、ローカルで実行中のlocalhost:3042のNode.js serviceと通信する、シンプルなVue.jsフォームです。
フロントエンドWebアプリケーションのコード全文は、こちらのGitHubリポジトリをご覧ください。https://github.com/lirantal/pkg-probe
Node.jsバックエンドAPIをPlatformatic Cloudにデプロイする
Platformatic Cloudは、Node.jsアプリケーションのホスティングに最適な、特化型のPaaS(Platform as a Service)です。Platformaticの優れたツールに加えて、同社のクラウド環境を使ってセキュリティスキャンWebアプリケーションをホストし、インターネットからアクセスできるようになりました。
ランディングページでConnect with GitHubボタンを使ってサインインし、GitHubアプリの連携を承認して、利用規約とプライバシーポリシーに同意します。これで、ダッシュボードのCreate an appをクリックする準備ができました。
![組織とリポジトリのドロップダウン、[次へ]ボタンが表示された、GitHubリポジトリのステップのPlatformaticインポート画面](https://res.cloudinary.com/snyk/image/upload/f_auto,w_2560,q_auto/v1704486400/blog-platformic-import.jpg)
このデフォルトのワークフローでは、新しいPlatformaticサンプルアプリケーションが作成されます。しかし、すでにアプリケーションがあるので、ここに表示される手順画面の下部にあるDo it manuallyリンクをクリックしてください。
次に、アプリケーション名とワークスペース名を設定します。現時点ではCLIからNode.jsアプリケーションをデプロイするために自動PRレビューは必要ないので、Dynamic Workspaceはオフのままにしてください。
次のようなPlatformaticの概要画面が表示されます。

ワークスペースIDとAPIキーが取得できたので、それらを使ってNode.jsバックエンドアプリケーションをPlatformatic Cloudのホスティング環境にデプロイできます。
ワークスペースIDとAPIキーを用意したら、プロジェクトのplatformatic-serviceディレクトリに移動して、Node.js APIのソースコードからnpmライフサイクルコマンドを実行します。次のnpm run deployコマンドを実行し、Platformatic Cloudのワークスペース情報を入力してください。
コマンドの実行が完了すると、Node.js APIのデプロイ先URLも表示されます。たとえば、次のようなURLです。https://something-something-funny.deploy.space
Platformatic Cloudのダッシュボード(https://platformatic.cloud)に戻ると、新しいセキュリティスキャンアプリケーションが作成されていることを確認できます。

アプリケーションを開くと、パフォーマンス指標などのリアルタイムのステータスや、アプリケーションにアクセスするための公開URLを確認できます。

最後に、Platformaticを利用するNode.js APIで必要な設定が1つ残っています。CORSを有効にしましょう。
CORSとは何ですか?
クロスオリジンリソース共有(CORS)は、異なるオリジン間でリソースを共有する方法を管理するために、Webブラウザに実装されているセキュリティ機能です。オリジンとは通常、異なるドメイン、プロトコル、ポートを指します。バックエンドアプリケーションにおいてCORSは、サーバーのデータを別のオリジンのWebページと共有できるかどうか、また共有する場合はどのように共有するかを制御する重要な機能です。CORSがなければ、APIやその他のクロスオリジンリソースに依存する最新のWebアプリケーションは、深刻な制約に直面することになります。
CORSが重要なのはなぜですか?
このポリシーにより、Webページがそのページを配信したドメイン以外にリクエストを送信できなくなり、クロスサイトスクリプティング(XSS)攻撃など、特定の種類のサイバーセキュリティ脅威を防ぎます。一方、CORSでは、サーバー上のリソースへのアクセスを許可するドメインを指定することで、安全かつ制御されたアクセスを実現できます。これにより、複数のオリジンのリソースと安全に連携する、リッチでインタラクティブなWebアプリケーションを開発できます。
Node.js APIにCORS設定を追加しましょう。.envファイルを開いて、次のPlatformatic CORS設定を追加します。
この設定例では、localhostで実行されているVue.jsのローカル開発サーバーのポートが指定されています。フロントエンドをNetlifyやVercelなどのクラウドホスティング環境にデプロイする場合は、それに合わせて設定してください。
次に、platformatic.service.jsonのserver設定ディレクティブを更新し、以下も含めます。
成功
これで完了です!
これで、Snyk APIを使ってセキュリティの脆弱性をスキャンするNode.js Webアプリケーションを構築し、Platformatic Cloudのホスティング環境にデプロイして一般公開できました。
JavaScriptアプリのセキュリティ対策を始めましょう
Snykを無料で利用して、JavaScriptの脆弱性を検出・修正しましょう。
クレジットカードは不要です。
またはAzure AD Docker ID Bitbucketで登録
Snykを利用することで、利用規約およびプライバシーポリシーを含む当社の各種ポリシーに同意したものとみなされます。



