次の方法で共有


Azure Kubernetes Service (AKS) でのアプリケーションとクラスターに対するセキュリティの概念

コンテナーのセキュリティは、ビルドから Azure Kubernetes Service (AKS) で実行されているアプリケーション ワークロードまでのエンドツーエンドのパイプライン全体を保護します。

セキュリティで保護されたサプライ チェーンには、ビルド環境とレジストリが含まれます。

Kubernetes には、ポッド セキュリティ標準シークレットなどのセキュリティ コンポーネントが含まれています。 Azure には、Active Directory、Microsoft Defender for Containers、Azure Policy、Azure Key Vault、ネットワーク セキュリティ グループ、調整されたクラスター アップグレードなどのコンポーネントが含まれています。 AKS は、これらのセキュリティ コンポーネントを組み合わせて以下を実現します。

  • 完全な認証と認可のストーリーを提供します。
  • AKS 組み込み Azure Policy を適用して、アプリケーションをセキュリティで保護します。
  • Microsoft Defender for Containers によるビルドからアプリケーションへのエンドツーエンドの分析情報。
  • AKS クラスターで常に最新の OS セキュリティ更新プログラムと Kubernetes リリースが実行されるようにします。
  • セキュリティで保護されたポッド トラフィックと、機密性の高い資格情報へのアクセスを提供します。

この記事では、AKS 内でアプリケーションをセキュリティで保護する主要な概念について説明します。

ビルドのセキュリティ

サプライ チェーンのエントリ ポイントとして、イメージ ビルドをパイプラインで昇格させる前に、その静的分析を実行することが重要です。 これには、脆弱性とコンプライアンスの評価が含まれます。 これは、脆弱性によるビルドの失敗に関するものではありません。その場合は、開発が中断されてしまいます。 これは、開発チームが対策を行うことができる脆弱性に基づいてセグメント化するためのベンダーの状態の確認に関するものです。 また、開発者に特定された問題を修復するための時間を与える猶予期間も利用します。

レジストリのセキュリティ

レジストリ内のイメージの脆弱性の状態を評価することで、ドリフトが検出され、ビルド環境からのものではないイメージもキャッチされます。 Notary V2 を使用してイメージにシグネチャを添付し、デプロイが信頼できる場所からのものであることを確認します。

クラスターのセキュリティ

AKS の場合、Kubernetes マスター コンポーネントは、Microsoft が提供、管理、および保守するマネージド サービスの一部です。 各 AKS クラスターには、API Server、Scheduler などを提供するための専用のシングルテナント Kubernetes マスターがあります。詳細については、「Azure Kubernetes Serviceの脆弱性管理」を参照してください。

既定では、Kubernetes API サーバーは、パブリック IP アドレスと完全修飾ドメイン名 (FQDN) を使用します。 許可された IP 範囲を使用して、API サーバー エンドポイントへのアクセスを制限できます。 また、フル プライベート クラスターを作成して、API サーバーから仮想ネットワークへのアクセスを制限することもできます。

API サーバーへのアクセスは、Kubernetes のロールベースのアクセス制御 (Kubernetes RBAC) と Azure RBAC を使用して制御できます。 詳細については、Microsoft Entra と AKS の統合に関する記事を参照してください。

ノードのセキュリティ

AKS ノードは、ユーザーが管理および保守する Azure 仮想マシン (VM) です。

  • Linux ノードでは、Ubuntu または Azure Linux の最適化されたバージョンが実行されます。
  • Windows Server ノードは、containerd コンテナー ランタイムを使用して、最適化された Windows Server 2022 リリースを実行します。

AKS クラスターを作成またはスケールアップすると、ノードは自動的に、最新の OS セキュリティ更新プログラムと構成でデプロイされます。

Note

以下を実行する AKS クラスター:

  • Kubernetes バージョン 1.19 以降 - Linux ノード プールの場合、コンテナー ランタイムとして containerd を使います。 Windows Server 2019 と Windows Server 2022 ノード プールの場合、コンテナー ランタイムとして containerd を使用します。 詳しくは、「containerd を使用して Windows Server ノード プールを追加する」をご覧ください。
  • Kubernetes バージョン 1.19 以前 - Linux ノード プールの場合、コンテナー ランタイムとして Docker を使います。

Linux および Windows ワーカー ノードのセキュリティ更新プロセスの詳細については、ノードへのセキュリティ修正プログラムの適用に関するページを参照してください。

Azure Generation 2 VM を実行する AKS クラスターには、トラステッド起動のサポートが含まれています。これは、セキュア ブートや vTPM (信頼されるプラットフォーム モジュールの仮想版) など、非依存で有効にできるテクノロジを組み合わせることで高度かつ執拗な攻撃手法を防御します。 管理者は、検証済みおよび署名済みのブートローダー、OS カーネル、ドライバーを含む AKS ワーカー ノードをデプロイし、基になる VM のブート チェーン全体の整合性を確保できます。

ノードの承認

ノードの認証は、East-West 攻撃から保護するために、kubelet API 要求を明示的に承認する特殊用途の認証モードです。 AKS 1.24 以上のクラスターでは、ノードの認証が既定で有効になっています。

ノードのデプロイ

ノードは、パブリック IP アドレスが割り当てられていないプライベート仮想ネットワーク サブネットにデプロイされます。 トラブルシューティングと管理の目的で、SSH は既定で有効になっており、内部 IP アドレスを使用してのみアクセスできます。 クラスターとノード プールの作成中に、または既存のクラスターまたはノード プールに対して SSH を無効にする機能はプレビュー段階です。 詳細については、SSH アクセスの管理に関する記事を参照してください。

ノード ストレージ

ストレージを提供するために、ノードは Azure Managed Disks を使用します。 ほとんどの VM ノード サイズでは、Azure Managed Disks は高性能 SSD によってサポートされる Premium ディスクです。 マネージド ディスクに格納されたデータは、Azure プラットフォームへの保存時に自動的に暗号化されます。 冗長性を向上させるために、Azure Managed Disks は Azure データ センター内で安全にレプリケートされます。

悪意のあるマルチテナント ワークロード

現在、Kubernetes 環境は悪意のあるマルチテナントの使用に対して安全ではありません。 ポッドのセキュリティ ポリシーやノード用の Kubernetes RBAC などのような追加のセキュリティ機能により、悪用を効率的にブロックします。 悪意のあるマルチテナント ワークロードを実行する場合の真のセキュリティを実現するために、ハイパーバイザーのみを信頼してください。 Kubernetes 用のセキュリティ ドメインは、個々のノードではなく、クラスター全体になります。

この種の悪意のあるマルチテナント ワークロードでは、物理的に分離されたクラスターを使用する必要があります。 ワークロードを分離する方法については、「AKS でのクラスターの分離に関するベスト プラクティス」を参照してください。

コンピューティングの分離

コンプライアンスや規制上の要件により、特定のワークロードでは、他の顧客によるワークロードから高度に分離する必要がある場合があります。 これらのワークロードに対して、Azure には次の機能が用意されています。

  • カーネル分離コンテナー: AKS クラスター内のエージェント ノードとして使用します。 これらのコンテナーは、特定のハードウェアの種類に完全に分離され、Azure Host ファブリック、ホスト オペレーティング システム、ハイパーバイザーからも分離されます。 これらは 1 人の顧客専用です。 AKS クラスターの作成時、またはノード プールの追加時には、ノード サイズとして分離された仮想マシン サイズの 1 つを選択します。
  • 機密コンテナー (プレビュー): Kata Confidential Containers に基づいてコンテナー メモリを暗号化し、計算中のメモリ内のデータがクリア テキストや読み取り可能な形式になったり、改ざんされたりしないようにします。 他のコンテナー グループやポッド、および VM ノードの OS カーネルからコンテナーを分離するのに役立ちます。 機密コンテナー (プレビュー) では、ハードウェア ベースのメモリ暗号化 (SEV-SNP) が使用されます。
  • ポッド サンドボックス: コンテナー アプリケーションと、コンテナー ホストの共有カーネルおよびコンピューティング リソース (CPU、メモリ、ネットワーク) との間の分離境界を提供します。

ネットワークのセキュリティ

オンプレミス ネットワークの接続とセキュリティのために、既存の Azure 仮想ネットワーク サブネットに AKS クラスターをデプロイすることができます。 これらの仮想ネットワークは、Azure サイト間 VPN または Express Route を使用してオンプレミス ネットワークに接続します。 プライベートの内部 IP アドレスを使用して Kubernetes イングレス コントローラーを定義し、内部ネットワーク接続へのサービス アクセスを制限します。

Azure ネットワーク セキュリティ グループ

仮想ネットワークのトラフィック フローをフィルター処理する場合、Azure ではネットワーク セキュリティ グループのルールが使用されます。 これらのルールは、リソースへのアクセスを許可または拒否する発信元と宛先の IP 範囲、ポート、およびプロトコルを定義します。 Kubernetes API サーバーへの TLS トラフィックを許可する、既定の規則が作成されます。 ロード バランサー、ポート マッピング、またはイングレス ルートを使用してサービスを作成します。 AKS は、トラフィック フローのネットワーク セキュリティ グループを自動的に変更します。

(Azure CNI の使用時でも Kubenet の使用時でも) AKS クラスターに独自のサブネットを指定する場合は、AKS が管理する NIC レベルのネットワーク セキュリティ グループを変更しないでください。 代わりに、サブネットレベルのネットワーク セキュリティ グループをさらに作成して、トラフィックのフローを変更します。 ロード バランサーへのアクセス、コントロール プレーンとの通信、またはエグレスなど、クラスターを管理するために必要なトラフィックに干渉しないようにしてください。

Kubernetes ネットワーク ポリシー

クラスター内のポッド間のネットワーク トラフィックを制限するために、AKS では、Kubernetes ネットワーク ポリシーのサポートを提供しています。 ネットワーク ポリシーを使用すると、名前空間とラベル セレクターに基づいて、クラスター内の特定のネットワーク パスを許可または拒否できます。

アプリケーション セキュリティ

AKS で実行されているポッドを保護するには、Microsoft Defender for Containers を検討して、ポッドで実行されているアプリケーションに対するサイバー攻撃を検出して制限します。 継続的なスキャンを実行して、アプリケーションの脆弱性状態のドリフトを検出し、"ブルー/グリーン/カナリア" プロセスを実装して、脆弱なイメージに修正プログラムを適用して置き換えます。

リソースへのコンテナー アクセスをセキュリティで保護する

ユーザーまたはグループに必要最小限の特権を付与するのと同様に、コンテナーも必要なアクションとプロセスのみに制限するようにします。 攻撃のリスクを最小限に抑えるには、昇格された特権またはルート アクセスを必要とするアプリケーションとコンテナーを構成しないようにします。 AppArmorseccomp などの組み込みの Linux セキュリティ機能は、[リソースへのセキュア コンテナー アクセス][secure-container-access] のベスト プラクティスとして推奨されます。

Kubernetes シークレット

Kubernetes シークレットを使用すると、アクセス資格情報やキーなどの機密データをポッドに挿入できます。

  1. Kubernetes API を使用してシークレットを作成します。
  2. ポッドまたはデプロイを定義し、特定のシークレットを要求します。
    • シークレットは、それを必要とするスケジュールされたポッドを持つノードにのみ提供されます。
    • シークレットは tmpfs に格納され、ディスクには書き込まれません。
  3. シークレットを必要とするノードの最後のポッドを削除すると、ノードの tmpfs からシークレットが削除されます。
    • シークレットは、指定した名前空間内に格納され、同じ名前空間内のポッドからのみアクセスできます。

シークレットを使用すると、ポッドやサービスの YAML マニフェストに定義されている機密情報が削減されます。 代わりに、YAML マニフェストの一部として Kubernetes API サーバーに格納されたシークレットを要求します。 この方法により、シークレットへのアクセス権が特定のポッドにのみ提供されます。

注意

生の秘密マニフェスト ファイルには、base64 形式の秘密データが含まれています。 詳細については、公式ドキュメントを参照してください。 これらのファイルは機密情報として扱い、ソース管理にはコミットしないようにしてください。

Kubernetes シークレットは、分散型キー値ストアである etcd に格納されます。 etcd ストアは AKS によって完全に管理されており、データは Azure プラットフォーム内での保存時に暗号化されます

次のステップ

AKS クラスターのセキュリティでの保護を開始するには「AKS クラスターのアップグレード」を参照してください。

関連付けられているベスト プラクティスについては、AKS でのクラスターのセキュリティとアップグレードに関するベスト プラクティスのページと、AKS でのポッドのセキュリティに関するベスト プラクティスのページを参照してください。

コア Kubernetes と AKS の概念に関する詳細については、以下を参照してください。