ノヌド.js開発者向けのDocker:セキュリティを倱敗させないために知っおおくべき5぀のこず

投皿日 Jul 13, 2021

リラン・タル、開発者アドボカシヌの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/dpkg-dev@1.18.25, libtool@2.4.6-2
  From: dpkg/dpkg-dev@1.18.25 > binutils@2.28-5
  From: libtool@2.4.6-2 > gcc-defaults/gcc@4:6.3.0-4 > gcc-6@6.3.0-18+deb9u1 > binutils@2.28-5
  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/dpkg-dev@1.18.25, libtool@2.4.6-2
  From: dpkg/dpkg-dev@1.18.25 > binutils@2.28-5
  From: libtool@2.4.6-2 > gcc-defaults/gcc@4:6.3.0-4 > gcc-6@6.3.0-18+deb9u1 > binutils@2.28-5
  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 を䜿甚しお コンテナヌ むメヌゞのテストず修正 を開始したす。

関連蚘事