Recap: Securing Kubernetes with Admission Controllers

365dfdeb6858bb8b82baedb582bfe1cf?s=47 Takashi Kusumi
January 10, 2019
1k

Recap: Securing Kubernetes with Admission Controllers

Kubernetes Meetup Tokyo #15 - KubeCon 2018 Recap
2019.01.10
https://k8sjp.connpass.com/event/112661/

365dfdeb6858bb8b82baedb582bfe1cf?s=128

Takashi Kusumi

January 10, 2019
Tweet

Transcript

  1. Recap: Securing Kubernetes With Admission Controllers Kubernetes Meetup Tokyo #15

    Takashi Kusumi <tkusumi@zlab.co.jp>
  2. セッション概要 ▶ タイトル: Securing Kubernetes With Admission Controllers ▶ スピーカー:

    Dave Strebel, Microsoft ▶ 主な内容: + Admission Controller の概要 + 動的な Validating & Mutating Webhook の紹介 + Open Policy Agent (OPA) の概要 + kubernetes-policy-controller の紹介&デモ 2
  3. このセッションと⾃分の関わり 3

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

  5. Admission Controller & Webhook

  6. 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
  7. Admission Controller ▶ 様々なリクエストの制御を⾏う機能 + オブジェクト情報を書き換える (Mutating) + オブジェクト情報を検証する (Validating)

    ▶ API Server の引数で有効・無効にするプラグインを指定する + --enable-admission-plugins + --disable-admission-plugins 7
  8. デフォルトの 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 を使えば動的に拡張可能
  9. Webhook による動的な拡張 9 https://schd.ws/hosted_files/kccna18/c5/KubeCon_2018_NA_ppt-1.pdf より引⽤

  10. Webhook によるポリシーの例 ▶ privileged, hostPath などの使⽤を制限する + PodSecurityPolicy でも可能 ▶

    利⽤できるコンテナイメージのレジストリを制限する ▶ Ingress で同⼀の Host 名のデプロイを拒否する ▶ Service で type=LoadBalancer の使⽤を禁⽌する 10
  11. Admission Webhook の課題 ▶ ポリシー以外の実装がそれなりに必要 + HTTP Server & TLS

    + リクエスト、レスポンスの serialize / deserialize ▶ ポリシーを動的に変更するのが難しい 11 ポリシー定義を実装から分離したい
  12. Open Policy Agent

  13. Open Policy Agent (OPA) ▶ 汎⽤的なポリシーエンジン ▶ CNCF の Sandbox

    プロジェクト ▶ 独⾃クエリ⾔語 (Rego) で記述する + 宣⾔的に定義できる ▶ ⼊⼒・出⼒はともに JSON + true/false 以外も返せる 13 Service ! OPA ポリシー (Rego) データ (JSON) ポリシーを 問い合わせ ポリシーの 判断を返す
  14. 独⾃クエリ⾔語 Rego 14 ▶ ポリシーを宣⾔的に記載 ▶ 慣れるまで難しい ▶ 最初の難関 +

    ルール定義 + = の意味 + 同名ルールの意味 + false と undefined Tips: vim 等の Syntax も提供
  15. ルール定義 15 myrule = true { input.method = "POST" input.user_id

    = "alice" } Rule Head ▶ myrule がルール名 ▶ Body が真のとき値が設定 + この場合 true ▶ ⼀致しない場合 undefined ▶ 値は省略できる + デフォルト true Rule Body ▶ AND 条件で判定される ▶ = は Equality のチェック ▶ 順序は関係ない ▶ input は⼊⼒値
  16. 同名ルールの定義 ▶ 同名ルールを定義可能 ▶ ルールは OR 条件 + どれか⼀つ値があれば良い +

    値のコンフリクトは不可 ▶ ⼀致しない場合 undefined + false ではないことに注意 + なので default 値が必要 16 default allow = false allow { input.method = "POST" input.user_id = "alice" } allow { input.method = "GET" }
  17. REST API POST /v1/data/<POLICY_NAME> {"input": <JSON>} 17 1. ポリシー判断の問い合わせ 2.

    判断の結果を返却 200 OK {"result": <JSON>} ▶ ⼊⼒・出⼒ともに JSON。true / false 以外も返却できる ▶ ⼊⼒は `input` という変数でルールから参照できる
  18. kubernetes-policy-controller

  19. Azure/kubernetes-policy-controller ▶ OPA で k8s のポリシーを定義できる Admission Webhook ▶ 現在はアルファ

    ▶ ポリシーは ConfigMap で動的に反映できる + 特定の namespace または label を指定 ▶ kube-mgmt というコンポーネントがキー + k8s オブジェクトとポリシーを OPA に同期 + OPA で管理されているコンポーネント 19
  20. 構成 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 結果
  21. Demo

  22. 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 }
  23. 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"]
  24. まとめ ▶ Admission Webhook を使えば独⾃のポリシーを実装できる + できればポリシー定義を実装から分離したい ▶ Open Policy

    Agent という汎⽤的なポリシーエンジンがある + CNCF の Sandbox プロジェクト + 独⾃クエリ⾔語 Rego は慣れが必要 ▶ kubernetes-policy-controller は OPA でポリシーを定義できる + ConfigMap で OPA ポリシーを動的に適⽤できる 24
  25. We are hiring! bit.ly/zlab-careers