本連載では、エンタープライズシステムでコンテナ/Kubernetesを活用した業務システムを開発/運用するエンジニアに向けて、知っておくべきKubernetesセキュリティの基礎知識、Microsoftが提供するパブリッククラウド「Azure」を使ったクラウドでのKubernetesセキュリティ対策のポイント、気を付けておきたい注意点などの実践的なノウハウを紹介します。

これまで、システムを悪意ある攻撃者から保護するために、システムアーキテクチャを俯瞰的にとらえてこれに対応した脅威モデルを想定すべきという考え方に基づき、ID、ホスト、ネットワーク、データにまたがった多層防御 (defense-in-depth) の実装により安全性を確保して保護をする、というコンテナセキュリティの全体像に触れてきました。

今回は、この多層防御の考え方にもとづいて、その一要素であるアプリケーションセキュリティについての対策を取り上げます。

開発者が知っておくべきコンテナアプリケーションのセキュリティ

コンテナはアプリケーションの可搬性の高さから、今や多くの開発者にとって欠かせない技術となっています。しかしながら、もしコンテナ上で実行されるアプリケーションやライブラリに脆弱性があったり、マルウェアなどの悪意のあるコンテンツが含まれていたりする場合どうなるでしょうか。

攻撃者がアプリケーションの脆弱性を見つけ出し、それを悪用することで遠隔から任意のコード実行することを「リモートコード実行(RCE: Remote Code Execution)」と呼びます。

例えば、Kubernetesクラスタで動くPodのアプリケーションに対してフロントアプリの脆弱性を突いてRCEを実行すると、攻撃者は同一ホスト上で動作するバックエンドアプリに不正に侵入し、保護すべきデータベース上にある機密情報へのアクセスを試みるでしょう。

NIST Special Publication (SP) 800-125では、仮想化を「ほかのソフトウェアが実行されるソフトウェアおよび/またはハードウェアのシミュレーション」と定義しています。例えばクラウドの仮想マシンは、ハードウェア仮想化を利用して1台の物理サーバ上で多数のOSインスタンスを実行します。

一方のコンテナは、cgroups/namespaceなどを使ってOSカーネルを仮想的に分離して複数のアプリケーションでOSを共用します。

両者の違いの1つに、アプリケーションの分離レベルがあります。フロントエンド/バックエンドなどの異なる役割を持つシステムを考えてみます。仮想マシンの場合、フロントエンド/バックエンドそれぞれを異なる仮想マシンで実行するアーキテクチャを採用することが多いでしょう。

対するコンテナの場合、Kubernetesなどのコンテナオーケストレータを使って複数のアプリケーションを同一ホストで実行し、コンピューティングリソースの最適化を行います。つまり、コンテナはハイパーバイザによって明確に分離される仮想マシンより強いセキュリティ境界を持たせることができません。

コンテナブレイクアウトとは、コンテナからホストマシン上のリソース(ファイルシステム、プロセス、ネットワークインタフェースなど)に不正にアクセスすることです。コンテナという分離された環境から脱獄する行為で、悪意あるプログラムの実行により同一ホスト上で動くほかのアプリケーションのセキュリティが侵害される恐れがあります。

例えば、2019年にはコンテナランタイムruncの脆弱性である「CVE-2019-5736」が公表されました。悪意のあるコンテナはこの脆弱性を悪用することでruncバイナリのコンテンツを書き換え、コンテナのホストシステム上で任意のコマンドを実行できます。

また、2022年2月4日「CVE-2022-0492」として、Linuxカーネルにおける特権昇格の脆弱性が公表されました。これはcgroupsの論理バグでこの脆弱性を悪用されると、権限を持たないプロセスが特権昇格して権限を獲得できます。

コンテナアプリケーションを開発するには、従来の仮想マシンで動くアプリケーションセキュリティ対策に加えて、コンテナアプリケーションならではの対策が必要です。ここでは、アプリケーション開発者が気を付けておくべき次の3つの観点と対策方法を説明します。

  • コンテナアプリケーションの脆弱性を減らす
  • シークレットを適切に管理する
  • コンテナアプリケーションに不要な権限を与えない