クラウドネイティブセキュリティとKubernetes
Kubernetesはクラウドネイティブアーキテクチャに基づいており、クラウドネイティブ情報セキュリティのグッドプラクティスに関するアドバイスをCNCFから受けています。
このページを読み進めることで、安全なクラウドネイティブプラットフォームをデプロイするためにKubernetesがどのように設計されているかについての概要を知ることができます。
クラウドネイティブ情報セキュリティ
クラウドネイティブセキュリティに関するCNCFホワイトペーパーでは、さまざまな ライフサイクルフェーズ に適したセキュリティコントロールとプラクティスが定義されています。
Develop ライフサイクルフェーズ
- 開発環境の整合性を確保します。
- 状況に応じて、情報セキュリティのグッドプラクティスに沿ったアプリケーションを設計します。
- エンドユーザーのセキュリティをソリューション設計の一部として考慮します。
これを実現するためには、次のようなことができます:
- 内部の脅威であっても、攻撃対象となる範囲を最小限に抑えるゼロトラストのようなアーキテクチャを採用します。
- セキュリティの懸念を考慮したコードレビュープロセスを定義します。
- システムまたはアプリケーションの 脅威モデル を作成し、信頼境界を特定します。 そのモデルを使用してリスクを特定し、それらのリスクに対処する方法を見つけるのに役立てます。
- ファジング やセキュリティカオスエンジニアリングのような高度なセキュリティ自動化を組み込みます。
Distribute ライフサイクルフェーズ
- 実行するコンテナイメージのサプライチェーンのセキュリティを確保します。
- クラスターとその他のコンポーネントがアプリケーションを実行するためのサプライチェーンのセキュリティを確保します。 他のコンポーネントの例としては、クラウドネイティブアプリケーションが永続性のために使用する外部データベースがあります。
これを実現するためには、次のようなことができます:
- 既知の脆弱性を持つコンテナイメージやその他のアーティファクトをスキャンします。
- ソフトウェアのディストリビューションが、ソフトウェアのソースに対するトラストチェーンを使用して、転送中の暗号化を行うようにします。
- 利用可能になった更新に対応するための依存関係の更新プロセスを採用し、それに従います。
- サプライチェーンを保証するために、デジタル証明書などの検証メカニズムを使用します。
- セキュリティリスクを通知するためのフィードや他のメカニズムにサブスクライブします。
- アーティファクトへのアクセスを制限します。 コンテナイメージをプライベートレジストリに配置し、認証されたクライアントのみがイメージを取得できるようにします。
Deploy ライフサイクルフェーズ
何をデプロイできるか、誰がデプロイできるか、どこにデプロイできるかに関する適切な制限を確保します。 コンテナイメージアーティファクトの暗号化されたアイデンティティを検証するなど、Distribute フェーズからの対策を適用できます。
Kubernetesをデプロイすると、アプリケーションのランタイム環境の基盤、つまりKubernetesクラスター(または複数のクラスター)も設定されます。 ITインフラストラクチャは、より高いレイヤーが期待するセキュリティ保証を提供する必要があります。
Runtime ライフサイクルフェーズ
Runtimeフェーズは、コンピューティング、アクセス、およびストレージの3つの重要な領域から構成されます。
Runtime保護: アクセス
Kubernetes APIはクラスターを機能させるためのものです。 このAPIを保護することは、効果的なクラスターセキュリティを提供するための鍵となります。
Kubernetesドキュメント内の他のページでは、アクセスコントロールの特定の側面を設定する方法について詳しく説明しています。 セキュリティチェックリストには、クラスターの基本的なチェックを行うための提案が記載されています。
さらに、APIアクセスのための効果的な認証と認可を実装することがクラスターのセキュリティを確保することにつながります。 サービスアカウントを使用して、ワークロードとクラスターコンポーネントのセキュリティアイデンティティを提供および管理します。
KubernetesはTLSを使用してAPIトラフィックを保護します。 (ノードとコントロールプレーン間のトラフィックを含めて)TLSを使用してクラスターをデプロイし、暗号化キーを保護してください。 CertificateSigningRequestsにKubernetes独自のAPIを使用する場合は、その悪用を制限するために特に注意を払ってください。
Runtime保護: コンピューティング
コンテナは、異なるアプリケーション間の分離と、それらの分離されたアプリケーションを同じホストコンピューターで実行するメカニズムの2つを提供します。 これらの2つの側面、分離と集約は、ランタイムセキュリティとのトレードオフがあり、適切なバランスを見つける必要があることを意味します。
Kubernetesは実際にコンテナを設定して実行するためにコンテナランタイムに依存しています。 Kubernetesプロジェクトは特定のコンテナランタイムを推奨しておらず、選択したランタイムが情報セキュリティの要件を満たしていることを確認する必要があります。
ランタイムでコンピューティングを保護するために、次のことができます:
アプリケーションのPodのセキュリティ標準を強制することで、アプリケーションが必要な権限のみで実行されるようにします。
コンテナ化されたワークロードを実行するために、特別に設計されたオペレーティングシステムをノード上で実行します。 これは通常、コンテナの実行に不可欠なサービスのみを提供する読み取り専用オペレーティングシステム(イミュータブルイメージ)に基づいています。
コンテナ固有のオペレーティングシステムは、システムコンポーネントを分離し、コンテナエスケープが発生した際の攻撃対象領域を減らすのに役立ちます。
ResourceQuotasを定義して、共有リソースを公平に割り当て、Podがリソース要件を指定できるようにするためにLimitRangesなどのメカニズムを使用します。
異なるノード間でワークロードを分割します。 Kubernetes自体またはエコシステムのいずれかからノードの分離メカニズムを使用して、異なる信頼コンテキストのPodが別個のノードセットで実行されるようにします。
セキュリティ制約を提供するコンテナランタイムを使用します。
Runtime保護: ストレージ
クラスターのストレージとそこで実行されるアプリケーションの保護のために、次のことができます:
- クラスターを、ボリューム保存時の暗号化を提供する外部ストレージプラグインと統合します。
- APIオブジェクトの保存時の暗号化を有効にします。
- バックアップを使用してデータの耐久性を保護します。 必要に応じていつでもこれらを復元できることを確認します。
- クラスターノードとそれが依存するネットワークストレージ間の接続を認証します。
- 自分自身のアプリケーション内でデータ暗号化を実装します。
暗号化キーについては、専用のハードウェア内で生成することで、漏洩リスクに対する最善の保護を提供します。 ハードウェアセキュリティモジュール を使用すると、セキュリティキーを他の場所にコピーすることなく暗号化操作を実施できます。
ネットワークとセキュリティ
ネットワークポリシーやサービスメッシュなどのネットワークセキュリティ対策の検討もまた重要です。 Kubernetesの一部のネットワークプラグインは、仮想プライベートネットワーク(VPN)オーバーレイなどの技術を使用して、クラスターネットワークの暗号化を提供します。 設計上、Kubernetesはクラスターに独自のネットワークプラグインを使用することを許可しています(マネージドKubernetesを使用している場合、クラスターを管理している個人または組織がネットワークプラグインを選択している可能性があります)。
選択したネットワークプラグインとその統合方法は、転送中の情報のセキュリティに大きな影響を与える可能性があります。
オブザーバビリティとランタイムセキュリティ
Kubernetesを使用すると、追加のツールを使用してクラスターを拡張できます。 サードパーティのソリューションをセットアップすることで、アプリケーションと実行中のクラスターを監視またはトラブルシューティングするのに役立ちます。 Kubernetes自体にもいくつかの基本的なオブザーバビリティ機能が組み込まれています。 コンテナ内で実行されるコードは、ログの生成、メトリクスの公開、その他の可観測性データの提供ができます。 デプロイ時に、クラスターが適切な保護レベルを提供していることを確認する必要があります。
メトリクスダッシュボードやそれに類似するものをセットアップする場合、そのダッシュボードにデータを投入する一連のコンポーネントと、ダッシュボード自体を確認してください。 クラスターの機能が低下するようなインシデントが発生している場合でも信頼できるように、全体のチェーンが十分な回復力と整合性保護を備えて設計されていることを確認してください。
必要に応じて、(ログや監査レコードの忠実性を確保するのに役立つ)暗号化されたメジャーブートや認証された時間配分など、Kubernetes自体よりも下位のセキュリティ対策をデプロイしてください。
高い信頼性の環境のために、ログの改ざん防止と機密性を確保するために暗号化保護をデプロイしてください。
次の項目
クラウドネイティブセキュリティ
- クラウドネイティブセキュリティに関するCNCFホワイトペーパー
- ソフトウェアサプライチェーンを保護するためのグッドプラクティスに関するCNCFホワイトペーパー
- Fixing the Kubernetes clusterf**k: Understanding security from the kernel up (FOSDEM 2020)
- Kubernetes Security Best Practices (Kubernetes Forum Seoul 2019)
- Towards Measured Boot Out of the Box (Linux Security Summit 2016)