とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど

開催予定の勉強会

読者登録と各種SNSのフォローもよろしくお願いいたします。

Docker Desktopに追加されたDocker Extensionを使ってみる

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を使いたい時は便利のように感じました。使いたい時はボタンポチッ、不要になったらボタンポチッですみますから。