コンテナのセキュリティ(第 1 回): 3 つの主要領域
Google Cloud Japan Team
アプリケーションのデプロイにコンテナを使用するケースが増えていますが、ポータビリティの高さやスケーリングの単純さ、さらには管理上の負担の軽さを考えればそれも理解できるところです。とはいえ、コンテナ化されたアプリケーションのセキュリティについては、まだ十分に理解されているとは言えません。コンテナのセキュリティは従来の VM とどのように違うのでしょうか。セキュリティを高めるにはコンテナ管理プラットフォームの機能をどのように使えばよいのでしょうか。
この投稿は、Google Cloud Platform(GCP)のコンテナ セキュリティと、Google Kubernetes Engine で実行されるコンテナのセキュリティを確保する方法を紹介する連載記事の第 1 回目です。この連載では次のようなトピックを扱います。
- コンテナ ネットワークのセキュリティ
- Kubernetes Engine 1.10 の新しいセキュリティ機能
- イメージのセキュリティ
- コンテナ ソフトウェア サプライチェーン
- コンテナの実行時セキュリティ
- マルチテナンシー
コンテナのセキュリティは非常に大きなテーマです。連載初回となる今回は、コンテナ セキュリティの概要とともに、コンテナ セキュリティに対する Google の考えについて説明します。
Google はコンテナ セキュリティを 3 つの主要領域に分けて考えています。
- インフラストラクチャのセキュリティ ―― プラットフォームはコンテナに必要なセキュリティ機能を提供しているか? : ユーザー ID、シークレット、およびネットワークを Kubernetes のセキュリティ機能を使って保護する方法です。Google が有する最良のセキュリティ機能でワークロードを保護するにあたり、Kubernetes Engine が IAM や監査ログ、ネットワーキングといった GCP のネイティブ機能をどのように使用しているかということです。
- ソフトウェア サプライチェーンのセキュリティ ―― コンテナ イメージは安全にデプロイできるようになっているか? : コンテナ イメージから脆弱性を取り除き、作成したイメージがデプロイの前に書き換えられないようにすることです。
- 実行時のセキュリティ ―― コンテナを安全に実行できるか? : 本番環境で悪意に満ちた動きをしているコンテナを見つけ出し、ワークロード保護のために対策を講じることです。
この 3 つについて、もう少し詳しく説明しましょう。
インフラストラクチャのセキュリティ
コンテナ インフラストラクチャのセキュリティとは、コンテナ化サービスをセキュアに構築するうえで必要なツールを開発者に確実に提供することです。以下をはじめとする幅広い領域をカバーします。- ID 確認、認証、認可 : コンテナにおいてユーザーの ID を明らかにしてもらい、それが事実であることを確認し、そのユーザーの権限を管理するにはどうすればよいのでしょうか。
- Kubernetes では、kubelet などのリソースへのアクセスを制御するために、RBAC(Role-Based Access Control)できめ細かく権限を指定できます(Kubernetes 1.8 以降、RBAC はデフォルトで有効)。
- Kubernetes Engine ではプロジェクト レベルでの Kubernetes リソースへのアクセス権限を IAM で制御できます。特定のクラスタにおける Kubernetes リソースへのアクセス制限では RBAC も使用できます。
- ロギング : コンテナに対する変更はどのようにしてロギング、監査できるのでしょうか。
- Kubernetes では Audit Logging が自動的に API の監査ログを取得します。イベントがメタデータ、リクエスト、リクエストへのレスポンスのいずれであるかに基づいて、ロギングを設定できます。
- Kubernetes Engine は Cloud Audit Logging と統合されており、Stackdriver Logging や GCP コンソールのアクティビティ画面で監査ログを表示できます。監査対象となることが多い操作はデフォルトでロギングされ、表示やフィルタリングが可能です。
- シークレット : Kubernetes はどのようにしてシークレットを格納し、コンテナ化アプリケーションはどのようにしてそれにアクセスするのでしょうか。
- Kubernetes ではシークレットは etcd に格納され、アプリケーション層で暗号化できます。
- Kubernetes Engine でもシークレットは etcd に格納されますが、データはデフォルトではストレージ層で暗号化されます。Kubernetes Engine は現在、アプリケーション層でシークレットを暗号化していません。
- ネットワーキング : ネットワーク内のコンテナをどのようにセグメント化し、どのようなトラフィック フローを許可すべきでしょうか。
- Kubernetes ではネットワーク ポリシーを使ってポッド ネットワークのセグメント化の方法を指定できます。ネットワーク ポリシーは、特定のポッドが通信できるポッドとエンドポイントを定義します。
- Kubernetes Engine ではクラスタ全体に対してネットワーク ポリシーを作成、管理できます。また、現時点ではベータですが、プライベート IP だけでマスターとノードを定義する限定公開クラスタも作成できます。
これらは、クラスタのセキュリティを開発者の意図どおりに確保するために Kubernetes が使っているツールのごく一部ですが、セキュリティ維持を容易にしてくれます。
ソフトウェア サプライチェーンのセキュリティ
自分で作ったわけではないコンテナ イメージ層を含むソフトウェア サプライチェーンを管理することは、何が環境にデプロイされるのかを正確に把握し、実際にそのとおりになるようにすることを意味します。特に、既知の脆弱性が環境に入り込むのを防ぐため、開発者に対しては、脆弱性がないことがわかっているイメージやパッケージへのアクセスを提供しなければなりません。コンテナはサーバーの OS カーネル上で動作しますが、その環境はサンドボックス化されています。コンテナ イメージには通常、専用の OS ツールとライブラリが含まれます。したがって、ソフトウェアのセキュリティを確保するにあたっては、多数のイメージやパッケージの層を相手にしなければなりません。
- コンテナを実行するホスト OS
- コンテナ イメージとコンテナの実行に必要なすべての依存ファイル。必ずしも自分で構築したイメージではないことに注意が必要です。Docker Hub のようなパブリック リポジトリのコンテナ イメージも含まれます。
- コンテナ内で実行されるアプリケーション コード本体。これはコンテナ セキュリティの範囲外ですが、ベスト プラクティスに従い、既知の脆弱性をスキャンする必要があります。セキュリティ脆弱性の観点からコードを必ず見直すとともに、脆弱性を見つけ出すためにファジングなどの高度なテクニックの導入も検討してください。OWASP Top 10 ウェブ アプリケーション セキュリティ リスクは、何を避けるべきかを知るうえで役に立つサイトです。
実行時のセキュリティ
実行時のセキュリティとは、環境内で実行されているコンテナのセキュリティ上の脅威を見つけ出し、対応できるようにすることです。望ましい機能は以下のとおりです。- システム コールやネットワーク呼び出し、その他の情報を活用し、基準から外れた異常な動作を検出すること
- たとえば、別のネットワークへのコンテナの分離、コンテナの一時停止もしくは再起動による潜在的な脅威の修復
- イベント発生時の詳細なログやコンテナ イメージによるイベントの原因、状況の特定
- 環境内で認められる動作の種類の実行時ポリシーと分離による限定化
これらはいずれも業界全体を通じてまだ初歩的な状態にあり、現時点で実行時セキュリティのために行われていることは多岐にわたります。
コンテナは強力なセキュリティ境界ではない
きちんと否定すべき神話が 1 つあります。コンテナは絶対通り抜けられないセキュリティ境界を作るわけではありませんし、それを目指してもいません。ホスト上のリソースに対するアクセスにある程度の制約を加えるものの、悪意のある攻撃者がそれらの制約をかいくぐって入り込むのを防げるわけではないのです。コンテナと VM はともにアプリケーションをカプセル化しますが、VM はアプリケーションとリソース(その確保も含む)の境界になるのに対し、コンテナはアプリケーションの境界になるだけです。信頼性の低いワークロードを Kubernetes Engine で実行する際に強力なセキュリティ境界が必要な場合は、Google Cloud Platform プロジェクトが提供する分離にフォールバックすべきです。同じノードや同じクラスタ内の別のノードで他のコンテナとともに実行されるマルチテナンシーでうまく共存できるのは、同水準の信頼度を共有するワークロードだけです。
Google Cloud のセキュリティの詳細は、こちらのホワイトペーパーを参照してください。
次回はイメージ セキュリティについて解説する予定です。お楽しみに。
* この投稿は米国時間 3 月 29 日、Security & Privacy の Product Manager である Maya Kaczorowski によって投稿されたもの(投稿はこちら)の抄訳です。
- By Maya Kaczorowski, Product Manager, Security & Privacy