In this article
Kubernetesのセキュリティ:よくある問題とベストプラクティス
クラウドネイティブセキュリティの観点から、Kubernetesのセキュリティ上の問題を詳しく解説します
Kubernetesセキュリティとは?
Kubernetesセキュリティとは、Kubernetesのデプロイ環境の安全性を確保するために従うべき対策、プロセス、原則のことです。これには、コンテナの保護、ワークロードの適切な設定、Kubernetesネットワークのセキュリティ、インフラストラクチャの保護などが含まれます(ただし、これらに限定されません)。
Kubernetesのセキュリティが重要な理由
クラスターやポッドはさまざまな脅威にさらされているため、Kubernetesのセキュリティは重要です。脅威には次のようなものがあります。
悪意のある攻撃者
コンテナ内で実行されるマルウェア
不適切なコンテナイメージ
侵害されたユーザーや不正なユーザー
適切な制御がなければ、アプリケーションに侵入した悪意のある攻撃者が、ホストやクラスター全体の乗っ取りを試みる可能性があります。
開発プロセス全体の中でKubernetesが担う役割
以下の図は、Kubernetesのセキュリティがソフトウェア開発ライフサイクル(SDLC)全体のどこに位置するかを示しています。ビルド後にコードをテストし、脆弱性が本番のKubernetes環境に持ち込まれないようにします。デプロイ後はクラウドインフラストラクチャのセキュリティによって稼働中のアプリケーションを監視し、その知見を開発者にフィードバックします。こうして、コードからクラウドへ、そしてコードへと戻る、継続的なフィードバックループが生まれます。

Kubernetesの主なセキュリティ上の問題
Kubernetesにはさまざまなセキュリティ上の問題がありますが、特に重要なものは次の3つです。
Kubernetesのセキュリティ制御の設定:オープンソースからKubernetesを自分でデプロイする場合、セキュリティ制御は初期状態では設定されていません。その仕組みを把握し、安全に設定する責任はすべて運用者にあります。
ワークロードの安全なデプロイ:セキュリティ制御が事前設定されたKubernetesディストリビューションを使用する場合でも、クラスターとそのセキュリティを自分で構築する場合でも、Kubernetesの詳細に精通していない開発者やアプリケーションチームは、ワークロードを適切に保護するのに苦労することがあります。
組み込みセキュリティの不足:Kubernetesには、安全なクラスターの構築に役立つアクセス制御や機能が用意されていますが、デフォルトの設定が完全に安全とは限りません。クラスターとコンテナを確実に保護するには、ワークロード、クラスター、ネットワーク、インフラストラクチャの設定を適切に変更する必要があります。
Kubernetesのセキュリティ課題と解決策
Kubernetesに組み込まれたセキュリティ機能だけでは、起こり得るすべての問題に対応できません。一方、Kubernetesエコシステムには多様なセキュリティソリューションがそろっています。
特に追加のセキュリティツールが必要となる、Kubernetesの課題領域をいくつかご紹介します。
ワークロードのセキュリティ:Kubernetesワークロードの大半は、containerd、cri-o、Dockerなどのエンジン上で動作するコンテナです。コンテナ内のコードやその他のパッケージに脆弱性がないことが重要です。
ワークロードの設定:Kubernetesマニフェスト、Helm Charts、テンプレートツールのいずれを使用する場合も、Kubernetes上にアプリケーションをデプロイするための設定は通常コードで行います。このコードは、ワークロードの実行方法や侵害発生時に何が起こり得るかを決定するKubernetesのセキュリティ制御に影響します。たとえば、各ワークロードのCPU、メモリ、ネットワークの使用量を想定される最大値に制限すると、侵害の影響を対象のワークロードだけに抑え、他のサービスが侵害されるのを防ぐのに役立ちます。
クラスターの設定:稼働中のクラスターを評価するKubernetesセキュリティツールには、Sysdig、Falco、Prometheusなどがあります。こうしたツールは、監査ログやKubernetesに組み込まれたその他の指標を用いて、KubernetesのセキュリティベストプラクティスやCISなどの関連するセキュリティベンチマークへの準拠状況を確認します。
Kubernetesネットワーク:Kubernetesのセキュリティでは、ネットワークの保護が重要な役割を果たします。ポッド間通信、Ingress、Egress、サービスディスカバリー、必要に応じたサービスメッシュ(Istioなど)をすべて考慮する必要があります。クラスターが侵害されると、ネットワーク内のあらゆるサービスやマシンが危険にさらされます。そのため、サービスとサービス間の通信を必要最小限に分離することが重要です。さらに、暗号技術を用いてマシンやサービスをプライベートにすることで、脅威の封じ込めやネットワーク全体に及ぶ重大な侵害の防止にもつながります。
インフラストラクチャのセキュリティ:分散アプリケーションは、物理または仮想のネットワークやストレージを使って多数のサーバー上で実行されます。Kubernetesインフラストラクチャ、特にマスターノード、データベース、証明書の保護は不可欠です。悪意のある攻撃者がインフラストラクチャへの侵入に成功すれば、クラスターやアプリケーションへのアクセスに必要なあらゆるものを入手するおそれがあります。
こうした課題にはそれぞれ、Kubernetesエコシステムで利用できるセキュリティツールで対処できます。SnykとSysdigのパートナーシップは、コンテナからクラスターまで、Kubernetesセキュリティの各側面に対応する開発者ファーストのツールを提供し、開発者とSecOpsの連携を強化します。Snykは、Snyk ContainerやSnyk Open Sourceなど、SDLC全体で活用できる開発者中心のセキュリティツールを提供しています。開発者ファーストのワークフローとSysdigを組み合わせることで、監査ログを使ってKubernetes環境を監視するSysdigのランタイムインテリジェンスから得た知見を、開発者の普段のワークフローに届けられます。このパートナーシップにより、開発者ファーストのクラウドセキュリティポスチャ管理プラットフォームが初めて実現します。

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に設定してください。capabilities:カーネルレベルの呼び出しへのアクセスを制御します。必要最小限のみを付与してください。readonlyRootFilesystem:可能な場合はtrueに設定してください。攻撃者によるファイルシステムへのソフトウェアのインストールや設定変更を防ぐのに役立ちます。procMount:ネストされたコンテナなど、特別な状況を除き、「Default」設定を使用してください。fsGroup/fsGroupChangePolicy:この設定は慎重に使用してください。fsGroupによるボリュームの所有者変更は、ポッドの起動パフォーマンスに影響し、共有ファイルシステムに悪影響を及ぼす可能性があります。sysctls:特別な要件がない限り、sysctlsによるカーネルパラメーターの変更は避けてください。ホストシステムが不安定になるおそれがあります。

Kubernetesセキュリティの可観測性
K8sのセキュリティでは、安全な設定を使用することでKubernetesのセキュリティ機能を活用できます。また、Kubernetesリソースの可視性を維持するために、効果的な監視プロセスを導入することも重要です。Kubernetesの監視に関するヒントをいくつかご紹介します。
タグとラベルを使用する:メタデータでアプリケーションを定義し、管理を簡素化します。
個々のコンテナではなく、コンテナ全体を監視する:Kubernetesが管理するのはコンテナではなくポッドのため、ポッド単位での監視が重要です。
サービスディスカバリーを活用する:変化しやすいKubernetesサービスの監視に役立ちます。
アラートを活用する:健全なKubernetes環境の条件に基づいてアラートを設定できます。分散システムには監視対象となり得るエンドポイントが多数あるため、アラートの過剰発報には注意してください。
コントロールプレーンを調査する:Kubernetesのコントロールプレーンは、ワークロードやクラスターを管理する航空管制官のような役割を担います。コントロールプレーンの各コンポーネントを調査することで、ジョブの効率的なオーケストレーションとスケジューリングを確保できます。
フェーズ別Kubernetesセキュリティのベストプラクティス
Kubernetesのセキュリティについて、各フェーズで実践できるベストプラクティスをご紹介します。
開発・設計フェーズ
Kubernetes環境によってセキュリティの強度は異なります。マルチクラスターアーキテクチャや、適切なRBAC制御を設定した複数の名前空間を使用すると、ワークロードの分離に役立ちます。
ビルドフェーズ
信頼できるリポジトリから最小限のイメージを選択します。
コンテナスキャンツールを使って、コンテナ内の脆弱性や設定ミスを検出します。
デプロイフェーズ
デプロイ前にイメージをスキャンし、検証してください。
アドミッションコントローラーを使ってこの検証を自動化すれば、信頼性が確認されたコンテナイメージのみをデプロイできます。
ランタイムフェーズ
ランタイム環境は、Kubernetesリソースを守る最後の防御レイヤーです。
Kubernetes APIが生成する監査ログは、Sysdigなどのランタイムセキュリティツールで監視する必要があります。
ランタイム環境でのマルウェアや設定ミスを防ぐため、イメージとポリシーファイルも継続的にスキャンしてください。
Snykを活用したKubernetesセキュリティ
Snyk ContainerやSnyk IaCなどの開発者ファーストのセキュリティツールを活用すれば、Kubernetesのセキュリティポスチャの改善と維持に役立ちます。Snykは、アプリケーションコード、コンテナイメージ、Kubernetes設定のスキャンを自動化し、開発者のワークフロー内で知見や推奨事項を提供します。
「Snykのような製品は、外部の攻撃者から脅威にさらされる可能性のあるサービスの箇所を特定するのに役立ちます」とRizzo氏は説明します。……「SnykがCI/CDパイプラインに組み込まれたことで、開発の早い段階から常にセキュリティチェックを実施できるようになりました。」
Sysdigとのパートナーシップにより、ランタイム環境までセキュリティ機能を拡張できます。
Kubernetesセキュリティに関するよくある質問
Kubernetesはセキュリティリスクですか?
Kubernetesにはセキュリティ機能や設定が用意されていますが、標準状態でセキュリティが確保されているわけではありません。クラスター上で実行されるコンテナとコードを安全に保つには、運用担当者がこれらの制御を設定する必要があります。
アプリケーションを実行するコンテナの設定を開発者が記述する機会が増えているため、Kubernetesのセキュリティを計画に盛り込む必要があります。
Kubernetes Secretsをどのように保護しますか?
Kubernetes Secretsはデフォルトでは暗号化されずに保存されるため、保護するにはまず保存データの暗号化を有効にします。次に、ユーザーの読み取り・書き込み権限を制限し、Secretの変更や新規作成に必要な権限を設定するため、ロールベースのアクセス制御を適用します。
Kubernetesでコンテナを保護するにはどうすればよいですか?
Kubernetesでコンテナを保護するには、信頼できる最小限のベースイメージを選ぶことから始めます。スキャンツールを使って、本番環境へのデプロイ前にコンテナの脆弱性や設定ミスを検出しましょう。デプロイ後は、ランタイム監視ツールで監査ログなどを活用し、実行中のコンテナを継続的に可視化できます。
Kubernetesのセキュリティを維持するにはどうすればよいですか?
Kubernetesにはセキュリティ機能が組み込まれていますが、効果的に機能させるには適切な設定が必要です。セキュリティ対策は設計段階から始まり、安全なアーキテクチャとベースコンテナイメージを選ぶことが重要です。スキャンツールを活用すると、ビルドプロセスを監視し、コンテナを本番環境にリリースする前に脆弱性や設定ミスを検出できます。最後に、ランタイム監視ツールを使って、稼働中のコンテナを可視化し続けます。