Skip to main content

UBIイメージを使ってコンテナの脆弱性を最小限に抑える

著者
Headshot of Rags Srinivas

Rags Srinivas

Blog Design Red

2020年3月27日

0 分で読めます

Snykは、コンテナおよびクラウドネイティブのセキュリティソリューションの継続的な改善に取り組んでいます。その一環として、Snyk Containerは、開発者がコンテナイメージのセキュリティに全面的に責任を持てるよう支援します。

コンテナの脆弱性の一般的な原因のひとつは、独自のカスタムイメージを作成する土台として取り込むベースイメージです。新たな脆弱性が見つかってから対処するだけでなく、適切に選定され、継続的に更新されるベースイメージのセットを出発点として、事前に対策することが推奨されます。

この記事では、上記の目的に役立つRed Hat Universal Base Imagesを紹介します。

Universal Base Image(UBI)とは?

2019年のRed Hat Summitで発表されたRed HatのUniversal Base Imagesは、エンタープライズ向けプラットフォームであるRed Hat Enterprise Linux(RHEL)を基盤に構築されています。OCIに準拠したコンテナ用ベースOSイメージで、さまざまなランタイム言語やパッケージが含まれ、自由に再配布できます。たとえばUBI 8のイメージは、RHEL 8のベースイメージが更新されるたびに、また重大なCVEへのパッチ適用時にも更新されます。

技術的にはRed Hat Enterprise Linuxイメージとほぼ同一であり、高いセキュリティとパフォーマンス、優れたライフサイクルを備えています。異なるエンドユーザーライセンス契約のもとで提供されており、UBIを使ってコンテナ化アプリケーションを構築し、任意のレジストリサーバーにプッシュして簡単に共有できます。自由に再配布できるため、Red Hat以外のプラットフォームにもデプロイできます。

詳細はRed Hatのコンテナの構築、実行、管理に関するドキュメントをご覧ください。認定済みコンテナイメージはRed Hatのコンテナカタログにも掲載されています。UBIイメージは、dotnet、golang、nodejs、Python、PHP、Rubyなど、幅広い人気のプログラミング言語に対応しています。

UBIイメージの詳細はRed HatのFAQをご覧ください。以下でご紹介するように、ワークフローを維持したままUBIイメージを簡単に取り入れることができます。

UBIを使ったコンテナイメージの構築

まずはPythonのDockerfileの例を見てみましょう。同様の方法で、さまざまな言語ランタイムにUBIイメージを使用できます。

flaskを使ったシンプルなPythonの「Hello World!」の例として、自動生成されたDockerfileを示します。

FROM python
ENV PORT 8080
EXPOSE 8080
WORKDIR /usr/src/app

COPY requirements.txt . 
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENTRYPOINT ["python"] 
CMD ["app.py"]

ベースイメージにpythonを使う代わりに、以下のようにDockerfileを変更し、Red HatレジストリのUBIイメージを使ってみましょう(イメージの認証と使用には、適切な認証情報が必要な場合があります)。変更点は、1行目でUBIイメージを使っていることだけです。

FROM registry.redhat.io/ubi8/python-36
ENV PORT 8080
EXPOSE 8080
WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

ENTRYPOINT ["python"] 
CMD ["app.py"]

以下のように、UBIをベースイメージとしてコンテナ化アプリを生成する手順は、UBI以外のイメージを使う場合と同じです。

docker build -t ragsns/example-python-ubi .

UBIをベースイメージとするコンテナ化アプリでsnykを実行すると、以下のように脆弱性の一覧が生成されます。

snyk test --container ragsns/example-python-ubi --file=Dockerfile          

Testing ragsns/example-python-ubi...

✗ Low severity vulnerability found in npm
  Description: RHEA-2020:0330
  Info: https://snyk.io/vuln/SNYK-RHEL8-NPM-555355
  Introduced through: npm@1:6.9.0-1.10.16.3.2.module+el8.0.0+4214+49953fda
  From: npm@1:6.9.0-1.10.16.3.2.module+el8.0.0+4214+49953fda
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 1:6.13.4-1.12.14.1.1.module+el8.1.0+5466+30f75629

✗ Low severity vulnerability found in nodejs
  Description: RHEA-2020:0330
  Info: https://snyk.io/vuln/SNYK-RHEL8-NODEJS-555347
  Introduced through: nodejs@1:10.16.3-2.module+el8.0.0+4214+49953fda
  From: nodejs@1:10.16.3-2.module+el8.0.0+4214+49953fda
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 1:12.14.1-1.module+el8.1.0+5466+30f75629

✗ High severity vulnerability found in systemd-pam
  Description: RHSA-2020:0575
  Info: https://snyk.io/vuln/SNYK-RHEL8-SYSTEMDPAM-552042
  Introduced through: systemd-pam@239-18.el8_1.2
  From: systemd-pam@239-18.el8_1.2
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 0:239-18.el8_1.4

✗ High severity vulnerability found in systemd-libs
  Description: RHSA-2020:0575
  Info: https://snyk.io/vuln/SNYK-RHEL8-SYSTEMDLIBS-552044
  Introduced through: systemd-libs@239-18.el8_1.2
  From: systemd-libs@239-18.el8_1.2
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 0:239-18.el8_1.4

✗ High severity vulnerability found in systemd
  Description: RHSA-2020:0575
  Info: https://snyk.io/vuln/SNYK-RHEL8-SYSTEMD-552048
  Introduced through: systemd@239-18.el8_1.2
  From: systemd@239-18.el8_1.2
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 0:239-18.el8_1.4

✗ High severity vulnerability found in npm
  Description: RHSA-2020:0579
  Info: https://snyk.io/vuln/SNYK-RHEL8-NPM-555375
  Introduced through: npm@1:6.9.0-1.10.16.3.2.module+el8.0.0+4214+49953fda
  From: npm@1:6.9.0-1.10.16.3.2.module+el8.0.0+4214+49953fda
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 1:6.13.4-1.10.19.0.1.module+el8.1.0+5726+6ed65f8c

✗ High severity vulnerability found in npm
  Description: RHSA-2020:0598
  Info: https://snyk.io/vuln/SNYK-RHEL8-NPM-557042
  Introduced through: npm@1:6.9.0-1.10.16.3.2.module+el8.0.0+4214+49953fda
  From: npm@1:6.9.0-1.10.16.3.2.module+el8.0.0+4214+49953fda
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 1:6.13.4-1.12.16.1.1.module+el8.1.0+5811+44509afe

✗ High severity vulnerability found in nodejs
  Description: RHSA-2020:0579
  Info: https://snyk.io/vuln/SNYK-RHEL8-NODEJS-555367
  Introduced through: nodejs@1:10.16.3-2.module+el8.0.0+4214+49953fda
  From: nodejs@1:10.16.3-2.module+el8.0.0+4214+49953fda
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 1:10.19.0-1.module+el8.1.0+5726+6ed65f8c

✗ High severity vulnerability found in nodejs
  Description: RHSA-2020:0598
  Info: https://snyk.io/vuln/SNYK-RHEL8-NODEJS-557034
  Introduced through: nodejs@1:10.16.3-2.module+el8.0.0+4214+49953fda
  From: nodejs@1:10.16.3-2.module+el8.0.0+4214+49953fda
  Introduced by your base image (registry.redhat.io/ubi8/python-36)
  Fixed in: 1:12.16.1-1.module+el8.1.0+5811+44509afe

Organization:      rags
Package manager:   rpm
Target file:       Dockerfile
Project name:      docker-image|ragsns/example-python-ubi
Docker image:      ragsns/example-python-ubi
Base image:        registry.redhat.io/ubi8/python-36
Licenses:          enabled

Tested 417 dependencies for known issues, found 9 issues.

以下のように、UBIベースのコンテナイメージの実行方法も、UBI以外のイメージをベースにしたアプリケーションと同じです。

docker run -it -p8080:8080 ragsns/example-python-ubi

これは、ドキュメントにある「新しいRed Hat Universal Base Imagesを使えば、コンテナを一度構築するだけで、複数のデプロイ先プラットフォームに自由に再配布できます」という説明に基づいています。

アプリケーションのテストや実行にRed Hatのコンテナツールセットを使う場合は、次のコマンドを使用できます。

podman run -p 8080:8080 ragsns/example-python-ubi

Python言語の例を見てきました。各言語ランタイムの例を個別に確認するのではなく(それぞれの言語ランタイムに合わせて、多少の変更が必要になる場合があります)、ここでは全体をまとめて見ていきましょう。

複数の言語に対応するUBIイメージ

前述のとおり、複数の言語ランタイムに対応するUBIイメージがあります。それぞれのUBIイメージでSnykを実行した結果を、以下の表にまとめました。

UBIイメージ

依存関係

脆弱性

registry.redhat.io/ubi8/nodejs-10

373

9

registry.redhat.io/ubi8/python-36

417

9

registry.redhat.io/ubi8/ruby-26

481

9

registry.redhat.io/ubi8/php-73

403

9

registry.redhat.io/ubi8/go-toolset

371

13

registry.redhat.io/ubi8/dotnet-21

248

10

幅広い言語に対応するUBIイメージの脆弱性数が少ないのは、ベースOS、パッケージやツールのインストールに使用するyumリポジトリ、言語やフレームワークなどが、Red Hatによって慎重に選定され、更新されているためです。このRed Hatの記事では、UBIイメージのバグリストを管理し、ベースOS自体と同様のプロセスで定期的に更新・保守する方法を中心に詳しく解説しています。

まとめと次のステップ

複数の言語ランタイム向けに、UBIイメージをベースとしたコンテナ化アプリケーションを簡単に構築できることをご紹介しました。Red Hat UBIイメージの取り込みを含む変更は簡単に適用でき、CI/CDや開発パイプラインに組み込んだ後も、通常のワークフローを維持できます。

セキュリティの観点から見ると、UBIイメージはアプリケーションのコンテナ化に適した選択肢です。UBIイメージが、確立されたRHELオペレーティングシステムのプロセスに沿った厳格な保守プロセスを採用していることがわかりました。さまざまな言語ランタイム向けのUBIイメージをベースイメージとして使うことで、アプリケーションの脆弱性を最小限に抑えられます。

Snykは、イメージレジストリ、Dockerfileリポジトリ、CI/CDパイプライン、Kubernetesクラスター(OpenShift 4環境を含む)とのインテグレーションを通じて、ソフトウェア開発ライフサイクル全体にわたるアプリケーション開発のセキュリティを支援します。Snyk Containerは、UBIやRHELのイメージをはじめ、その他の主要なLinuxディストリビューションにも対応しています。

開発者ファーストのコンテナセキュリティ

Snykは、コンテナイメージとKubernetesワークロードの脆弱性を検出し、自動的に修正します。