アプリケーションセキュリティチェックリスト
このチェックリストは、開発者の観点からKubernetes上で動作するアプリケーションのセキュリティ確保に関する基本的なガイドラインを提供することを目的としています。 このリストは包括的なものではなく、時間の経過とともに発展させていくことを意図しています。
この文書の読み方と使い方について:
- トピックの順序は優先度の順序を反映していません。
- 一部のチェックリスト項目は、各セクションのリストの下の段落で詳しく説明されています。
- このチェックリストでは、
開発者とはKubernetesクラスターのユーザーで、名前空間スコープのオブジェクトを操作する人を想定しています。
注意:
チェックリストだけでは、優れたセキュリティ体制を構築するのに十分ではありません。 優れたセキュリティ体制には継続的な注意と改善が必要ですが、チェックリストはセキュリティ対応という終わりのない道のりにおける最初の一歩となり得ます。 このチェックリストの一部の推奨事項は、ユーザーの特定のセキュリティニーズに対して制限が厳しすぎる場合や、逆に緩すぎる場合があります。 Kubernetesセキュリティは「万能」ではないため、チェックリスト項目の各カテゴリはそのメリットに基づいて評価する必要があります。ベースセキュリティ強化
以下のチェックリストは、Kubernetesにデプロイするほとんどのアプリケーションに適用されるベースセキュリティ強化の推奨事項を提供します。
アプリケーション設計
- アプリケーション設計時に適切なセキュリティ原則に従う。
- リソース要求とリソース制限を通じて適切なQoSクラスでアプリケーションを設定する。
- ワークロードにメモリ制限を設定し、制限はメモリ要求以上の値にする。
- 機密性の高いワークロードにはCPU制限を設定してもよい。
サービスアカウント
-
defaultServiceAccountの使用を避ける。代わりに、各ワークロードまたはマイクロサービス用にServiceAccountを作成する。 - Podの動作にKubernetes APIへのアクセスが特別に必要でない限り、
automountServiceAccountTokenをfalseに設定する。
PodレベルのsecurityContextの推奨事項
-
runAsNonRoot: trueを設定する。 - より低い権限のユーザーでコンテナを実行するよう設定し(例えば、
runAsUserとrunAsGroupを使用する)、コンテナイメージ内のファイルやディレクトリに適切な権限を設定する。 - 永続ボリュームにアクセスする場合は、オプションで
fsGroupを使用して補助グループを追加する。 - アプリケーションは、適切なPodセキュリティの標準が適用された名前空間にデプロイする。アプリケーションをデプロイするクラスターでこの適用を制御できない場合は、ドキュメント化または追加の多層防御を通じてこれを考慮に入れる。
コンテナレベルのsecurityContextの推奨事項
-
allowPrivilegeEscalation: falseを使用して権限昇格を無効にする。 -
readOnlyRootFilesystem: trueでルートファイルシステムを読み取り専用に設定する。 - 特権コンテナの実行を避ける(
privileged: falseを設定)。 - コンテナから全てのケイパビリティを削除し、コンテナの動作に必要な特定のケイパビリティのみを追加し直す。
ロールベースアクセス制御(RBAC)
- create、patch、update、deleteなどの権限は、必要な場合のみ付与する。
- 権限昇格につながる可能性があるロールを作成・更新するRBAC権限の作成を避ける。
-
system:unauthenticatedグループのバインディングを確認し、可能な限り削除する。これにより、ネットワークレベルでAPIサーバーに接続できる全ての人にアクセス権が与えられることを防ぐ。
create、update、deleteの権限は慎重に許可する必要があります。 patch権限をNamespaceに対して許可すると、ユーザーが名前空間やデプロイメントのラベルを更新できるようになり、攻撃対象領域が拡大する可能性があります。
機密性の高いワークロードについては、許可される書き込みアクションをさらに制限する推奨ValidatingAdmissionPolicyの提供を検討してください。
イメージセキュリティ
- Kubernetesクラスターにコンテナをデプロイする前に、イメージスキャンツールを使用してイメージをスキャンする。
- Kubernetesクラスターにデプロイする前に、コンテナ署名を使用してコンテナイメージの署名を検証する。
ネットワークポリシー
- NetworkPolicyを設定して、Podへの内向きのトラフィックとPodからの外向きのトラフィックで、予期されるもののみを許可する。
クラスターがNetworkPolicyを提供し、適用していることを確認してください。 ユーザーが異なるクラスターにデプロイするアプリケーションを作成している場合、NetworkPolicyが利用可能で適用されているとみなすことができるかどうかを確認してください。
高度なセキュリティ強化
このガイドのこのセクションでは、Kubernetes環境の構成に応じて有用となる可能性があるいくつかの高度なセキュリティ強化ポイントについて説明します。
Linuxコンテナセキュリティ
Podとコンテナ用のSecurity Contextを設定する。
ランタイムクラス
- コンテナに適切なランタイムクラスを設定する。
一部のコンテナは、クラスターのデフォルトランタイムが提供するものとは異なる分離レベルを必要とする場合があります。
runtimeClassNameをpodspecで使用して、異なるランタイムクラスを定義できます。
機密性の高いワークロードについては、gVisorなどのカーネルエミュレーションツールや、kata-containersなどのメカニズムを使用した仮想化分離の使用を検討してください。
高い信頼性が要求される環境では、クラスターセキュリティをさらに向上させるために機密仮想マシンの使用を検討してください。
このページの項目は、Kubernetesが必要とする機能を提供するサードパーティー製品またはプロジェクトです。Kubernetesプロジェクトの作者は、それらのサードパーティー製品またはプロジェクトに責任を負いません。詳しくは、CNCFウェブサイトのガイドラインをご覧ください。第三者のリンクを追加するような変更を提案する前に、コンテンツガイドを読むべきです。