CNDT2021、NTTデータのエンジニアがコンテナの乗っ取り方とその防ぎ方を解説
コンピュータシステムをセキュアに保つことは、システムの中のコンポーネントが多くなればなるほど困難になる。クラウドネイティブなシステムがモノリシックからマイクロサービスに移行したのは、柔軟性や可動性、スケーラビリティを高めるためだが、結果として守るべき領域、範囲が拡大し全体を見通して必要な防御を行うためには多くの労力が必要となってしまっているのが現状だ。
CNDT2021においてNTTデータのエンジニアが行った「乗っ取れコンテナ!! ~開発者から見たコンテナセキュリティの考え方~」というタイトルのセッションは、実際に多層のシステムからコンテナを乗っ取る例とコンテナホストを乗っ取る例を解説して、悪意のあるハッカーが「どうやって攻撃するのか?」についての理解を深めた後に、それを防ぐために何をするべきか?を解説する内容だ。
動画:乗っ取れコンテナ!!~開発者から見たコンテナセキュリティの考え方~
セッションのスライド:https://speakerdeck.com/mochizuki875/container-dev-security
セッションを担当したのはNTTデータのエンジニアである望月敬太氏だ。
最初に、セッションを聴いて欲しい対象者としてコンテナを利用する開発者を挙げ、インフラストラクチャーとしてKubernetesなどの運用管理を行う運用担当者ではないことを説明した。
実際にはシステムのセキュリティには多くの要因が存在し、NISTのセキュリティガイドにもイメージ、レジストリー、コンテナ、オーケストレーター、ホストOSなどのカテゴリーが存在する。望月氏の経験として「雰囲気はわかるが具体的に捉え辛い」として、自らがまとめたレイヤーに分けた全体像を示したのが次のスライドだ。
ここでは開発者がアプリケーション、実行イメージ、それをパッケージとしたコンテナを生成し、インフラストラクチャーにあたるコンテナランタイム、オーケストレーター、ホストOS、ネットワークやレジストリーを運用担当者が責任を持つという区分になっている。コンテナオーケストレーションを行うKubernetesが開発者にとっては難しい、負担が大きいというのはよく言われる話だ。焦点が拡散しないように、敢えて上位のアプリケーションにおけるセキュリティを避けているのは良い判断だろう。
コンテナへの攻撃
ここからはコンテナへの攻撃について解説を行うフェースになった。特にコンテナへの攻撃、コンテナを実行するホストへの攻撃に絞って解説を行っている。
シンプルなWebアプリケーションに対して、2つのターミナルを使ってHTTPリクエストを用いてWebサイトのHTMLを書き換える例、コンテナ内でコマンドを実行してバックドアを作成する例などを、利用するコマンドを例に挙げながら説明した。
次にコンテナが実行されるホストOSへの侵入、悪意のあるコマンドの実行などについても解説を行った。
攻撃者が複数のターミナルを駆使して、さまざまなコマンドによって徐々にホストOSでコマンドを実行できるようになるまでを解説することで、「雰囲気はわかるが具体的にわかり辛い」という不満を解消しているといえる。
もう一度、レイヤーに分けたシステムの全体像から具体的な内容について解説を行い、コンテナイメージはDockerfile、コンテナについてはKubernetesの構成ファイルであるManifestファイルに対する対策の概要を解説した。
最初に解説したのは、コンテナにおけるセキュリティの考え方のひとつとして、イメージ自体に余計なものを詰め込まないということだ。
ここではイメージをビルドする際、本当にそのライブラリーやパッケージがアプリケーションにとって必要なものなのかを再考するべきだと解説。自身が書いたコード以外のものが含まれれば脆弱性が発見される可能性も増えるし、たとえある時点では安全だと思われていたパッケージ・ライブラリーでも後日、脆弱性が発見されるかもしれないということを強調した。
余計なものを入り込ませないために公式のイメージを使うという以外に、公式であってもイメージのサイズが小さいものを選ぶことで、脆弱性が入り込む可能性を下げることができると解説。
ここではコンテナイメージのスキャンを行うツールとして、TrivyとDockleを挙げて説明した。しかしツールについてはエコシステムの中に多くのソフトウェアが存在しているため、ここで挙げたものだけが正解だとは認識しないで欲しいことを強調した。
コンテナホストへの攻撃
コンテナホストへの攻撃の例でも解説されたように、プロセスが使う特権を必要最低限にするべきだとして、KubernetesのManifestに対してPrivilegedという記述を例に挙げて説明を行った。
ここでは悪意のあるファイルがホストOSのファイルシステムに保存されてしまうリスクを解説し、デフォルトでReadWriteとなっているKubernetesのルートファイルシステムの設定についても注意を喚起した形になった。
イメージの中身ではなく実行をコントロールするKubernetesの設定ファイルに対しても、安全な設定内容になっているかを確認するためのスキャンツールがあることを紹介した。ここではKubesec、Kubeauditが紹介されているが、他にもポリシーベースのOPAなども簡単に紹介し、エコシステムには選択肢があることを説明した。
最後にまとめとして「開発者目線で何ができるか?」について「イメージに余分なものを含めない」「コンテナの隔離性を維持する」ことが大事だとしてセッションを終えた。
開発者目線ではあるものの、Kubernetesの設定ファイルにも言及していることから、望月氏は開発者自身がKubernetesの設定にも関わらざるを得ないことを認識していると言える。Kubernetesの複雑さを抽象化するために、アプリケーション開発者とインフラストラクチャー運用担当者の間にアプリケーションオペレーターというアプリに特化した運用担当を設けようとしているのがMicrosoftのやり方だが、セキュリティに関しても「誰がどこまでやるのか?」という線引きが必要な時期が来ているのかもしれない。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- コンテナの静的・動的スキャン
- CNSC 2022からOSSの脆弱性スキャンツールであるTrivyの作者が語るTrivyの最新情報を紹介
- CNDT2020シリーズ:CAのインフラエンジニアが解説するKubernetesネイティブなCI/CD
- コンテナとKubernetes作成・運用に関するセキュリティ
- CNDT2020シリーズ:オススメのGitOpsツールをCAのインフラエンジニアが解説
- CloudNative Days Tokyo 2023から、クラウドネイティブセキュリティの脅威や論点を紹介
- コンテナのセキュアな運用のために
- 「KubeCon NA 2022」から、VMwareが行った既存のイメージを壊すプレゼンテーションを紹介
- CNDT2021、NTTComのアーキテクトがDevOpsに繋がるフィードバックループを解説
- CloudNativeSecurityCon、SUSEのセキュリティ部門のトップにインタビュー