Docker Desktopは元々Linux以外のOSでDockerを気軽に使うためのソフトウェアでした。WindowsとmacOS向けにリリースされていました。 最近Linux Desktop向けにもDocker Desktopが提供されるようになったものあり、Linuxのデスクトップ環境でもDockerコンテナを活用したアプリケーション開発がしやすくなりました。
最近使い勝手の向上が強化されているDocker Desktopに、Docker Extensionという機能が実装されました。これはイメージ的にはブラウザーやVSCodeの拡張機能のように、標準の機能に機能追加するもののようです。
Docker ExtensionはDocker Dashboardを開きExtensionsのメニューからMarketplaceを選択したあと、
インストールしたいExtensionを選ぶだけで導入できます。インストール中にDockerを再起動することなく、気軽に機能追加できます。
コンテナイメージのスキャンをDocker Extensionで試してみる
例えばあなたがPHPとWebサーバーの環境を仮想マシンに用意するとしましょう。まずあなたは仮想マシンに何らかのOSをインストールすると思います。そのあとインストールしたOSのパッケージ管理ツールを用いて、WebサーバーとPHPをインストールすると思います。
これをDockerコンテナーで用意するには docker contaienr run -d -p 80:80 docker.io/php
、これだけで用意できます。実際使うにはカスタマイズした上でアプリケーションの実行のために利用するのですが、コンテナでアプリケションを実行するには今回のように何らかのイメージを使ってアプリケーションの実行環境を用意するのが基本になります。
コンテナーを実行すると、指定したイメージをコンテナレジストリーからダウンロードします。デフォルトで使われるレジストラーはランタイムによって異なりますが、Dockerの場合は同じプロジェクトが運営しているDocker Hubがデフォルトで利用されます。Docker Hubにはユーザーが作ったイメージのほか、オフィシャルイメージ(Dockerがメンテナンスをしているものやアプリケーションの提供者がメンテナンスしているイメージのこと)も手元の環境にダウンロードして利用できます。Docker Hubのアカウントは無料で作ることができ、Dockerにログインすると手元の環境で作ったコンテナイメージを登録して公開したりすることもできます。
さて、Dockerをふくめてコンテナーでアプリケーションを実行する上で、コンテナイメージがいかに重要であると言うことがわかったと思います。ここで重要なのが利用するコンテナーイメージが「新鮮」かということです。古い(もしくは十分にメンテナンスされていない)イメージは脆弱性を抱えています。脆弱性をツールを使って可視化することで、脆弱性への対応を事前に行うことができ、脆弱性を抱えたままコンテナプラットフォーム上でアプリケーションを実行したことによるセキュリティインシデントの発生を抑止できます。
今回はDocker Desktopを使った場合に利用できるコンテナイメージのスキャンツールをいくつか紹介します。
Docker scan
まずはDocker Desktopに標準で利用できるDocker scanです。これはDocker Desktopに標準搭載されているコンテナイメージのスキャンツールで、コマンドを使ってイメージスキャンができるものです。Snyk Limited社のイメージスキャン機能を利用しており、Dockerのライセンスにクレジットが含まれています。クレジットを超過すると追加のクレジットが必要です。
docker snan ubuntu:22.04
結果は次のように表示されます。結構多くのIssueが見つかったようです。手軽に使える反面、無料利用に制限がある面、コマンドラインでしか使えない面がちょっと惜しいです。
% docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 22.04 f3d495355b4e 4 weeks ago 69.2MB ubuntu 20.04 db1bc6aa58da 4 weeks ago 65.6MB % docker scan ubuntu:22.04 Testing ubuntu:22.04... ✗ Low severity vulnerability found in tar Description: NULL Pointer Dereference Info: https://snyk.io/vuln/SNYK-UBUNTU2204-TAR-2791257 Introduced through: meta-common-packages@meta From: meta-common-packages@meta > tar@1.34+dfsg-1build3 ✗ Low severity vulnerability found in shadow/passwd Description: Time-of-check Time-of-use (TOCTOU) Info: https://snyk.io/vuln/SNYK-UBUNTU2204-SHADOW-2801886 Introduced through: shadow/passwd@1:4.8.1-2ubuntu2, adduser@3.118ubuntu5, shadow/login@1:4.8.1-2ubuntu2 From: shadow/passwd@1:4.8.1-2ubuntu2 From: adduser@3.118ubuntu5 > shadow/passwd@1:4.8.1-2ubuntu2 From: shadow/login@1:4.8.1-2ubuntu2 ✗ Low severity vulnerability found in pcre3/libpcre3 Description: Out-of-bounds Read Info: https://snyk.io/vuln/SNYK-UBUNTU2204-PCRE3-2795331 Introduced through: pcre3/libpcre3@2:8.39-13build5, grep@3.7-1build1 From: pcre3/libpcre3@2:8.39-13build5 From: grep@3.7-1build1 > pcre3/libpcre3@2:8.39-13build5 Fixed in: 2:8.39-13ubuntu0.22.04.1 ✗ Low severity vulnerability found in pcre3/libpcre3 Description: Uncontrolled Recursion Info: https://snyk.io/vuln/SNYK-UBUNTU2204-PCRE3-2799820 Introduced through: pcre3/libpcre3@2:8.39-13build5, grep@3.7-1build1 From: pcre3/libpcre3@2:8.39-13build5 From: grep@3.7-1build1 > pcre3/libpcre3@2:8.39-13build5 ✗ Low severity vulnerability found in pcre2/libpcre2-8-0 Description: Out-of-bounds Read Info: https://snyk.io/vuln/SNYK-UBUNTU2204-PCRE2-2810786 Introduced through: meta-common-packages@meta From: meta-common-packages@meta > pcre2/libpcre2-8-0@10.39-3build1 ✗ Low severity vulnerability found in pcre2/libpcre2-8-0 Description: Out-of-bounds Read Info: https://snyk.io/vuln/SNYK-UBUNTU2204-PCRE2-2810797 Introduced through: meta-common-packages@meta From: meta-common-packages@meta > pcre2/libpcre2-8-0@10.39-3build1 ✗ Low severity vulnerability found in openssl/libssl3 Description: Use of a Broken or Risky Cryptographic Algorithm Info: https://snyk.io/vuln/SNYK-UBUNTU2204-OPENSSL-2807663 Introduced through: openssl/libssl3@3.0.2-0ubuntu1, adduser@3.118ubuntu5 From: openssl/libssl3@3.0.2-0ubuntu1 From: adduser@3.118ubuntu5 > shadow/passwd@1:4.8.1-2ubuntu2 > pam/libpam-modules@1.4.0-11ubuntu2 > libnsl/libnsl2@1.3.0-2build2 > libtirpc/libtirpc3@1.3.2-2build1 > krb5/libgssapi-krb5-2@1.19.2-2 > krb5/libkrb5-3@1.19.2-2 > openssl/libssl3@3.0.2-0ubuntu1 Fixed in: 3.0.2-0ubuntu1.1 ✗ Low severity vulnerability found in openssl/libssl3 Description: Improper Resource Shutdown or Release Info: https://snyk.io/vuln/SNYK-UBUNTU2204-OPENSSL-2807687 Introduced through: openssl/libssl3@3.0.2-0ubuntu1, adduser@3.118ubuntu5 From: openssl/libssl3@3.0.2-0ubuntu1 From: adduser@3.118ubuntu5 > shadow/passwd@1:4.8.1-2ubuntu2 > pam/libpam-modules@1.4.0-11ubuntu2 > libnsl/libnsl2@1.3.0-2build2 > libtirpc/libtirpc3@1.3.2-2build1 > krb5/libgssapi-krb5-2@1.19.2-2 > krb5/libkrb5-3@1.19.2-2 > openssl/libssl3@3.0.2-0ubuntu1 Fixed in: 3.0.2-0ubuntu1.1 ✗ Low severity vulnerability found in krb5/libkrb5support0 Description: Integer Overflow or Wraparound Info: https://snyk.io/vuln/SNYK-UBUNTU2204-KRB5-2797765 Introduced through: krb5/libkrb5support0@1.19.2-2, adduser@3.118ubuntu5, krb5/libk5crypto3@1.19.2-2, krb5/libkrb5-3@1.19.2-2, krb5/libgssapi-krb5-2@1.19.2-2 From: krb5/libkrb5support0@1.19.2-2 From: adduser@3.118ubuntu5 > shadow/passwd@1:4.8.1-2ubuntu2 > pam/libpam-modules@1.4.0-11ubuntu2 > libnsl/libnsl2@1.3.0-2build2 > libtirpc/libtirpc3@1.3.2-2build1 > krb5/libgssapi-krb5-2@1.19.2-2 > krb5/libkrb5support0@1.19.2-2 From: adduser@3.118ubuntu5 > shadow/passwd@1:4.8.1-2ubuntu2 > pam/libpam-modules@1.4.0-11ubuntu2 > libnsl/libnsl2@1.3.0-2build2 > libtirpc/libtirpc3@1.3.2-2build1 > krb5/libgssapi-krb5-2@1.19.2-2 > krb5/libk5crypto3@1.19.2-2 > krb5/libkrb5support0@1.19.2-2 and 8 more... ✗ Low severity vulnerability found in gmp/libgmp10 Description: Integer Overflow or Wraparound Info: https://snyk.io/vuln/SNYK-UBUNTU2204-GMP-2775169 Introduced through: gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1, coreutils@8.32-4.1ubuntu1, apt@2.4.5 From: gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1 From: coreutils@8.32-4.1ubuntu1 > gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1 From: apt@2.4.5 > gnutls28/libgnutls30@3.7.3-4ubuntu1 > gmp/libgmp10@2:6.2.1+dfsg-3ubuntu1 and 1 more... ✗ Low severity vulnerability found in coreutils Description: Improper Input Validation Info: https://snyk.io/vuln/SNYK-UBUNTU2204-COREUTILS-2801226 Introduced through: coreutils@8.32-4.1ubuntu1 From: coreutils@8.32-4.1ubuntu1 ✗ Medium severity vulnerability found in perl/perl-base Description: Improper Verification of Cryptographic Signature Info: https://snyk.io/vuln/SNYK-UBUNTU2204-PERL-2789081 Introduced through: meta-common-packages@meta From: meta-common-packages@meta > perl/perl-base@5.34.0-3ubuntu1 ✗ Medium severity vulnerability found in openssl/libssl3 Description: Improper Certificate Validation Info: https://snyk.io/vuln/SNYK-UBUNTU2204-OPENSSL-2807615 Introduced through: openssl/libssl3@3.0.2-0ubuntu1, adduser@3.118ubuntu5 From: openssl/libssl3@3.0.2-0ubuntu1 From: adduser@3.118ubuntu5 > shadow/passwd@1:4.8.1-2ubuntu2 > pam/libpam-modules@1.4.0-11ubuntu2 > libnsl/libnsl2@1.3.0-2build2 > libtirpc/libtirpc3@1.3.2-2build1 > krb5/libgssapi-krb5-2@1.19.2-2 > krb5/libkrb5-3@1.19.2-2 > openssl/libssl3@3.0.2-0ubuntu1 Fixed in: 3.0.2-0ubuntu1.1 ✗ Medium severity vulnerability found in openssl/libssl3 Description: OS Command Injection Info: https://snyk.io/vuln/SNYK-UBUNTU2204-OPENSSL-2807639 Introduced through: openssl/libssl3@3.0.2-0ubuntu1, adduser@3.118ubuntu5 From: openssl/libssl3@3.0.2-0ubuntu1 From: adduser@3.118ubuntu5 > shadow/passwd@1:4.8.1-2ubuntu2 > pam/libpam-modules@1.4.0-11ubuntu2 > libnsl/libnsl2@1.3.0-2build2 > libtirpc/libtirpc3@1.3.2-2build1 > krb5/libgssapi-krb5-2@1.19.2-2 > krb5/libkrb5-3@1.19.2-2 > openssl/libssl3@3.0.2-0ubuntu1 Fixed in: 3.0.2-0ubuntu1.1 ✗ Medium severity vulnerability found in e2fsprogs/libcom-err2 Description: Out-of-bounds Read Info: https://snyk.io/vuln/SNYK-UBUNTU2204-E2FSPROGS-2801319 Introduced through: e2fsprogs/libcom-err2@1.46.5-2ubuntu1, e2fsprogs@1.46.5-2ubuntu1, adduser@3.118ubuntu5, e2fsprogs/libext2fs2@1.46.5-2ubuntu1, e2fsprogs/libss2@1.46.5-2ubuntu1, e2fsprogs/logsave@1.46.5-2ubuntu1 From: e2fsprogs/libcom-err2@1.46.5-2ubuntu1 From: e2fsprogs@1.46.5-2ubuntu1 > e2fsprogs/libcom-err2@1.46.5-2ubuntu1 From: e2fsprogs@1.46.5-2ubuntu1 > e2fsprogs/libss2@1.46.5-2ubuntu1 > e2fsprogs/libcom-err2@1.46.5-2ubuntu1 and 9 more... ✗ Medium severity vulnerability found in dpkg Description: CVE-2022-1664 Info: https://snyk.io/vuln/SNYK-UBUNTU2204-DPKG-2847996 Introduced through: meta-common-packages@meta From: meta-common-packages@meta > dpkg@1.21.1ubuntu2 Fixed in: 1.21.1ubuntu2.1 Organization: ytooyama Package manager: deb Project name: docker-image|ubuntu Docker image: ubuntu:22.04 Platform: linux/arm64 Licenses: enabled Tested 102 dependencies for known issues, found 16 issues.
Docker Extensionを使ったいろいろなスキャンツールの利用
今回はDocker Extensionの中から、2つのイメージスキャンツールを紹介します。
JFrog
JFrogはDevOpsプラットフォームやサービスを提供するJFrog社によるDocker Desktop Extensionです。Docker Desktopのローカルのコンテナーイメージのセキュリティスキャンが可能です。
一覧の項目をクリックすると、脆弱性のCVE番号とリファレンスURLなどの詳細情報を確認できます。
利用するにはJFrog environmentアカウントが必要とのことですが、アカウント自体は無料で作成できます。一般的なメールアドレスパスワードによるアカウント作成の他、GoogleアカウントやGitHubアカウントを使った認証が可能です。
Trivy
TrivyはAqua Security社提供によるOSSのイメージスキャンツールであり、Docker Desktop Extensionも提供されています。JFrogとの違いとしてはアカウントを作成することなく利用できる点でしょうか。画面にもスキャンするのにリミットはないし、アカウントログインも必要ないと大きく書かれています。リミットがないなら普段からイメージのスキャンをまともにやろうと思えますね。
Trivyはローカル上とリモート上にあるコンテナーイメージのスキャンができる点が大きな違いです。
一覧から項目を選ぶと、脆弱性に関する情報を確認できます。
スキャンツールとしては、TrivyのDocker Desktop Extensionも必要な機能は実装しているように感じました。
Docker ExtensionでVMware Tanzu Community Editionを入れてみる
Docker ExtensionにはVMware Tanzu Community EditionというExtensionが用意されており、これをインストールするとVMware TanzuベースのKubernetesクラスターを手元の環境で実行できるようです。
他のDocker Extensionと同様、Marketplaceからインストールして、「クラスターを作成」をクリックするだけでKubernetesクラスターが作れるようになります。
構築されるKubernetesクラスターはCNIとしてはCalico、ストレージとしてはlocal-path-provisionerが導入されており、永続ストレージをストレージクラスで要求すれば使える状態になっていました。クラスターが作成されたら画面上にkubeconfigが表示されるので、それをコピーして手元の~/.kube/config
に書き込むとkubectlコマンドでクラスターを利用できます。
ローカル環境にKubernertesクラスターを作成できるツールはいくつかありますが、Docker Extension版VMware Tanzu Community Editionは非常に簡単に利用できて良いです。
この機能を使って作成したKubernetesクラスターは必要な機能は一通り揃っているので、ちょっとKubernetesを使いたい時は便利のように感じました。使いたい時はボタンポチッ、不要になったらボタンポチッですみますから。