Kubernetes セキュリティ: 一般的な問題とベストプラクティス
Kubernetes のセキュリティ問題について、クラウドネイティブセキュリティの文脈で詳しく説明します。
Kubernetes セキュリティとは
Kubernetes セキュリティは、Kubernetes のデプロイメントにおいてセキュリティを確保するために従うべき行動、プロセス、原則と定義されます。これには、コンテナのセキュリティ確保、ワークロードの正しい設定、Kubernetes のネットワークセキュリティ、インフラのセキュリティなどが含まれますが、これらに限定されるものではありません。
Kubernetes のセキュリティが重要となる理由
クラスターとポッドが直面する以下のようなさまざまな脅威のため、Kubernetes のセキュリティは重要です。
悪意のあるアクター
コンテナ内で動作するマルウェア
破損したコンテナイメージ
侵害されたユーザーまたは不正なユーザー
適切な処置を講じていない場合、アプリケーションに侵入した悪意のあるアクターは、ホストやクラスター全体の管理の掌握を試みる可能性があります。
開発プロセス全体の中で、Kubernetes はどのような位置付けになりますか
以下の図では、Kubernetesセキュリティが全体的なソフトウェア開発ライフサイクル (SDLC) のどこに位置付けられるかが示されています。コードをビルド段階以降にテストし、脆弱性が稼働中の Kubernetes 環境に流出しないようにします。デプロイメントとクラウドインフセキュリティにより、実行中のアプリケーションがモニタリングされ、開発者にインサイトが返されます。これにより、コードからクラウドへのポジティブなフィードバックループが形成され、コードに戻ります。
Kubernetes に関する主なセキュリティ問題
Kubernetes のセキュリティ問題は数多く存在しますが、その中でも特に重要なのは以下の 3 つです。
Kubernetes のセキュリティコントロールの設定:オープンソースの Kubernetes のデプロイを行う際、デフォルトでセキュリティコントロールが設定されているわけではありません。それらがどのように動作し、どのように安全に設定するかを理解することは、完全にオペレーターの責任です。
ワークロードの安全なデプロイ:セキュリティコントロールが設定済みの Kubernetes ディストリビューションを使用する場合でも、クラスタとそのセキュリティを自分で構築する場合でも、Kubernetes の詳細を把握していない開発者やアプリケーションチームは、ワークロードのセキュリティを適切に確保することに苦労するかもしれません。
組み込みセキュリティがないこと:Kubernetes は安全なクラスターの作成に役立つアクセスコントロールや機能を提供していますが、デフォルト設定だけで 100% セキュリティを確保できるわけではありません。組織は、Kubernetes クラスタおよびコンテナの完全なセキュリティを確保するために、ワークロード、クラスタ、ネットワーキング、およびインフラの構成に適切な変更を加える必要があります。
Kubernetes のセキュリティ課題と解決策
Kubernetes の組み込みセキュリティソリューションはすべての潜在的な問題をカバーしているわけではありませんが、Kubernetes エコシステム内にはセキュリティソリューションが数多く存在しています。
Kubernetes の中でも特にセキュリティツールを必要とする難しい分野には、以下のようなものがあります。
ワークロードセキュリティ:Kubernetes ワークロードの大部分は、containerd、cri-o、Docker などのエンジン上で実行されるコンテナです。コンテナに含まれるコードやその他のパッケージは、脆弱性がないものでなければなりません。
ワークロード設定:Kubernetes マニフェスト、Helm チャート、テンプレートツールのいずれを使用するときも、Kubernetes にアプリケーションをデプロイする設定は通常、コードで行われます。このコードは、ワークロードの実行方法や脆弱性に起因するインシデントが発生した際に何ができ、何ができないかを決定する Kubernetes のセキュリティコントロールに影響を及ぼします。たとえば、各ワークロードの CPU、メモリ、ネットワークを予想される最大使用量に制限することで、脆弱性に起因するインシデントの発生を該当するワークロードのみに抑え、他のサービスでの発生を防ぐことができます。
クラスター構成:実行中のクラスターでは、Sysdig、FalcoPrometheus など、Kubernetesセキュリティ評価ツールをいくつか利用できます。これらのツールには、監査ログやその他のKubernetes に組み込まれたメトリクスを使用して、Kubernetes のセキュリティ対策や CIS など、その他の関連するセキュリティベンチマークに準拠しているかどうかをチェックする機能が含まれています。
Kubernetes ネットワーキング:Kubernetes に関してはネットワークのセキュリティの確保が重要な役割を果たします。ポッド間通信、イングレス、イグレス、サービスディスカバリー、そして必要に応じてサービスメッシュ (Istio など) をすべて考慮する必要があります。クラスターで脆弱性に起因するインシデントが発生すると、ネットワーク上のすべてのサービスやマシンが危険にさらされます。そのため、サービスやサービス間の通信を必要なものだけに分離しておくことが重要です。それに加えて、暗号化を使用してマシンやサービスを非公開にすることで、脅威を抑制し、ネットワーク全体で発生する脆弱性に起因する重大なインシデントを防ぐことができます。
インフラのセキュリティ確保:分散型アプリケーションは多数のサーバー上で実行されるため (物理的または仮想的なネットワーキングとストレージを使用)、特にマスターノード、データベース、および証明書などの Kubernetes インフラのセキュリティを確保することが重要になります。悪意のあるアクターがインフラへの侵入に成功した場合、クラスターやアプリケーションのアクセスに必要なものすべての情報にアクセスできるようになります。
これらの課題は、Kubernetes エコシステムで利用可能なセキュリティツールを使用することで対処できます。Snyk と Sysdig のパートナーシップにより、コンテナからクラスターまでの Kubernetes セキュリティの各側面で開発者ファーストのツールが提供され、開発者と SecOps の緊密な連携が実現しています。Snyk は、Snyk Container や Snyk Open Source など、SDLC 全体で機能する開発者中心のセキュリティ ツールを提供しています。こうした開発者ファーストのワークフローと Sysdig を組み合わせることで、Sysdig のランタイムインテリジェンス (監査ログを利用した Kubernetes 環境のモニタリング) からのインサイトを、通常のワークフローの中で開発者にフィードバックできるようになっています。このパートナーシップにより、開発者ファーストのクラウドセキュリティ態勢管理プラットフォームが初めて実現されます。
Kubernetes ホストのセキュリティ確保
クラウドホストは、Kubernetes 環境の最終レイヤーを表します。代表的なクラウド事業者は Google Kubernetes Engine (GKE)、Azure Kubernetes Service (AKS)、および Amazon の Elastic Kubernetes Service (EKS) など、Kubernetes リソースの管理ツールを提供していますが、セキュリティは依然として責任共有モデルで運用されています。
Kubernetes ホストを脆弱性から守るには、いくつかの方法があります。
ワークロードレイヤーのセキュリティを確保する:コンテナイメージに脆弱性がなく、適切に設定されていることを確認します (特権付きコンテナを許可しない、など)。
ワークロードとホストの間に境界を作る:コンテナの特権を制限して、ホストリソースへのアクセスを制限し、脆弱性に起因するインシデントが発生した際にリソース使用量を制限するようにランタイム環境を設定できます。
実行中のクラスターをモニタリングする:監査ログはモニタリングして、設定ミスや不審な動作を見分ける必要があります。
実装すべき Kubernetes のセキュリティコンテキスト設定
ポッドとクラスターが Kubernetes システムの残りの部分にアクセスするのを防ぐ方法の 1 つに securityContexts
を使用する方法があります。すべてのポッドとコンテナで使用する必要がある 10 種類の主なセキュリティコンテキスト設定を以下に示します。
runAsNonRoot
:「true」に設定することで、コンテナが root ユーザーで実行されることを防ぎます。runAsUser
/runAsGroup
:これにより、コンテナで指定したランタイムユーザーとグループを確実に使用できます。seLinuxOptions
:コンテナまたはポッドの SELinux コンテキストを設定します。seccompProfile
:これにより、Linux カーネルに seccomp プロファイルを設定して、コンテナで実行できることを制限できます。privileged
/allowPrivilegeEscalation
:一般に、特権付きコンテナを許可したり、コンテナ内のプロセスによる特権の昇格を許可したりすることは推奨されないため、これらは false に設定する必要があります。機能
:これにより、カーネルレベルの呼び出しへのアクセスを制御できます。必要最小限で提供してください。readonlyRootFilesystem
:これは可能な限り true に設定します。これは、ハッカーがファイルシステムにソフトウェアをインストールしたり、設定を変更したりするのを防ぐために役立ちます。procMount
:ネストされたコンテナなど特定の状況を除いて、「デフォルト」設定を使用する必要があります。fsGroup
/fsGroupChangePolicy
:fsGroup
を使用してボリュームの所有権を変更すると、ポッドの起動パフォーマンスに影響を与え、共有ファイルシステムに悪影響を与える可能性があるため、この設定は慎重に使用する必要があります。sysctls
:sysctls
を使用したカーネルパラメータの変更は、ホストシステムが不安定になる可能性があるため、特別な要件がない限り避けてください。
Kubernetes セキュリティのオブザーバビリティ
K8s のセキュリティに関しては、セキュアな設定を使用することで、Kubernetes のセキュリティ機能を活用できます。また、効果的なモニタリングプロセスを使用して、Kubernetes リソースの可視性を維持することも重要です。Kubernetes のモニタリングに関するヒントをいくつかご紹介します。
タグやラベルを使用する:管理を簡素化するためメタデータを使用してアプリケーションを定義できます。
個別のコンテナではなく、コンテナセット全体をモニタリングする:Kubernetes はコンテナではなくポッドを管理するため、ポッドレベルでモニタリングすることが重要です。
サービスディスカバリーを使用する:これにより、Kubernetes サービスの不安定な性質にもかかわらず、モニタリングが可能になります。
アラートを活用する:アラートは、健全な Kubernetes 環境の定義に基づいて設定できます。分散型システムでは、モニタリング可能なエンドポイントが多数存在するため、アラートが過剰にならないように注意してください。
コントロールプレーンを検査する: Kubernetesのコントロールプレーンは、ワークロードとクラスタの航空管制官のように振る舞います。コントロールプレーンの各コンポーネントを検査することは、ジョブのオーケストレーションやスケジューリングを効率的に行うのに役立ちます。
フェーズ別の Kubernetes セキュリティのベストプラクティス
Kubernetes のセキュリティに関しては、フェーズごとにベストプラクティスがいくつかあります。
開発/設計フェーズ
一部の Kubernetes 環境のセキュリティは他の環境のセキュリティよりも強化できます。複数のクラスターアーキテクチャや適切な RBAC コントロールを使用して複数のネームスペースを使うことでワークロードを分離することができます。
ビルドフェーズ
検証済みのリポジトリから最小限のイメージを選択します。
コンテナスキャンツールを使用して、コンテナの脆弱性や設定ミスを検出できます。
デプロイメントフェーズ
イメージは導入前にスキャンして検証する必要があります。
アドミッションコントローラーを使用すると、この検証を自動化して、検証済みのコンテナイメージのみが導入されるようにできます。
ランタイムフェーズ
ランタイム環境は、Kubernetes リソースの最終的な防御層となります。
Kubernetes API は、Sysdig などのランタイムセキュリティツールを使用してモニタリングする必要がある監査ログを生成します。
ランタイム環境でのマルウェアや設定ミスを防ぐために、イメージとポリシーファイルも継続的にスキャンする必要があります。
Kubernetes のセキュリティについての詳細情報
Kubernetes のセキュリティについては、以下のリソースを確認して学習を進めてください。
さらに、Snyk は Snyk Container や Snyk IaC など開発者ファーストのセキュリティツールを提供することで Kubernetes のセキュリティ態勢の改善と維持を支援しています。Snyk は、アプリケーションコード、コンテナイメージ、Kubernetes 設定のスキャンを自動化し、ワークフロー内で開発者にインサイトと推奨を提供しています。
「Snyk のような製品は、外部からの脅威にさらされる可能性のあるサービスの領域を特定するのに役立ちます(...中略...) Snyk が CI/CD パイプラインの一部になったことで、セキュリティチェックは常に開発の早い段階で行われるようになりました」
最近のSysdig との提携により、当社のセキュリティ機能がランタイム環境にも拡張されました。
Kubernetes セキュリティについてのよくある質問
Kubernetes にはセキュリティリスクがありますか?
Kubernetes が提供しているセキュリティ機能や設定は役立ちますが、最初からセキュリティが組み込まれているわけではありません。クラスタ上で動作するコンテナやコードの安全性を確保するため、オペレーターがコントロールを設定する必要があります。
開発者がアプリケーションを実行するコンテナの設定を記述することが増えていることを考えると、Kubernetes のセキュリティを計画に含める必要があります。
Kubernetes Secret を保護するには
デフォルトでは、Kubernetes Secrets は暗号化されずに保存されるため、保存時の暗号化を有効にすることがシークレットのセキュリティを確保する最初のステップになります。次に、ロールベースのアクセスコントロールを適用して、ユーザーの読み取りと書き込みの機能を制限し、シークレットの変更または新規作成に関する権限を設定する必要があります。
Kubernetes でコンテナのセキュリティを確保するには
Kubernetes コンテナセキュリティは、信頼できる最小限のベースイメージを選択することから始まります。コンテナを本番環境にデプロイする前に、スキャンツールを使用してコンテナの脆弱性や設定ミスを発見する必要があります。そして、ランタイムモニタリングツールで監査ログやその他の方法を使用して、実行中のコンテナの可視性を維持できます。
Kubernetes でセキュリティを維持するには
Kubernetes にはセキュリティが組み込まれていますが、効果的に動作させるためには適切な設定が必要です。セキュリティは設計段階で、セキュアなアーキテクチャとベースコンテナイメージを選択することから始まります。スキャンツールは、ビルドプロセスをモニタリングし、コンテナが本番稼働する前に脆弱性や設定ミスを発見するのに役立ちます。最後に、ランタイムモニタリングツールは、実行中のコンテナを可視化するのに役立ちます。