ノード.js開発者向けのDocker:セキュリティを失敗させないために知っておくべき5つのこと

リラン・タル、開発者アドボカシーのSnykディレクターによるゲスト投稿 

Docker では、合計で最大 3,180 億回以上のコンテナー イメージがダウンロードされています。 Docker Hub では何百万ものアプリケーションを使用できるため、コンテナーベースのアプリケーションが人気があり、アプリケーションを簡単に使用および公開できます。

そうは言っても、独自のDocker Node.js Webアプリケーションを構築する素朴な方法には、多くのセキュリティリスクが伴う可能性があります。 では、Node.js開発者にとってセキュリティをDockerの不可欠な部分にするにはどうすればよいでしょうか。

このトピックに関する多くの記事が書かれていますが、残念ながら、Node.js Dockerイメージを構築するためのセキュリティと本番環境のベストプラクティスについて慎重に検討されていません。 これが私の記事の焦点であり、Peter McKeeとの最近の Docker Buildショー で共有したデモです。 

Docker for Nodeの要点に飛び込んで.js Dockerイメージを構築する前に、このトピックに関するいくつかのよくある質問を見てみましょう。

Node.jsアプリケーションをドッキング化するにはどうすればよいですか?

Node.jsアプリケーションをDockerコンテナで実行するのは、プロジェクトのディレクトリをコピーして必要なすべてのnpmパッケージをインストールするのと同じくらい簡単ですが、見逃す可能性のあるセキュリティおよび本番関連の懸念事項が多数あります。 これらの本番グレードのヒントは、 Dockerを使用したNode.js Webアプリケーションのコンテナ化に関する次のガイドに記載されており、適切なDockerベースイメージの選択やマルチステージビルドの使用から、シークレットの安全管理と本番関連のフレームワーク構成の適切な有効化まで、すべてをカバーしています。

この記事では、Web アプリケーションに適した Node.js Docker 基本イメージを選択することの影響をよりよく理解するために必要な情報に焦点を当て、アプリケーションで使用できる最も安全な Docker イメージを見つけるのに役立ちます。  

DockerはNode.js開発者にとってどのように役立ちますか?

Node.jsアプリケーションをコンテナにパッケージ化すると、ランタイム、構成、OSレベルの依存関係、およびWebアプリケーションをさまざまなプラットフォームやCPUアーキテクチャで実行するために必要なすべてのものを含む、アプリケーション全体をバンドルできます。 これらのイメージは、コンテナー イメージと呼ばれるデプロイ可能な成果物としてバンドルされます。 これらのDockerイメージは、簡単に再現可能なビルドを可能にするソフトウェアベースのバンドルであり、Node.js開発者はすべての環境で同じプロジェクトまたは製品を実行する方法を提供します。 

最後に、Docker コンテナーを使用すると、特別なアクセス許可を必要とせず、プロジェクトを実行するための専用環境を設定することなく、新しいプラットフォーム リリースやその他の変更をより簡単に試すことができます。

1. アプリケーションに適したノード.js Docker ベースイメージを選択する

Node.js プロジェクトの Docker イメージを作成するときは、Docker Hub からプルする別の Docker イメージに基づいて独自のアプリケーション イメージをビルドします。 これは、基本イメージと呼ばれるものです。 基本イメージは、Node.js アプリケーション用にビルドしようとしている新しい Docker イメージのビルディング ブロックです。

基本イメージの選択は、Docker イメージのビルド速度だけでなく、Web アプリケーションのセキュリティとパフォーマンスにも大きく影響するため、非常に重要です。 これは非常に重要です DockerとSnykは、 開発者チーム向けのコンテナイメージのセキュリティに焦点を当てたこの実用的なガイドを共同執筆しました。 

DebianまたはUbuntuに基づく本格的なオペレーティングシステムイメージを選択すると、これらのイメージで利用可能なすべてのツールとライブラリを利用できるため、これらのイメージを選択する可能性は十分にあります。 ただし、これには代償が伴います。 基本イメージにセキュリティ上の脆弱性がある場合は、新しく作成したイメージでそれを継承します。 多くの脆弱性を含む大きな基本イメージを既定で設定することで、悪い条件から始めたいのはなぜですか?

基本イメージを見ると、セキュリティの脆弱性の多くは、この基本イメージが使用するオペレーティングシステム(OS)レイヤーに属しています。 Snykの2019年の調査 Shifting Dockerセキュリティレフトは、OSレイヤーによってもたらされる脆弱性は、選択したフレーバーによって大きく異なる可能性があることを示しました。

1

2. 開発中にノード.js Docker イメージをスキャンする

他のイメージに基づいて Docker イメージを作成し、それらを再構築すると、新しい脆弱性が発生する可能性がありますが、その上にいる方法があります。

Docker イメージのビルド プロセスは、他の開発関連のアクティビティと同様に扱います。 記述したコードをテストするのと同様に、ビルドする Docker イメージをテストする必要があります。 

これらのテストには、Dockerfile のセキュリティの落とし穴やその他の不適切なパターンを回避していることを確認するための静的ファイル チェック (リンターとも呼ばれます) が含まれています。 これらのいくつかについては、 Docker イメージのセキュリティのベスト プラクティスで概説しています。 Node.js アプリケーション開発者の方は、 Node.js Web アプリケーションを Docker でコンテナー化するためのこのステップバイステップの 10 のベスト プラクティスもお読みください。

gitリポジトリをSnykに接続 することも優れた選択肢です。 Snyk は、GitHub、GitLab、Bitbucket、Azure Repos とのネイティブ統合をサポートしています。 git統合があるということは、セキュリティの脆弱性が見つかった場合に、プルリクエストをスキャンしてセキュリティ情報で注釈を付けることができることを意味します。 これにより、ゲートを配置し、新しいセキュリティの脆弱性をもたらす場合にプルリクエストのマージを拒否できます。

継続的インテグレーション (CI) の柔軟性を高める必要がある場合、または緊密に統合された開発者エクスペリエンスが必要な場合は、Snyk CLI を参照してください。

CLI を使用すると、Docker コンテナー イメージを簡単にテストできます。 Docker イメージをローカルでビルドし、 nodejs:notification-v99.9としてタグ付けするとすると、次のようにテストします。

  1. Snyk CLI をインストールします。
    $ npm install -g snyk
  2. 次に、Snyk CLI が API トークンを自動的に取得するようにします。
    $ snyk auth
  3. ローカルベースイメージをスキャンします。
    $ snyk container test nodejs:notification-v99.9

テスト結果は、脆弱性を導入するパスであるCVEに関する情報とともに画面に出力されるため、どのOS依存関係が原因であるかがわかります。

Docker ベース イメージ ノードをテストするための出力例を次に示します:15:

✗ High severity vulnerability found in binutils
  Description: Out-of-Bounds
  Info: https://snyk.io/vuln/SNYK-DEBIAN9-BINUTILS-404153
  Introduced through: dpkg/[email protected], [email protected]
  From: dpkg/[email protected] > [email protected]
  From: [email protected] > gcc-defaults/gcc@4:6.3.0-4 > [email protected]+deb9u1 > [email protected]
  Introduced by your base image (node:15)

✗ High severity vulnerability found in binutils
  Description: Integer Overflow or Wraparound
  Info: https://snyk.io/vuln/SNYK-DEBIAN9-BINUTILS-404253
  Introduced through: dpkg/[email protected], [email protected]
  From: dpkg/[email protected] > [email protected]
  From: [email protected] > gcc-defaults/gcc@4:6.3.0-4 > [email protected]+deb9u1 > [email protected]
  Introduced by your base image (node:15)



Organization:      snyk-demo-567
Package manager:   deb
Target file:       Dockerfile
Project name:      docker-image|node
Docker image:      node:15
Platform:          linux/amd64
Base image:        node:15
Licenses:          enabled

Tested 412 dependencies for known issues, found 554 issues.

Base Image  Vulnerabilities  Severity
node:15     554              56 high, 63 medium, 435 low

Recommendations for base image upgrade:

Alternative image types
Base Image                Vulnerabilities  Severity
node:current-buster-slim  53               10 high, 4 medium, 39 low
node:15.5-slim            72               18 high, 7 medium, 47 low
node:current-buster       304              33 high, 43 medium, 228 low

3. Docker イメージのノード.jsランタイムの脆弱性を修正する

Dockerコンテナイメージのリスクを管理する際に見落とされがちな詳細は、アプリケーションランタイム自体です。 Docker for Java を実践している場合でも、 Docker for Node.js Web アプリケーションを実行している場合でも、Node .js アプリケーション ランタイム自体が脆弱である可能性があります。

Node.jsセキュリティリリースと Node.jsセキュリティポリシーを認識し、それに従う必要があります。 これらに手動で追いつく代わりに、Snykを利用してノード.jsセキュリティの脆弱性も見つけます。

さまざまな Node.js ベースイメージタグのセキュリティ脆弱性に関するコンテキストを増やすために、Snyk CLI を使用してそれらの一部をスキャンし、結果を次の対数スケールチャートにプロットしました。

2

あなたはそれを見ることができます:

  1. node:latest としてもタグ付けされたデフォルトの ノード ベースイメージタグは、500を超えるセキュリティ脆弱性をバンドルしていますが、Node.jsランタイム自体に2つのセキュリティ脆弱性を導入しています。現在Node.js 15バージョンを本番環境で実行していて、パッチを適用または修正していない場合は、心配する必要があります。
  2. node:alpine ベースイメージタグは、ベースイメージ内の脆弱な OS 依存関係をバンドルしていない可能性がありますが (これが青いバーが欠落している理由です)、最新の Node.js ランタイム (バージョン 15) の脆弱なバージョンが残っています。
  3. サポートされていないバージョンの Node.js (Node.js 10 など) を実行している場合、脆弱であり、セキュリティ更新プログラムを受信していないことがわかります。

この記事の執筆時点で、リリースされた最新バージョンである Node.js バージョン 15 を選択した場合、実際には、このコンテナー内の 561 のセキュリティ脆弱性だけでなく、Node.js ランタイム自体の 2 つのセキュリティ脆弱性にもさらされることになります。

Docker スキャン テストの結果は、次のパブリック イメージ テスト URL https://snyk.io/test/docker/node:15.5.0 で確認できます。 このパブリックで無料のDockerスキャンサービスで使用している他のノード.jsベースイメージタグをテストすることができます: https://snyk.io/test

3

セキュリティは現在 、Dockerワークフローの不可欠な部分であり、SnykはDocker HubとDocker Desktopでのコンテナスキャンを強化しています。 実際、開発プラットフォームとして Docker を使用している場合は、 Snyk および Docker の脆弱性チートシートを確認する必要があります。

すでにDockerユーザーアカウントをお持ちの場合は、それを使用してSnykに接続し、月に最大200回の無料スキャンで Docker Hubリポジトリをすばやくインポート できます。 

4. ノード.jsアプリケーション用にデプロイされた Docker イメージを監視する

Docker イメージをビルドしたら、イメージを追跡する Docker レジストリにプッシュして、これらを機能的なコンテナー アプリケーションとしてデプロイおよびスピンアップできるようにします。

Dockerの基本イメージを監視する必要があるのはなぜですか?

これまでに説明したすべてのセキュリティガイドラインをベースイメージのスキャンと修正で実践している場合は、それは素晴らしいことです。 ただし、新しいセキュリティの脆弱性は常に発見されることに注意してください。 現在、イメージに 78 個のセキュリティ脆弱性がある場合、明日の朝、新しい CVE が報告され、本番環境で実行中のコンテナーに影響を与えるときに 100 個が存在しないわけではありません。 そのため、コンテナー イメージ (コンテナーのデプロイに使用しているコンテナー イメージ) のレジストリを監視することは、セキュリティの問題をすぐに見つけて修復できるようにするために重要です。

イメージに有料の Docker Hub レジストリを使用している場合は、Docker Hub で Snyk による統合された Docker セキュリティ スキャンを既に見たことがあるかもしれません。 

Snykアプリから直接多くのDockerイメージレジストリと統合することもできます。例えば、Docker Hub、ACR、ECR、GCR、またはArtifactoryから画像をインポートすると、Snykはこれらを定期的にスキャンし、見つかったセキュリティ問題についてSlackまたは電子メールで警告します。

4

5. セキュリティガイドラインと本番グレードの推奨事項に従って、安全で最適なNode.js Dockerイメージを作成します

これまでのすべてのセキュリティガイドラインに追いついてきてくれておめでとうございます!

最後に、Node.jsおよびJavaアプリケーションに最適なDockerイメージを構築するためのセキュリティのベストプラクティスを深く掘り下げたい場合は、次のリソースを確認してください。

  1. 10 Dockerセキュリティのベストプラクティス – Dockerベースイメージを構築するとき、およびそれらをプルするときに従うべき詳細なセキュリティプラクティスは、読者にDockerコンテンツの信頼を紹介するためでもあります。
  2. あなたはJava開発者ですか? このリソースは貴重です: Java 開発者向けの Docker: セキュリティを失敗させないために知っておくべき 5 つのこと。
  3. Docker を使用して Node .js Web アプリケーションをコンテナー化するための 10 のベスト プラクティス – Node.js 開発者であれば、Node.js アプリケーション用に安全でパフォーマンスの高い Docker ベース イメージを構築する方法を示す、このステップバイステップのチュートリアルを気に入るはずです。

Snyk と Docker ID を使用して コンテナー イメージのテストと修正 を開始します。

フィードバック

「Docker for Node.js開発者に関する0の考え:セキュリティを失敗させないために知っておくべき5つのこと」