"導入"Kubernetesは、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するオープンソースのコンテナオーケストレーションプラットフォームです。サービスディスカバリ、ロードバランシング、オートスケーリングなど、豊富な機能を備えています。クラウドネイティブ分野でKubernetesが広く採用されるにつれ、 「Kubernetesクラスター上で誰がどのような操作を実行できるかを効果的に管理する」ことが非常に重要になっています。この記事では、Kubernetesの認証・認可システムとRBAC認可の原則について簡単に説明します。また、実例を通して、不適切なRBAC管理がもたらすセキュリティリスクを明らかにし、RBACセキュリティの開発と運用に関するベストプラクティス、そしてByteDanceにおける社内セキュリティ保護とガバナンスの経験を共有します。 背景情報
この章では、Kubernetesの認証・認可システムの概要を説明します。これらのメカニズムの背後にある原理を理解することで、様々なシナリオにおけるクラスター権限に関連するセキュリティリスクを理解するのに役立ちます。特に、簡単に悪用される不正アクセスの脆弱性や、権限昇格やラテラルムーブメント攻撃に関連する見落とされがちなリスクについて解説します。 Kubernetes 認証および認可システムKubernetesの認証・認可システムは、主に重要なサービスAPI(APIサーバー、Kubeletサーバー)へのアクセス制御に使用されます。長年の開発を経て、Kubernetesはほとんどのユーザーシナリオのニーズを満たす、比較的包括的な認証・認可メカニズムを実装しました。 APIサーバー Kubernetesは、コンテナ技術をベースとし、宣言型APIサーバーを中心とする分散コンテナオーケストレーションシステムです。Kubernetesのほぼすべての機能はAPIサーバーを通じて公開されます。APIサーバーは複数の認証メカニズムをサポートし、組み込みの認可モードとアドミッションコントローラーを備えているため、ユーザーは必要に応じて柔軟に設定・使用できます。 簡単に言うと、ユーザーがKubernetes APIサーバーにアクセスすると、APIサーバーは有効な認証子を用いてリクエストを順番に認証し、最初に認証に成功したIDに基づいてリクエスト元を識別します。次に、有効な認可子を用いてリクエストの認可ポリシーを確認します。いずれかの認可子がリクエストを明示的に許可または拒否した場合、現在の認可結果が直ちに返されます(いずれの認可子も明示的に承認していない場合、リクエストは拒否されます)。さらに、APIサーバーはリクエストを実際に処理する前に、有効なアドミッションコントローラを用いてリクエストをさらに検証および確認します。すべてのアドミッションコントローラがリクエストを検証した後でのみ、リクエストは処理されます。
Kubelet サーバー Kubernetesのもう一つの重要なコンポーネントはKubeletです。Kubeletは分散システムにおけるエージェントとして機能し、ノード固有のユーザー証明書を使用してAPIサーバーにアクセスし、ノード上のリソースを管理します。また、Kubelet自体もサーバーとして機能し、外部にサービスを提供します。これにより、コンテナ内でのコマンド実行、メトリクス、コンテナログ、ホストマシンログの取得などの機能が可能になります。 Kubernetesは、Kubeletサーバー向けに様々な認証および認可モードを提供しています。特に注目すべきはWebhook認証とWebhook認可です。これらは基本的に、TokenReviewリクエストとSubjectAccessReviewリクエストをAPIサーバーに送信し、クライアントのIDを認証および認可します。 "まとめ" Kubernetesは、様々な認証メカニズム、認可メカニズム、アドミッションコントローラ、そしてAPIサーバーとKubeletサーバー向けの柔軟なカスタムインターフェースをサポートしています。これらのメカニズムは多様なユーザーニーズに対応できる一方で、課題も生じます。これらのメカニズムの原理と悪影響を理解しなければ、クラスターにセキュリティリスクや侵入検知の盲点を容易に作り出す可能性があります。これは特に、容易に悪用される不正アクセスの脆弱性や、見落とされやすい権限昇格やラテラルムーブメント攻撃のリスクに当てはまります。 API サーバーおよび Kubelet サーバーの認証、承認、アクセス制御に関する技術的な詳細については、付録と参考資料を参照してください。 Kubernetes RBAC 認可の原則RBAC は Kubernetes でデフォルトで有効化されている認可メカニズムであり、Kubernetes のコアコンポーネントでも使用されています。ユーザーは、ワークロードのデプロイと保守、そして必要なリソースへのアクセスのために、クラスターの使用時にユーザーアカウントを認可するために RBAC を使用することがよくあります。また、様々なクラウドネイティブアプリケーションのオペレーターやコントローラーも、サービスアカウントを認可するために RBAC を使用することが多く、機能の実行に必要なリソースへのアクセスを確保する必要があります。 次の図は、ユーザー アカウントとサービス アカウントが API サーバーにアクセスする際の認証、承認、およびアクセス制御のプロセスを示しています。 Kubernetes の RBAC 認証システムでは、次の概念が導入されています。 "主題"
"ルール"
「ロールとクラスターロール」
「ロールと ClusterRoleBinding」
上記から、 この特性により、特定のアプリケーションシナリオではRBAC認可メカニズムを使用できません。例えば、すべての既知および未知のCRDリソースへの操作権限を付与しながら、特定の機密性の高い権限を明示的に除外するといったシナリオです。しかし、ABACとWebhook認可パターンをアクセスコントローラーと組み合わせて使用することで、このようなシナリオにおけるサービスアカウントの権限管理が可能になり、これらの問題を軽減できます。 以下は、RBAC 承認メカニズムを使用して ServiceAccount に権限をバインドする例です。 RBAC セキュリティリスク分析Kubernetesは分散コンテナオーケストレーションシステムです。CIS Kubernetesベンチマークの第1章から第4章の要件に対応するAPIサーバーやKubeletサーバーの基本的な認証・認可設定など、Kubernetesの基本コンポーネントの設定のセキュリティを確保するだけでなく、RBAC認証設定もきめ細かく管理する必要があります。 適切なエンティティに適切なRBAC権限を付与することで、クラスタへの不要な安定性とセキュリティリスクの導入を防止できます。一方、不適切な権限設定は、機密データの漏洩、リソースの不正利用、権限昇格、さらにはクラスタ全体のセキュリティを脅かす可能性があります。これらのセキュリティリスクについては、以下で文献とケーススタディを用いてさらに詳しく説明します。 概要Kubernetesでは、リソース操作を通じて情報窃取、権限昇格、ラテラルムーブメントといった攻撃が可能になります。例えば、「pods/exec」リソースの「create」権限は、APIサーバー経由で特定のコンテナ内で任意のコマンドを実行するために利用されます。「nodes/proxy」リソースの「create」権限は、Kubeletサーバーに直接アクセスし、特定のコンテナ内で任意のコマンドを実行するために利用されます。「pods」の「create」権限は、セキュリティリスクのあるコンテナを作成するために利用されます。「pods」の「patch」権限は、特定のPodのコンテナ内でコードを実行するために利用されます。 「Kubernetesの普及に伴い、これらのリスクはクラウドベンダー、PaaSプラットフォーム、クラウドネイティブアプリケーション、SaaS製品においてますます蔓延しています。最良の場合、これらはエクスプロイト後の攻撃に利用されますが、最悪の場合、製品にセキュリティ上の脆弱性をもたらします。」 Palo Alto Networksのセキュリティ研究者は、Kubernetesにおけるすべての機密性の高い権限を詳細に分析し、その危害の種類に応じて分類・等級付けを行いました[2](重大度については、オープンソースプロジェクトrbac-police [3]のリスク権限スキャン戦略セットを参照してください)。下図に示すように、これらの機密性の高い権限の多くは、攻撃者による情報漏洩、権限昇格、横方向の移動などの攻撃に利用され、最終的にはクラスター全体の乗っ取りにつながる可能性があります。 パロアルトネットワークスの調査結果によると、主要なパブリッククラウドおよびCNIベンダーの分析では、約50%のベンダーがコンテナエスケープ後に容易にクラスタの崩壊につながるセキュリティ問題を抱えていることが明らかになりました。さらに25%のベンダーは、コンテナエスケープ後に特定の条件下でクラスタの崩壊につながるセキュリティリスクを抱えています[2]。 公的事例
リスクの例以下の例は、攻撃者が任意のシークレットの作成権限を悪用し、機密性の高い権限を含むServiceAccountのトークンを取得する方法を示しています(ここでは、prometheus-agentのSAトークンを盗むことを例に挙げています)。そのため、必要な権限は専用のネームスペースでロールを使用して定義し、kube-systemなどの機密性の高いネームスペースから分離することをお勧めします。 以下の例は、攻撃者が任意のシークレットに対するget権限を利用して、SAトークンを格納しているシークレットにブルートフォース攻撃を仕掛ける方法を示しています。SAトークンに対するブルートフォース攻撃にはかなりの時間がかかります(ランダムな5つの文字列でSAトークンをブルートフォース攻撃するには最大で27^5回の試行が必要です)。また、この権限は他の既知の名前を持つシークレットを盗むためにも使用される可能性があります。したがって、名前空間全体の任意のシークレットにget権限を付与するのではなく、Rolesを使用してロールを定義するか、resourceNamesを使用してシークレット権限のスコープを制限することをお勧めします。 上記のデータと事例は、Kubernetes RBAC アクセス制御が、真剣に受け止め、タイムリーに効果的に防御する必要があるセキュリティ問題になっていることを示しています。 RBAC セキュリティ開発と運用のベストプラクティスByteDance の社内セキュリティ プラクティスに基づいて、Kubernetes RBAC 権限の管理を全員がガイドし、クラスターにもたらされるセキュリティ リスクを軽減するための RBAC 認証構成の次の原則をまとめました。 最小権限の原則に従うRBACロールに権限を割り当てる際は、最小権限の原則に従い、タスクの実行に必要な最小限の権限のみを付与してください。例:
RBAC 権限の最小化は、「白か黒か」という単純なアプローチとして捉えるべきではありません。コンポーネントの一部の機密性の高い権限を最小化できない場合でも、権限の最小化はリスクを軽減し、侵入検知の可能性を高める上で重要な役割を果たします。 デフォルトのロール/ユーザー/ユーザーグループの使用を避ける通常、KubernetesおよびKubernetesベースのPaaSプラットフォームは、システムが正しく機能することを保証するために、特定のデフォルトロールをデフォルトユーザーおよびユーザーグループに自動的にバインドします。Kubernetesによって作成されるデフォルトロールとバインディングの完全なリストについては、「デフォルトロールとロールバインディング」を参照してください。
ほとんどのデフォルトロール(cluster-admin、edit、system:node など)には広範な権限が付与されています。そのため、セキュリティリスクを認識し、それを許容できる場合を除き、デフォルトロールをサービスアカウントにバインドすることは「推奨しません」 。ユーザーは必要に応じて、デフォルトロールをユーザーアカウントにバインドできます。 さらに、システム ユーザー (system:anonymous、system:serviceaccounts:NAMESPACE:default など) やシステム ユーザー グループ (system:authenticated、system:serviceaccounts など) に追加のロールをバインドすることは、 「避ける」必要があります。これは、意図しない権限の拡散につながり、重大なセキュリティ リスクをもたらす可能性があるためです。 デフォルトのサービス アカウントに権限を付与しないでください。付録1の「アドミッション制御メカニズム」セクションで、ServiceAccountアドミッションコントローラについて説明しました。これはデフォルトで有効になっています。ポッドの作成時にServiceAccountが指定されていない場合、ServiceAccountアドミッションコントローラは名前空間から「default」という名前のServiceAccountをポッドに割り当てます。 したがって、意図しない権限リークが発生する可能性があるため、デフォルトのサービス アカウントに権限を付与することは「避ける」必要があります。 ワイルドカードの使用は避ける
例えば、 機密性の高い権限の使用は避けてください。ロールを設計する前に、権限昇格、コマンド実行、情報漏洩といったセキュリティリスクをもたらす権限を慎重に評価する必要があります。例えば、シークレットの操作権限、証明書発行権限、Pod/Execアクセス権限などです。詳細については、「Kubernetes RBAC - 権限昇格リスク」 [9]および「リスク権限スキャン戦略セット」 [3]を参照してください。 アプリケーションサービスや制御コンポーネントに機密性の高い権限を付与すると、クラスタ全体にセキュリティリスクが生じます。システムの設計・開発段階では、これらの権限の使用は可能な限り避け、セキュリティオーケストレーション、セキュリティ強化、侵入検知のための他の手法と組み合わせて使用する必要があります。 特定のリソースに権限を付与するには、個別のルールを使用するようにしてください。ルールを計画する際には、各ロールに対してより効率的で読みやすく保守しやすいルール設計を採用するために、次の簡単な手順を試すことをお勧めします[4]。
このアプローチにより、同じ動詞を複数のリソースに割り当てるルールを組み合わせ、異なる動詞をリソースに割り当てるルールをそれらの間で分散させることで、より構造化されたルール設計が可能になります[4]。 たとえば、ワークロードで 別の例として、ワークロードに必要な場合... 下の表では、どちらのルール設計も効果的ですが、分割ルールでは必要に応じてリソースのアクセス権限をより細かく制限しています[4]。 セキュリティオーケストレーションなど場合によっては、ビジネスニーズとセキュリティ要件が衝突することがあります。例えば、一部のアプリケーションでは、正常に動作したり必要な機能を提供したりするために、特定の機密性の高い権限が必要になります。このような場合、リスクを最小限に抑えるために、以下のセキュリティオーケストレーションと多層防御戦略を検討することをお勧めします。
専用の名前空間を使用する
「特別なスケジュール戦略を開発する」
「機密コンポーネントを個別に展開する」
「多層防御の構築」
RBAC の安全保護とガバナンスの実践多くの企業は、セキュリティ意識の不足、クラウドネイティブなセキュリティ対策の導入の遅れ、オープンソースのクラウドネイティブアプリケーションの使用などにより、システムに重大なRBAC(ロールベースアクセス制御)リスクをもたらしています。しかし、インフラストラクチャが関与し、関連する知識とツールが不足しているため、これらのリスクの保護と管理はしばしば困難です。次のセクションでは、ByteDanceにおける経験と実践の一部を共有し、さらなる議論を促し、皆様の参考となる知見を提供できれば幸いです。 全体的なアプローチ公開ケーススタディやレッドブルーチーム演習を通じて、Kubernetes RBACの誤った設定が本番環境のセキュリティと安定性に及ぼす可能性のある損害をR&Dチームに示します。DevOpsチームとリスク認識について合意を形成し、ガバナンス目標をトップダウンで整合させます。ガバナンス作業を実施する前に、企業の実情に基づいた合理的な計画を策定する必要があります。同時に、セキュリティチームはガバナンスに必要なナレッジベース、ツール、システムを提供し、運用チームと協力して適切なガバナンスプロセスを構築し、ガバナンス作業の円滑な進行を確保する必要があります。さらに、セキュリティチームは侵入防止機能を継続的に強化し、Kubernetes RBACなどのセキュリティリスクに対するセーフティネットを提供する必要があります。 計画を立てる実用的な計画を策定し、必要なツールとシステムを提供することは、K8s RBAC のセキュリティ リスクを軽減するための重要な前提条件と安全策です。 「データ駆動型」
「優先順位を明確に定義する」
「段階的な制御と既存の是正」
保護とガバナンスのフレームワークByteDanceでは、下図のようなセキュリティ保護とガバナンスのフレームワークを構築し、権限ガバナンスも推進しています。 開発および統合フェーズでは、セキュリティのベストプラクティスを活用し、R&D部門が安全なRBAC権限を設計・開発できるよう支援しました。また、一部のCI/CDパイプラインにセキュリティスキャンを統合し、危険なRBAC設定を含むチャートアーティファクトをインターセプト、アラート、ログに記録できるようにしました。 導入フェーズでは、PaaSプラットフォームとKubernetesアクセスコントローラに統合されたアクセス制御メカニズムを通じて、不正なアプリケーションとリソースを段階的に管理します。また、セキュリティオーケストレーションなどの手法を用いて、重要な業務オペレーションにおいて、機密性の高い権限を持つ制御コンポーネントに関連するセキュリティリスクを軽減します。ここでは、オープンソースプロジェクトKyvernoのポリシーエンジンをベースに、Policy as Codeを実装しました。これにより、パイプライン化されたセキュリティスキャンとアクセス制御におけるポリシーの互換性が確保され、セキュリティポリシーの保守コストが削減されます。 運用中は、オープンソースプロジェクトrbac-policeに基づく定期的なスキャンを通じて、継続的にリスクを特定しています。さらに、サービスアカウントとユーザーアカウントの行動モデリング機能を設計・実装しました。この機能は、アカウントの行動に基づいて最小権限のロール定義を生成し、コンポーネントの権限収束の参考資料として利用できます。すべての機密性の高い権限を修正できるわけではないため、実際にはKubernetes監査ログに基づく侵入検知を実施し、潜在的な攻撃行動を明らかにしています。 上記のメカニズムを通じて、K8s RBAC セキュリティリスクの保護およびガバナンスフレームワークを構築し、ByteDance の大規模本番クラスターの RBAC セキュリティガバナンスと保護に必要な機能を提供しました。 要約RBACはKubernetesにおける重要な認可メカニズムであり、適切なRBAC設定はKubernetesベースのシステムのセキュリティ確保に不可欠です。設計においては、最小権限の原則を遵守し、機密性の高い権限のセキュリティリスクを理解し、必要な保護機能を導入する必要があります。開発においては、過剰な権限付与や権限の混乱を避ける必要があります。セキュリティ保護と運用においては、セキュリティ要件とビジネスニーズのバランスを取り、セキュリティリスクを継続的に軽減し、多層防御システムを確立する必要があります。 この記事の目的は、Kubernetes の権限システム、RBAC 認証モードのセキュリティ リスク、およびセキュリティのベスト プラクティスを読者が理解しやすくし、システムのセキュリティ設計、開発、保護をガイドし、最終的にはより安全で信頼性の高いシステムを構築できるようにすることです。 参考文献
|