UBIイメージを使ってコンテナの脆弱性を最小限に抑える
Rags Srinivas
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を示します。
ベースイメージにpythonを使う代わりに、以下のようにDockerfileを変更し、Red HatレジストリのUBIイメージを使ってみましょう(イメージの認証と使用には、適切な認証情報が必要な場合があります)。変更点は、1行目でUBIイメージを使っていることだけです。
以下のように、UBIをベースイメージとしてコンテナ化アプリを生成する手順は、UBI以外のイメージを使う場合と同じです。
UBIをベースイメージとするコンテナ化アプリでsnykを実行すると、以下のように脆弱性の一覧が生成されます。
以下のように、UBIベースのコンテナイメージの実行方法も、UBI以外のイメージをベースにしたアプリケーションと同じです。
これは、ドキュメントにある「新しいRed Hat Universal Base Imagesを使えば、コンテナを一度構築するだけで、複数のデプロイ先プラットフォームに自由に再配布できます」という説明に基づいています。
アプリケーションのテストや実行にRed Hatのコンテナツールセットを使う場合は、次のコマンドを使用できます。
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ワークロードの脆弱性を検出し、自動的に修正します。
