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

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

01dc8e954957a10b428aa60b28c89d52?s=128

Ian Lewis

March 08, 2018
Tweet

Transcript

  1. Kubernetesのセキュリティ ベストプラクティス ianmlewis@

  2. Ian Lewis • ianlewis@ • Google • Tokyo, Japan •

    #kubernetes, #go, #python
  3. Kubernetes • コンテナ オーケストレーション • インフラ API/ フレームワーク

  4. Guestbookアプリ • Web Frontend ◦ ウェブアプリ ◦ HTML/JS/CSS • Message

    ◦ メッセージを 保存・閲覧 • NGWord ◦ NG ワードを 検出する Kubernetes Cluster Web Frontend Redis NGWord message
  5. Kubernetes API Server 1. フロントエンド Pod から トークンを取得 2. トークンを利用し、

    API サーバーを攻撃 3. シークレットなどを取得 し、さらに サービスを攻撃 Kubernetes Cluster Web Frontend Redis NGWord message ① ② ③
  6. Mitigate 1 & 2: RBAC • Role Based Access Control

    • ユーザーやサービスアカウントへロールを付与 • ロールが権限を持つ ◦ get secrets ◦ update configmap ◦ etc. • RBAC 設定はネームスプペース範囲 • GKE では IAM と連携
  7. Mitigate 1 & 2: RBAC ClusterRole ClusterRoleBinding 1:many many:1 Verb

    + Type
  8. Mitigate 2: API Server Firewall • API サーバーへのアクセスを IP アドレスに制限

    • GKE: ◦ gcloud container clusters create --enable-master-authorized-networks --master-authorized-networks=....
  9. Mitigate 3: Network Policy • データベースへのアクセスを必要のある Pod に制限 • ラブルセレクターで

    Pod を選択 • ネットワークプラグインで実装されてる : Calico, Weave, etc.
  10. NetworkPolicy kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: redis spec: podSelector:

    matchLabels: name: redis ingress: - from: - podSelector: matchLabels: name: guestbook
  11. ホストへアクセス 1. コンテナ外へ突破 2. Kubelet を攻撃 3. 同じホストに実行中の コンテナを攻撃 Host

    Web Frontend
  12. Mitigate 1: non-rootユーザーで実行 apiVersion: v1 kind: Pod metadata: name: security-context-demo

    spec: securityContext: runAsUser: 1000
  13. Mitigate 1: 読込専用ファイルシステム apiVersion: v1 kind: Pod metadata: name: security-context-demo

    spec: securityContext: readOnlyRootFilesystem: true
  14. Mitigate 1: no_new_privs apiVersion: v1 kind: Pod metadata: name: security-context-demo

    spec: securityContext: allowPrivilegeEscalation: false
  15. Mitigate 1: 組み合わせ apiVersion: v1 kind: Pod metadata: name: security-context-demo

    spec: securityContext: runAsUser: 1000 readOnlyRootFilesystem: true allowPrivilegeEscalation: false
  16. Your App Container seccomp Mitigate 1: seccomp/ AppArmor/ SELinux AppArmor/

    SELinux
  17. seccomp apiVersion: v1 kind: Pod metadata: name: mypod annotations: seccomp.security.alpha.kubernetes.io/pod:

    runtime/default ...
  18. AppArmor apiVersion: v1 kind: Pod metadata: name: mypod annotations: container.apparmor.security.beta.kubernetes.io/hello:

    runtime/default spec: containers: - name: hello ...
  19. SELinux apiVersion: v1 kind: Pod metadata: name: mypod spec: securityContext:

    seLinuxOptions: level: "s0:c123,c456" containers: - name: hello ...
  20. Mitigate 2 & 3: Kubeletの権限を制限する • RBAC for Kubelet: ◦

    --authorization-mode=RBAC,Node --admission-control=...,NodeRestriction • Rotate Kubelet certs: ◦ kubelet … --rotate-certificates
  21. Unsecured Pods • You follow the rules but others don't

    Kubernetes Cluster Web Frontend Redis NGWord message
  22. Mitigate: PodSecurityPolicy apiVersion: extensions/v1beta1 kind: PodSecurityPolicy metadata: name: example spec:

    privileged: false # Don't allow privileged pods! # The rest fills in some required fields. seLinux: rule: RunAsAny supplementalGroups: rule: RunAsAny runAsUser: rule: 1000 fsGroup: rule: RunAsAny volumes: - '*'
  23. istio • Service mesh • Envoy proxy 組み込み

  24. トラフィクを傍受 1. ネットーワーク上の通 信を傍受 2. あるサビースに不正リ クエストを送る Kubernetes Cluster Web

    Frontend Redis NGWord message
  25. istio 1. サービス間の プロクシー 2. 暗号化 3. 証明書の自動更新 4. ポリシーが

    セントラルサーバで集 中して管理する Kubernetes Cluster Web Frontend Redis NGWord message
  26. Thanks!