Slide 1

Slide 1 text

Recap: Securing Kubernetes With Admission Controllers Kubernetes Meetup Tokyo #15 Takashi Kusumi

Slide 2

Slide 2 text

セッション概要 ▶ タイトル: Securing Kubernetes With Admission Controllers ▶ スピーカー: Dave Strebel, Microsoft ▶ 主な内容: + Admission Controller の概要 + 動的な Validating & Mutating Webhook の紹介 + Open Policy Agent (OPA) の概要 + kubernetes-policy-controller の紹介&デモ 2

Slide 3

Slide 3 text

このセッションと⾃分の関わり 3

Slide 4

Slide 4 text

現状 ValidatingAdmissionWebhook で 社内ポリシーを実装しているので、 Open Policy Agent でそれができたら シンプルになって嬉しい

Slide 5

Slide 5 text

Admission Controller & Webhook

Slide 6

Slide 6 text

Admission Controller 6 認証 (AuthN) 認可 (AuthZ) Admission Controller plugin 1 plugin 2 plugin 3 plugin 1 plugin 2 plugin 3 plugin 1 plugin 2 plugin 3 UserID / Group を取得 Allow / Deny 様々なリクエスト制御 6

Slide 7

Slide 7 text

Admission Controller ▶ 様々なリクエストの制御を⾏う機能 + オブジェクト情報を書き換える (Mutating) + オブジェクト情報を検証する (Validating) ▶ API Server の引数で有効・無効にするプラグインを指定する + --enable-admission-plugins + --disable-admission-plugins 7

Slide 8

Slide 8 text

デフォルトの Admission Controller 1. NamespaceLifecycle 2. LimitRanger 3. ServiceAccount 4. PersistentVolumeClaimResize 5. DefaultStorageClass 8 6. DefaultTolerationSeconds 7. MutatingAdmissionWebhook 8. ValidatingAdmissionWebhook 9. ResourceQuota 10.Priority Kubernetes v1.13 では 10 個のプラグインがデフォルトで有効 Mutating, Validating Webhook を使えば動的に拡張可能

Slide 9

Slide 9 text

Webhook による動的な拡張 9 https://schd.ws/hosted_files/kccna18/c5/KubeCon_2018_NA_ppt-1.pdf より引⽤

Slide 10

Slide 10 text

Webhook によるポリシーの例 ▶ privileged, hostPath などの使⽤を制限する + PodSecurityPolicy でも可能 ▶ 利⽤できるコンテナイメージのレジストリを制限する ▶ Ingress で同⼀の Host 名のデプロイを拒否する ▶ Service で type=LoadBalancer の使⽤を禁⽌する 10

Slide 11

Slide 11 text

Admission Webhook の課題 ▶ ポリシー以外の実装がそれなりに必要 + HTTP Server & TLS + リクエスト、レスポンスの serialize / deserialize ▶ ポリシーを動的に変更するのが難しい 11 ポリシー定義を実装から分離したい

Slide 12

Slide 12 text

Open Policy Agent

Slide 13

Slide 13 text

Open Policy Agent (OPA) ▶ 汎⽤的なポリシーエンジン ▶ CNCF の Sandbox プロジェクト ▶ 独⾃クエリ⾔語 (Rego) で記述する + 宣⾔的に定義できる ▶ ⼊⼒・出⼒はともに JSON + true/false 以外も返せる 13 Service ! OPA ポリシー (Rego) データ (JSON) ポリシーを 問い合わせ ポリシーの 判断を返す

Slide 14

Slide 14 text

独⾃クエリ⾔語 Rego 14 ▶ ポリシーを宣⾔的に記載 ▶ 慣れるまで難しい ▶ 最初の難関 + ルール定義 + = の意味 + 同名ルールの意味 + false と undefined Tips: vim 等の Syntax も提供

Slide 15

Slide 15 text

ルール定義 15 myrule = true { input.method = "POST" input.user_id = "alice" } Rule Head ▶ myrule がルール名 ▶ Body が真のとき値が設定 + この場合 true ▶ ⼀致しない場合 undefined ▶ 値は省略できる + デフォルト true Rule Body ▶ AND 条件で判定される ▶ = は Equality のチェック ▶ 順序は関係ない ▶ input は⼊⼒値

Slide 16

Slide 16 text

同名ルールの定義 ▶ 同名ルールを定義可能 ▶ ルールは OR 条件 + どれか⼀つ値があれば良い + 値のコンフリクトは不可 ▶ ⼀致しない場合 undefined + false ではないことに注意 + なので default 値が必要 16 default allow = false allow { input.method = "POST" input.user_id = "alice" } allow { input.method = "GET" }

Slide 17

Slide 17 text

REST API POST /v1/data/ {"input": } 17 1. ポリシー判断の問い合わせ 2. 判断の結果を返却 200 OK {"result": } ▶ ⼊⼒・出⼒ともに JSON。true / false 以外も返却できる ▶ ⼊⼒は `input` という変数でルールから参照できる

Slide 18

Slide 18 text

kubernetes-policy-controller

Slide 19

Slide 19 text

Azure/kubernetes-policy-controller ▶ OPA で k8s のポリシーを定義できる Admission Webhook ▶ 現在はアルファ ▶ ポリシーは ConfigMap で動的に反映できる + 特定の namespace または label を指定 ▶ kube-mgmt というコンポーネントがキー + k8s オブジェクトとポリシーを OPA に同期 + OPA で管理されているコンポーネント 19

Slide 20

Slide 20 text

構成 20 ▶ policy-controller + Admission Webhook ▶ kube-mgmt + k8s 情報を OPA に同期 + k8s object (データ) + ConfigMap (ポリシー) ▶ open-policy-agent + ポリシーを判断 OPA kube-apiserver controller kube-mgmt ポリシー 問い合わせ ポリシー 判断 k8s object と ポリシーを同期 k8s object と ポリシーをwatch Admission Webhook Admission 結果

Slide 21

Slide 21 text

Demo

Slide 22

Slide 22 text

Demo: privileged container の禁⽌ 22 package admission import data.k8s.matches deny[{ "id": "deny-privileged", "resource": {"kind": "pods", "namespace": namespace, "name": name}, "resolution": {"message": "privileged container is not allowed"}, }] { matches[["pods", namespace, name, matched_pods]] # privileged コンテナを拒否する matched_pods.spec.containers[_].securityContext.privileged }

Slide 23

Slide 23 text

Demo: ポリシーの設定例 23 # ポリシー設定前は Pod が作れる (その後 Pod は削除しておく) $ kubectl create -f privileged-pod.yaml pod/privileged-pod created # ポリシーを ConfigMap で設定 $ kubectl create configmap deny-privileged --from-file deny- privileged.rego -n opa # ポリシー設定後は privileged な Pod が禁止されている $ kubectl create -f privileged-pod.yaml Error from server: ... ["privileged container is not allowed"]

Slide 24

Slide 24 text

まとめ ▶ Admission Webhook を使えば独⾃のポリシーを実装できる + できればポリシー定義を実装から分離したい ▶ Open Policy Agent という汎⽤的なポリシーエンジンがある + CNCF の Sandbox プロジェクト + 独⾃クエリ⾔語 Rego は慣れが必要 ▶ kubernetes-policy-controller は OPA でポリシーを定義できる + ConfigMap で OPA ポリシーを動的に適⽤できる 24

Slide 25

Slide 25 text

We are hiring! bit.ly/zlab-careers