Skip to main content

サーバーレスは便利。でも、AWS Lambda関数とその依存関係のセキュリティはどうすればよいのでしょうか?

著者

2019年7月3日

0 分で読めます

Function as a Service(FaaS)プラットフォームは、OSの依存関係にはパッチを適用してくれますが、npm、PyPI、Mavenなどから取得するアプリケーションの依存関係は保護してくれません。これらのライブラリはOSの依存関係と同じくらい広く使われ、同じように脆弱性を抱えています。アプリケーションの所有者である皆さんには、脆弱性が公表された際に、これらをアップグレードまたは修正する責任があります。

さらに、クラウドプロバイダーが管理するサーバーのOSレベルの依存関係には迅速にパッチが適用されることを攻撃者は知っているため、アプリケーションのコードや依存関係に狙いを定めます。

関数の依存関係を追跡する複雑さを示すため、Snykは最近のState of Open Source Security report 2019で、間接依存関係のセキュリティ脆弱性が脆弱性全体の78%を占めることを明らかにしました。

PyPI、PHP Packagist、Maven Central、RubyGems、npmにおける直接依存関係と間接依存関係の割合を示す積み上げ棒グラフ。

つまり、セキュリティ脆弱性の大半は、最上位の依存関係によってインストールされる間接依存関係に見つかります。npmエコシステムでは、依存関係の平均ネスト数は4階層を超えるため、依存関係とそのセキュリティを追跡するのは容易ではありません。

サーバーレスではないアプリケーションの開発と同様に、開発ライフサイクル全体を通して関数を保護する必要があります。まず、開発中に必要な依存関係の脆弱性を知らせてくれるプラグインを、VSCodeやIntelliJなどの統合開発環境(IDE)で利用しましょう。次に、ビルド時とデプロイ前にCIでセキュリティテストを実施します。

脆弱性が見つかったときに修正用のプルリクエストを自動で作成したり、新たな脆弱性が持ち込まれた場合にデプロイを防ぐためCIビルドを失敗させたりできる、セキュリティテストツールがあったらどうでしょうか?

以前の投稿10 Serverless Security Best Practicesでサーバーレスセキュリティについてさらに詳しく紹介しています。後でぜひご覧ください。それでは、私自身のサーバーレスプロジェクトの話を続けましょう。

AWS上のサーバーレス関数をセキュリティテストする方法

サーバーレスプラットフォームでは、デプロイ済みの関数の依存関係にあるセキュリティ上の問題を監視するのは難しい場合があります。Node.jsで開発し、AWS Lambdaにデプロイした個人のサーバーレスプロジェクトで、Snykを使ってどのように対処しているか、簡単にご紹介します。

関数の依存関係にある脆弱性を検出して自動修正するには、まずSnykを接続し、任意のGitリポジトリと連携します。

自分の個人リポジトリで試してみました。GitHubのリポジトリを確認して、サーバーレスプロジェクトのbazzを見つけました。プロジェクトのスキャンが完了すると、Lambda関数で使われている依存関係にセキュリティ脆弱性があることが分かりました。

GitHubリポジトリの選択画面と、package.json内の重大度「高」の安全でない乱数生成の脆弱性を示すSnykのインターフェース

なんと!フロントエンドプロジェクトにも、サーバーレス関数のAPIサービスにも、かなりの脆弱性があります。さっそく解消しましょう。各プロジェクトのページでSnyk UIから修正PRを手動で作成することも、Snykボットに検出させてリポジトリに代わりに自動でPRを作成させることもできます。あとはテストの成功を確認して、PRをマージするだけです。ご覧ください。

lirantal/bazz-frontendリポジトリで、脆弱なnpm依存関係を1つ修正するSnyk Botの様子を示すGitHubのプルリクエスト

サーバーレス関数の安全なデプロイを徹底する

CIやソースコードリポジトリの監視、脆弱性への事前対応に加え、関数のデプロイワークフローもセキュリティレビューの対象にする必要があります。デプロイ時に関数の脆弱性が見つかった場合は、デプロイを中止すべきです。

サーバーレスのデプロイでオープンソースのセキュリティ監視を徹底すれば、防御をさらに強化できます。関数にバンドルされた依存関係に既知のオープンソース脆弱性がある場合、その関数がターゲット環境にデプロイされるのを防げます。

Serverless frameworkは、サーバーレス関数の開発とデプロイによく使われるツールキットです。プラグインアーキテクチャにより、関数のライフサイクルにカスタムワークフローを組み込めます。Snykは、フレームワークにシームレスに統合できるオープンソースのServerless pluginを提供しています。

次の画像は、オープンソース依存関係にセキュリティ脆弱性が検出されたため、プラグインが関数のデプロイを防いでいる様子を示しています。

脆弱な依存関係(minimatchやrequestなど)に関するSnykの警告により、Serverless Frameworkのデプロイがブロックされたことを示すターミナル画面。

各デプロイ時にプロジェクトの依存関係のスナップショットを取得し、新たな脆弱性が見つかった際に特定できるよう、Serverless framework pluginを設定することをおすすめします。Snykのようなソリューションなら、脆弱な依存関係を修正するプルリクエストを自動で作成し、問題を通知して修正できます。

サーバーレスのCI/CDワークフローでは、より柔軟なカスタマイズや制御が必要になることもあります。そんなときに役立つのが、開発者やDevOpsエンジニアが自分のワークフローに柔軟に導入できる、オープンソースのSnykコマンドラインユーティリティです。

Snykはローカル環境、またはサーバーレスプロジェクトをビルドするCIジョブにインストールできます。次のようにsnyk testを実行して、脆弱性を検出できます。


$ npm install -g snyk
$ snyk test

セキュリティ脆弱性はできるだけ早く修正するのが望ましいものの、ソースコードリポジトリ内の依存関係のバージョンと、実際にデプロイされた関数のバージョンが食い違う可能性は残ります。コードをステージング環境や本番環境に昇格する際に遅延が生じると、既知の脆弱性を含む古い依存関係が関数にバンドルされるリスクがあります。

最後に、私がまとめた詳しい10 Serverless Security Best Practices!もぜひご覧ください。無料のSnykアカウントに登録して、脆弱性の修正を始めましょう。

CTFを始めよう

オンデマンドのバーチャル入門ワークショップで、CTFチャレンジの解き方を学びましょう。