Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

Ian Lewis ● ianlewis@ ● Google ● Tokyo, Japan ● #kubernetes, #go, #python

Slide 3

Slide 3 text

Kubernetes ● コンテナ オーケストレーション ● インフラ API/ フレームワーク

Slide 4

Slide 4 text

Guestbookアプリ ● Web Frontend ○ ウェブアプリ ○ HTML/JS/CSS ● Message ○ メッセージを 保存・閲覧 ● NGWord ○ NG ワードを 検出する Kubernetes Cluster Web Frontend Redis NGWord message

Slide 5

Slide 5 text

Kubernetes API Server 1. フロントエンド Pod から トークンを取得 2. トークンを利用し、 API サーバーを攻撃 3. シークレットなどを取得 し、さらに サービスを攻撃 Kubernetes Cluster Web Frontend Redis NGWord message ① ② ③

Slide 6

Slide 6 text

Mitigate 1 & 2: RBAC ● Role Based Access Control ● ユーザーやサービスアカウントへロールを付与 ● ロールが権限を持つ ○ get secrets ○ update configmap ○ etc. ● RBAC 設定はネームスプペース範囲 ● GKE では IAM と連携

Slide 7

Slide 7 text

Mitigate 1 & 2: RBAC ClusterRole ClusterRoleBinding 1:many many:1 Verb + Type

Slide 8

Slide 8 text

Mitigate 2: API Server Firewall ● API サーバーへのアクセスを IP アドレスに制限 ● GKE: ○ gcloud container clusters create --enable-master-authorized-networks --master-authorized-networks=....

Slide 9

Slide 9 text

Mitigate 3: Network Policy ● データベースへのアクセスを必要のある Pod に制限 ● ラブルセレクターで Pod を選択 ● ネットワークプラグインで実装されてる : Calico, Weave, etc.

Slide 10

Slide 10 text

NetworkPolicy kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: redis spec: podSelector: matchLabels: name: redis ingress: - from: - podSelector: matchLabels: name: guestbook

Slide 11

Slide 11 text

ホストへアクセス 1. コンテナ外へ突破 2. Kubelet を攻撃 3. 同じホストに実行中の コンテナを攻撃 Host Web Frontend

Slide 12

Slide 12 text

Mitigate 1: non-rootユーザーで実行 apiVersion: v1 kind: Pod metadata: name: security-context-demo spec: securityContext: runAsUser: 1000

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

Mitigate 1: no_new_privs apiVersion: v1 kind: Pod metadata: name: security-context-demo spec: securityContext: allowPrivilegeEscalation: false

Slide 15

Slide 15 text

Mitigate 1: 組み合わせ apiVersion: v1 kind: Pod metadata: name: security-context-demo spec: securityContext: runAsUser: 1000 readOnlyRootFilesystem: true allowPrivilegeEscalation: false

Slide 16

Slide 16 text

Your App Container seccomp Mitigate 1: seccomp/ AppArmor/ SELinux AppArmor/ SELinux

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

SELinux apiVersion: v1 kind: Pod metadata: name: mypod spec: securityContext: seLinuxOptions: level: "s0:c123,c456" containers: - name: hello ...

Slide 20

Slide 20 text

Mitigate 2 & 3: Kubeletの権限を制限する ● RBAC for Kubelet: ○ --authorization-mode=RBAC,Node --admission-control=...,NodeRestriction ● Rotate Kubelet certs: ○ kubelet … --rotate-certificates

Slide 21

Slide 21 text

Unsecured Pods ● You follow the rules but others don't Kubernetes Cluster Web Frontend Redis NGWord message

Slide 22

Slide 22 text

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: - '*'

Slide 23

Slide 23 text

istio ● Service mesh ● Envoy proxy 組み込み

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

istio 1. サービス間の プロクシー 2. 暗号化 3. 証明書の自動更新 4. ポリシーが セントラルサーバで集 中して管理する Kubernetes Cluster Web Frontend Redis NGWord message

Slide 26

Slide 26 text

Thanks!