【書評】「コンテナセキュリティ コンテナ化されたアプリケーションを保護する要素技術」
コーヒーが好きな emi です。
コンテナを使ったアーキテクチャは引き合いも多く、私も常々しっかり学ばねばならないと思っていました。そんな折、以下のイベントでコンテナセキュリティに関する内容で登壇をすることになりました。
コンテナセキュリティについて学ぶため「コンテナセキュリティ コンテナ化されたアプリケーションを保護する要素技術」を読みましたので、本記事では本書の概要と感想を記載します。
書籍情報
- 書籍タイトル : コンテナセキュリティ コンテナ化されたアプリケーションを保護する要素技術
- 著者 : Liz Rice(著)、株式会社スリーシェイク(監修)、水元 恭平、生賀 一輝、戸澤 涼、元内 柊也(訳)
- 出版社 : インプレス
- 出版日 : 2023/4/12
本書は、Liz Rice『Container Security: Fundamental Technology Concepts that Protect Containerized Applications』O'Reilly Media, Inc.の翻訳書です。本書は、開発者、運用者、セキュリティ専門家がセキュリティリスクを評価し、適切なソリューションを決定するために、コンテナの主要な要素技術を検証する実践的な書籍です。
B5 版の小ぶりな書籍です。
全部で 279 ページあり、厚みはこんな感じです。ビジネスバッグに入れて通勤時間に読むのにちょうどいい大きさ・分量かなと思います。
私は通勤や休み時間などの隙間時間で少しずつ、あとは休日に実際のコマンドを実行しながら読む、というのをやって大体 1 週間くらいかけて読みました。
私は隙間時間に技術書を読もうとすると前後の業務との切り替えが難しかったり目が滑ってしまって内容が入ってこなかったりするので、ペンで線を引いたりページを折ったりしながら受験生の参考書ように読んでいます。
書籍の概要
「コンテナセキュリティ」というタイトルの本ですが、セキュリティに限定せず、「コンテナとは何か」から詳細に説明しています。 設計書やパラメーター設計の際にここまで詳細なことは書かないであろう根本的な考え方や技術が記載されています。コンテナの本質的な理解に基づき、その特性を踏まえた上で、セキュリティの面からどのような対策が必要かを解説している内容です。
前半(Chapter 1~5)
コンテナは「カーネルの機能を使って分離されたプロセスである」ということが丁寧に解説されています。Linux カーネルの機能を実験するコマンドがいくつも記載されており、これらの機能でセキュリティ境界を分離したものがコンテナなのだな、というのがじわじわと分かってきます。
後半(Chapter 6~13)
コンテナを使ったアーキテクチャを設計・構築・運用している方ならよく実装されるであろう CI/CD パイプラインやイメージスキャン等について触れられます。また、シークレットの扱いやネットワークの暗号化等、コンテナに限らず一般的に考慮すべき事項についても解説されています。
章ごとの概要と感想
Chapter 1 コンテナセキュリティの脅威
昨今のコンテナ流行とコンテナ脅威モデルなどを解説しています。セキュリティ境界やセキュリティ原則にも触れ、セキュリティに関する前提事項をまとめています。
Chapter 2 Linuxシステムコール、パーミッション、capability
コンテナは Linux OS を実行しているコンピューターで起動されることが多いです。この章では Linux の基本的な機能を説明しています。Linux が得意な方はサッと読み飛ばしてもいいかもしれません。
Chapter 3 コントロールグループ
コンテナを作るための基本的な構成要素の一つであるコントロールグループ(control group、cgroup )について詳細に解説しています。cgroup を適切に設定することで、特定のプロセスが CPU やメモリなどのリソースを独占して他のプロセスの動作に影響を与えるのを防ぐことができます。
本 Chapter に記載されているコマンドをいくつか Amazon Linux 2023 で実行してみました。Amazon Linux 2023 では「cgroup v2」がサポートされているようで、本書に記載されている実行結果とは少し異なった実行結果になります。 cgroup v2 については「3.6 cgroup v2」で解説されていますので、Amazon Linux 2023 で実験される方は先に読んでおくと良いと思います。
Chapter 4 コンテナの分離
本 Chapter では Linux カーネルの機能である namespace について詳細に解説しています。 Chapter 2~3 の Linux の機能を踏まえたうえで本 Chapter を理解すると、「コンテナは Linux カーネルの機能によってセキュリティ境界を分離された 1 プロセスである」ということが腹落ちしてくると思います。
Chapter 5 仮想マシン
Chapter 2~4 ではコンテナの詳細について掘り下げました。本 Chapter では仮想マシン(VM)の仕組みについて詳細に掘り下げて記載されています。
本 Chapter で仮想マシンの特徴を理解すると、「コンテナ間の分離」と「VM の分離」の違いやセキュリティ強度について論理的に説明できるようになるでしょう。
Chapter 6 コンテナイメージ
ここから、コンテナを使ったアーキテクチャに慣れている方にはなじみ深い内容になってくるかと思います。
コンテナイメージの構成、イメージのビルド・格納・取得に関するセキュリティについて解説しています。
Chapter 7 イメージに含まれるソフトウェアの脆弱性
コンテナイメージには多くのパッケージやライブラリが含まれています。これらの依存関係には、悪用される可能性のある脆弱性が隠れていることがあります。本 Chapter ではこれらの脆弱性を特定し、脆弱性を取り込まないための手法や取り除くためのツールを紹介しています。
Chapter 8 コンテナ分離の強化
Chapter 3~5 で「コンテナ間の分離」と「VM の分離」の違いやセキュリティ強度について理解しました。
この Chapter では、VM と比べて弱いとされるコンテナの分離強度を強めるための機能や技術について学べます。
Chapter 9 コンテナエスケープ
コンテナエスケープとは簡単に言うと「分離の無効化」です。ユーザーによってコンテナの分離が簡単に無効化できてしまうことがこの Chapter で語られます。
コンテナの分離を無効化することでサイドカーコンテナが機能していることが分かります。
Chapter 10 コンテナネットワークセキュリティ
コンテナをネットワーク的に分離する考え方が説明されています。
OSI 参照モデルや IP パケットの送信の仕組みから詳細に解説している部分もあり、ネットワーク基礎を履修済みの方はサッと読み飛ばせる章もあります。各レイヤーでどのような技術を用いてネットワークを分離しアクセス制限することができるか解説されています。
「コンテナファイアウォール」という言葉が使われていますが、実は読んでもあまりピンときませんでした。Kubernetes におけるネットワークポリシーについてはコマンド実行結果を用いて詳細に解説されています。サービスメッシュについても触れられています。
Chapter 11 TLSによるコンポーネントの安全な接続
通信の暗号化に必要な証明書の仕組みや TLS 接続の技術について解説されています。履修済みの方はサッと読めると思います。
Chapter 12 コンテナへのシークレットの受け渡し
クレデンシャルの扱いについて解説しています。望ましいシークレットの受け渡しと、セキュリティ的に危険な受け渡し方法について、その理由とともに記載されています。
Chapter 13 コンテナのランタイム保護
ランタイム保護の run-time は「実行時」の意味です。ここではコンテナ実行時に「アプリケーションが想定と異なるプロセスを実行していないか」、「想定外の通信をおこなっていないか」、「想定されたユーザー以外がアクセスしていないか」等を検知する技術について触れられています。ふるまい検知のようなイメージでよさそうです。
Chapter 14 コンテナとOWASPトップ10
OWASP は Open Web Application Security Project のことで、Web アプリケーションを取り巻く課題の解決を目指すオープンなコミュニティです。原著執筆時点の 2017 年時点のリスク Top10 を、コンテナ特有のセキュリティアプローチと関連付けて解説されています。
日本語訳時点での最新版として 2021 年版の OWASP Top 10 が発表されています。こちらも監訳補足として記載されています。
付録A セキュリティチェックリスト
コンテナデプロイメントのセキュリティを確保するために、重要な項目についてチェックリストがあります。コンテナを用いたアーキテクチャを検討または実行されている方は、このチェックリストから対策を始めてみると良さそうです。
感想
例えば AWS 環境でコンテナセキュリティを考えようと思うと、最初は以下のようなパイプラインでそれぞれセキュリテイ対策をする、というのをイメージするのではないかなと思います。少なくとも私はそうでした。
しかし本書ではいきなりこういった内容を説明するのではなく、そもそもコンテナとは、セキュリティの考え方とは、という部分から解説が始まります。上記図のような内容が始まるのは Chapter 6 以降です。
私は Windows Server を使った基幹システムの構築をずっと担当してきたので、Linux についてもそこまで詳しくなく、前半は普段意識しないコンテナの根本技術について読みながら理解するのが大変でした。本書には実際のコマンドも記載されていますので、私は EC2 を立ててその中にコンテナを起動し動作を確認しながら理解に努めました。おかげでよく言われる「コンテナの実態はプロセスである」というのがどういうことなのかようやく腹落ちしたと思います。
コンテナの本質やセキュリティに関する根本的な考え方に迫る内容が多く、すぐに現場で活用するのは難しくとも、じわじわと効いてくるような 遅効性の良書と感じました。
コンテナやセキュリティの深淵に触れてみたい方にお勧めです。本書籍が少しでも気になっている方の参考になれば幸いです。