Kubernetes セキュリティのベストプラクティス

Kubernetes はコンテナの大規模なオーケストレーションと管理に革命をもたらし、クラウドネイティブ アプリケーションをデプロイするためのデファクトスタンダードとなりましたが、その分散アーキテクチャと 本質的な複雑さは、従来のデプロイメントモデルと比較して、攻撃対象領域を大幅に拡大 させます。一般的な Kubernetes クラスタには、相互接続された数十のコンポーネント ——API server、etcd、scheduler、controller manager、kubelet、kube-proxy——が関与し、それぞれが 固有の潜在的な脆弱性と特定のハードニング要件を持っています。pods が絶えず 作成・破棄され、workloads が nodes 間を移行し、ネットワークポリシーをリアルタイムで 適用しなければならない K8s の動的な性質は、セキュリティを多次元的な課題とし、 多層防御のアプローチを必要とします。RBAC における過度に 寛容な権限、pods 間の無制限な通信を許可する network policies の欠如、 特権 capabilities を持つ root として実行されるコンテナ、暗号化されていない etcd に平文で保存される secrets といった安全でないデフォルト設定は、不適切に 構成された K8s 環境で一般的に悪用される攻撃ベクトルを表します。本記事では、Kubernetes クラスタのハードニングに関する基本的なプラクティスを取り上げ、 ロールベースのアクセス制御(RBAC)、pod security standards、マイクロセグメンテーションのための network policies、 安全なシークレット管理、ポリシー適用のための admission controllers、 Falco などのツールによるランタイムセキュリティ監視、そして CIS Kubernetes Benchmark などの業界ベンチマークへの準拠を網羅し、本番環境で安全な Kubernetes クラスタを 構築・運用するための完全なロードマップを提供します。

K8s セキュリティアーキテクチャ

Kubernetes クラスタには複数の重要なコンポーネントがあります:

  • Control Plane: API Server、etcd、scheduler、controller manager
  • Nodes: kubelet、kube-proxy、container runtime
  • Add-ons: DNS、dashboard、ingress controllers

RBAC(Role-Based Access Control)

RBAC は K8s セキュリティの基盤であり、API server を介して誰が何にアクセスできるかを制御します。

RBAC の設定

      # 特定の namespace 内の pods を読み取るための Role
      apiVersion: rbac.authorization.k8s.io/v1
      kind: Role
      metadata:
      namespace: production
      name: pod-reader
      rules:
      - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get", "list"]
      ---
      # RoleBinding は role をユーザーに関連付ける
      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
      name: read-pods
      namespace: production
      subjects:
      - kind: User
      name: jane
      apiGroup: rbac.authorization.k8s.io
      roleRef:
      kind: Role
      name: pod-reader
      apiGroup: rbac.authorization.k8s.io
      

RBAC の原則

  • Least privilege: 必要な権限のみを付与する
  • ClusterAdmin を避ける: 機能ごとに特定の roles を作成する
  • Service accounts: 各 pod は専用の SA を持つべき
  • Namespace isolation: ClusterRoleBindings ではなく RoleBindings を使用する

Pod Security

Pod Security Standards

Kubernetes 1.25+ は非推奨の PSPs に代わり Pod Security Admission を使用します:

  • Privileged: 制限なし、信頼された workloads 向け
  • Baseline: 最小限の制限、既知の権限昇格を防止
  • Restricted: 大幅に制限され、ハードニングのベストプラクティスに従う

Security Context

      apiVersion: v1
      kind: Pod
      metadata:
      name: secure-pod
      spec:
      securityContext:
      runAsNonRoot: true
      runAsUser: 1000
      fsGroup: 2000
      seccompProfile:
      type: RuntimeDefault
      containers:
      - name: app
      image: myapp:latest
      securityContext:
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true
      capabilities:
      drop:
      - ALL
      

Network Policies

デフォルトでは、pods は自由に通信できます。Network Policies はセグメンテーションを実装します:

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
      name: api-allow-from-frontend
      namespace: production
      spec:
      podSelector:
      matchLabels:
      app: api
      policyTypes:
      - Ingress
      ingress:
      - from:
      - podSelector:
      matchLabels:
      app: frontend
      ports:
      - protocol: TCP
      port: 8080
      

シークレット管理

  • secrets を決してハードコードしない: Kubernetes Secrets または外部 vaults を使用する
  • etcd encryption: etcd の encryption-at-rest を有効にする
  • External Secrets Operator: Vault、AWS Secrets Manager と統合する
  • secrets をローテーションする: 自動ローテーションを実装する
  • secrets 向けの RBAC: secrets を読み取れる対象を制限する

Image Security

  • Private registries: 本番環境で public registries を使用しない
  • Image scanning: 脆弱性スキャンに Trivy、Clair、Anchore を使用する
  • Image signing: 完全性を検証するために Cosign を使用する
  • Admission controllers: デプロイ前に images を検証する
  • Distroless images: 攻撃対象領域を最小化する

Admission Controllers

  • OPA/Gatekeeper: コンプライアンスのための Policy-as-code
  • Kyverno: Kubernetes ネイティブのポリシー管理
  • ImagePolicyWebhook: image の署名を検証する
  • ResourceQuota: namespace ごとにリソースを制限する
  • LimitRanger: CPU/メモリの制限を強制する

API Server ハードニング

  • audit logging を有効にする
  • すべての通信に TLS を使用する
  • anonymous auth を無効にする
  • API rate limiting を実装する
  • API server へのアクセスを制限する(network ACLs)

Runtime Security

  • Falco: K8s 向けのランタイム脅威検出
  • Sysdig Secure: ランタイム保護とコンプライアンス
  • Aqua Security: ライフサイクル全体のコンテナセキュリティ

コンプライアンスと監査

  • CIS Kubernetes Benchmark: ハードニングフレームワーク
  • kube-bench: 自動化された CIS コンプライアンスチェック
  • kube-hunter: K8s 向けのペネトレーションテストツール
  • Audit logs: 分析のために SIEM に集約する

Service Mesh Security

Service meshes(Istio、Linkerd)はセキュリティレイヤーを追加します:

  • pods 間の自動 mTLS
  • きめ細かな認可ポリシー
  • 転送中のトラフィック暗号化
  • Observability と auditability

最終的な推奨事項

K8s セキュリティは共有責任です。多層防御を実装してください:RBAC、 network policies、pod security、シークレット管理、ランタイム保護。 自動化されたコンプライアンスツール(kube-bench)を使用し、継続的に監視してください。 チームに K8s セキュリティのトレーニングを行ってください——複雑さには専門的な expertise が必要です。