Skip to main content

Docker セキュリティスキャンガイド 2023

著者:
0 分で読めます

Docker は世界中に巨大なユーザーベースを持ち、最近では 1,000 万人のユーザーと 2,420 億のイメージプルを超えるなど、アプリケーションの開発手段を変化させてきました。

コンテナ化で開発が加速したことで、セキュリティの責任は開発者側に移り、開発者にはコードだけでなくコンテナイメージを維持する責任も生じています。そのため、開発者が使いやすい Snyk と Docker の統合は、現在のセキュリティ環境において非常に貴重です。

Docker とは

Docker は、OS レベルの仮想化を用いて、コンテナと呼ばれる専用のサンドボックス内でアプリケーションやサービスを実行するために用いられる一連の Paas (Platform-as-a-Service) 製品です。

Docker は、サービスに必要なすべての依存関係をコンテナにインストールできるため、不要なパッケージや同じパッケージの異なるバージョンをコンピュータにネイティブにインストールしてしまうことはありません。これにより、アプリケーションの完全な作業環境をチーム内外の他のユーザーに簡単に配布できます。

Docker イメージは、Docker の DockerHub (無料および有料アカウント) や、Amazon Elastic Container Registry (ECR) や Google Container Registry (GCR) などのサードパーティ製リポジトリに、簡単にアップロードまたはプッシュできます。

しかし、コンテナ内にインストールする依存関係やツールには、どのように伝えればいいのでしょうか。Dockerfile は、その目的のために設計されています。

Dockerfile とは

Dockerfile は、Docker にコンテナの準備手順を指示するために使用されます。すべての手順を Dockerfile に記述したら、その Dockerfile からイメージを「ビルド」できます。イメージを共有するには、誰でもイメージをビルドできるようになる Dockerfile ブループリントを共有することも、イメージを直接共有することもできます。ここでの利点は、いったんイメージを共有したらリビルドが不要なことです。

Docker セキュリティスキャンについて

Docker セキュリティスキャンとは

Docker イメージのセキュリティスキャンとは、Docker イメージにリストされているパッケージの既知のセキュリティ脆弱性を特定するプロセスのことをいいます。これにより、イメージを Docker Hub やその他のレジストリにプッシュする前に、コンテナイメージの脆弱性を見つけて修正できます。

Snyk と Docker の統合により、開発者主導型のコンテナセキュリティスキャンが直接 Docker ツールに組み込まれています。これにより、以下の簡単なコマンドを使用して、ビルド直後に Docker Desktop から直接コンテナイメージをスキャンできるようになりました。 

snyk container test <image-name>

これにより、コンテナ イメージの脆弱性を見つけて修正してから、イメージを Docker Hub やその他のレジストリにプッシュすることができます。

Snyk が提供している脆弱性スキャンは、他社が提供している脆弱性スキャンとは少し異なります。Snyk が目指しているのは、単に問題点を列挙するだけでなく、開発者が行動を起こせるようにガイドすることです。

  • --file オプションにイメージと Dockerfile を含めることで、docker scan の結果では、最新のイメージや小さなベースイメージを選択して脆弱性の少ない詳細を表示できます。

  • さらに、脆弱性は依存関係とともに、Dockerfile 命令の実行でマッピングされ、問題を追跡して対処できるようになります。

Docker セキュリティスキャンが重要な理由

Docker セキュリティスキャンが重要なのは、Docker Hub やその他のレジストリにイメージをプッシュする前に、コンテナイメージの脆弱性を発見して修正する主な方法となるためです。

Kubernetes のようなコンテナオーケストレーションサービスを使用している場合、これらのセキュリティ問題はすでに解決されていると思うかもしれませんが、必ずしもそうではありません。Kubernetes には Pod の実行方法に関するセキュリティポリシーがありますが (Pod は基本的にコンテナです)、これらの Pod の内部で実行されるコードやサービスに対するセキュリティはあまり提供されていません。セキュリティの責任はユーザー側にあります。Kubernetes クラスターの構成はコードを使って行いますが、Kubernetes セキュリティのベストプラクティスに従うことが重要です。

Docker セキュリティスキャンの種類

前述の CVE データベースに対し、Docker イメージに含まれるパッケージで既知の脆弱性をチェックするだけでは、必ずしも十分とは言えません。セキュリティの脆弱性はさまざまな場所に潜んでいる可能性があります。このため、Docker コンテナで使用できるさまざまなセキュリティスキャンツールやサービスが提供されています。

  • ネットワーク設定ツール: このようなツールで Docker イメージのポートやネットワーク設定をスキャンし、問題を特定してフラグを立てることができます。例として Cilium や Sysdig Falco などが挙げられます。

  • ID およびアクセス管理ツール: コンテナがすべてのリソースに完全にアクセスできないようにすることは、重要なセキュリティ対策となります。これには Docker コンテナに特定の役割と責任を割り当てることが含まれます。この点を容易にして、役割を強制し、モニタリングするツールがあります。Notary もその一つです。

  • ユーザー定義ポリシーツール: 一部のツールでは、コンテナに独自のセキュリティポリシーを定義して適用できます。Grafeas は、このカテゴリで人気のあるツールです。

  • オープンソースツール: 利用できるオープンソースの脆弱性スキャンツールは、数多くあります。オープンソースのスキャンツールは、フレームワーク、オペレーティングシステム、IDE など、他のオープンソースのツールを使用することが多いため、開発者の間で人気があります。セキュリティの専門家も、監査がしやすく、可視性が高いという理由で、オープンソースを好みます。Docker コンテナ仮想化を初めて使用する場合は、Dockerfile のどの命令がコンテナのセキュリティ問題を引き起こしているかを知りたいと思われるかもしれませんが、そのためのツールもあります。Snyk は、優れたオープンソースのセキュリティスキャンツールの一つで、登録すれば無料でご利用いただけます。

どんなセキュリティスキャンツールも Docker イメージやコンテナのセキュリティを 100% 保証することはできないとはいえ、このような Docker イメージのセキュリティスキャンツールは、アプリケーションやインフラの脆弱性の問題のリスクを最小限に抑えるのに役立ちます。さらに、一部のツールではコンテナを常時監視するアラート機能もあり、問題が検出されるとすぐに通知されます。また、Docker のセキュリティベストプラクティスに従うことで、セキュリティに脆弱性をもたらすリスクを最小化できます。コンテナベースのアプリケーションを自信を持って開発し、出荷しましょう。Snyk の Docker 脆弱性スキャナで、コンテナ化されたアプリケーションを保護できます。

Docker セキュリティスキャンのチートシート

Docker Vulnerability Scanning CLI Cheat Sheet
チートシートはこちらからダウンロードできます

Docker は世界中に巨大なユーザーベースを持ち、最近では 1,000 万人のユーザーと 2,420 億のイメージプルを超えるなど、アプリケーションの開発手段を変化させてきました。

コンテナ化で開発が加速したことで、セキュリティの責任は開発者側に移り、開発者にはコードだけでなくコンテナイメージを維持する責任も生じています。そのため、開発者が使いやすい Snyk と Docker の統合は、現在のセキュリティ環境において非常に貴重です。

SnykCon 2020 では、Docker Desktop の最新バージョンで Snyk を搭載したコンテナスキャンの統合を発表しました。それに次いで、Snyk が Docker 公式イメージのセキュリティプロバイダとなり、Snyk のセキュリティスキャンを Docker Hub に直接統合するというニュースが続きました。

Docker Desktop を使ったコンテナスキャンの 5 つのステップ

  1. Docker Desktop のバージョンが最新であることを確認する

  2. ログインする

  3. Docker で最初のコンテナイメージをスキャンする

  4. Dockerfile と一緒にイメージをスキャンする

  5. スキャン結果をフィルタリングする

Docker Desktop と Snyk を使用してコンテナイメージのスキャンを開始するために Docker 脆弱性スキャン CLI チートシートを作成しました。以下に、開始するためのヒントをいくつか示します。

ステップ 1: Docker Desktop のバージョンが最新であることを確認する

Docker Desktop には数か月前から Snyk のスキャン機能が含まれていますが、しばらく更新していない場合や、Snyk コンポーネントがあるかどうかわからない場合は、次の方法で確認できます。

CLI を使用する場合

Docker デスクトップの「バージョン情報」

docker scan コマンドが利用可能になります。

小さな Snyk のアイコンとバージョン情報が表示されたら、設定は完了です。

$ docker scan --help
Usage: docker scan [OPTIONS] IMAGE A tool to scan your images

ステップ 2: ログインする

スキャンを開始するには、Docker ID を取得し、Docker Desktop からログインしている必要があります。1 か月 10 回のコンテナイメージテストを無料で利用できます。ただし、Snyk にもログインすると、1 か月あたり 200 回のスキャンを実行できます。Snyk のログインは Docker ID と統合されているため、現在 Snyk にログインしていない方でも簡単に始めることができます。

$ docker scan --login

API トークンで認証する場合は、必ず --token フラグおよびフラグ引数としてトークンを含めてください。Snyk API トークンは、Snyk コンソールの Settings –> ServiceAccounts にあります。

Snyk に登録すると、依存関係や設定ファイルなど、追加のオープンソースのセキュリティのスキャン機能が利用できるようになります。統合開発環境 (IDE)、ソースコード管理 (SCM)、継続的インテグレーション、継続的開発 (CI/CD) プラットフォームなど、ソフトウェア開発ライフサイクル (SDLC) 全体で Snyk がどのように統合されているかについては、最近の講演をご覧ください。

ステップ 3:DOCKER で最初のコンテナイメージをスキャンする

基本の docker scan myapp:mytag コマンドで、一つの Docker イメージの脆弱性をスキャンできます。詳細な結果を得るために追加できるフラグがいくつかありますが、以下で詳しく説明しています。

ステップ 4: Dockerfile と一緒にイメージをスキャンする

--file path/to/Dockerfile オプションは、最も役立つオプションの一つです。Dockerfile を含めることで、Docker 公式のベースイメージの推奨アップグレードを取得でき、Dockerfile のコマンドの実行で脆弱性がマッピングされます。

ステップ 5: スキャン結果をフィルタリングする

--exclude-base フラグは、-file フラグと一緒に使用する必要がありますが、ベースイメージに起因する脆弱性が無視されるため、コンテナイメージ独自の問題の修正に集中できます。

--dependency-tree フラグは、脆弱性スキャンの結果とパッケージの依存関係ツリーを含めることで、問題の原因を簡単に突き止めることができます。

--json フラグを使用すると、スキャン結果の出力を制御できます。jq ツールを使用すると、以下のキーに基づいて JSON 結果を解析し、フィルタリングできます。

  • packageName: 最上位パッケージの名前

  • severity: 一般的な脆弱性スコアリングシステム (CVSS) に基づく評価

  • id: Snyk の脆弱性データベースの識別コード

  • name: 脆弱性バイナリの名称

  • version: コンテナイメージにインストールされているバージョン

  • nearestFixedInVersion:脆弱性の修正に必要な最低限のバージョン

  • dockerfileInstruction: Dockerfile で脆弱性のあるパッケージが導入された行

  • dockerBaseImage: 検出された親イメージ

上記の手順でコンテナセキュリティを始めることができますが、簡単な覚え方やサンプルについて知りたい場合は、リファレンスガイドとして Docker CLI チートシートをご活用いただけます。Docker コンテナスキャン CLI は、開発プロセスの早い段階で脆弱性を検出して修正する、シンプルでありながら強力なツールです。この Docker ネイティブソリューションはビルド直後に実行できるため、イメージが Docker Hub にプッシュされる前に問題を解決できます。質問やユースケースのアイデアについては、Snyk コミュニティのサイトでコメントしてください