Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Recap: Securing Kubernetes with Admission Controllers
Search
Takashi Kusumi
January 10, 2019
2
1.4k
Recap: Securing Kubernetes with Admission Controllers
Kubernetes Meetup Tokyo #15 - KubeCon 2018 Recap
2019.01.10
https://k8sjp.connpass.com/event/112661/
Takashi Kusumi
January 10, 2019
Tweet
Share
More Decks by Takashi Kusumi
See All by Takashi Kusumi
Recap: eBPF セッションつまみ食い / eBPF sessions @ KubeCon EU 2023
tksm
1
3.4k
Unit Testing for Prometheus Rules
tksm
6
2.5k
Z Lab の教育への取組 / Cloud Native Education Efforts at Z Lab
tksm
7
1.3k
Istio Mutual TLS
tksm
0
580
Debugging Applications in Kubernetes
tksm
16
3.8k
Kubernetes with Prometheus
tksm
5
2.3k
Kubernetes v1.7 の主な変更点 / Kubernetes v1.7 features
tksm
0
1.5k
kubectl apply の仕組み / How kubectl apply works
tksm
1
9.5k
Prometheus による Kubernetes モニタリングの基礎 / Kubernetes monitoring with Prometheus
tksm
2
2.9k
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
355
22k
Thoughts on Productivity
jonyablonski
57
3.8k
JazzCon 2018 Closing Keynote - Leadership for the Reluctant Leader
reverentgeek
178
11k
Designing with Data
zakiwarfel
94
4.8k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
5
1.4k
4 Signs Your Business is Dying
shpigford
174
21k
Creatively Recalculating Your Daily Design Routine
revolveconf
209
11k
A Philosophy of Restraint
colly
195
15k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
12
1.4k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
242
20k
jQuery: Nuts, Bolts and Bling
dougneiner
57
7.1k
5 minutes of I Can Smell Your CMS
philhawksworth
199
19k
Transcript
Recap: Securing Kubernetes With Admission Controllers Kubernetes Meetup Tokyo #15
Takashi Kusumi <
[email protected]
>
セッション概要 ▶ タイトル: Securing Kubernetes With Admission Controllers ▶ スピーカー:
Dave Strebel, Microsoft ▶ 主な内容: + Admission Controller の概要 + 動的な Validating & Mutating Webhook の紹介 + Open Policy Agent (OPA) の概要 + kubernetes-policy-controller の紹介&デモ 2
このセッションと⾃分の関わり 3
現状 ValidatingAdmissionWebhook で 社内ポリシーを実装しているので、 Open Policy Agent でそれができたら シンプルになって嬉しい
Admission Controller & Webhook
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
Admission Controller ▶ 様々なリクエストの制御を⾏う機能 + オブジェクト情報を書き換える (Mutating) + オブジェクト情報を検証する (Validating)
▶ API Server の引数で有効・無効にするプラグインを指定する + --enable-admission-plugins + --disable-admission-plugins 7
デフォルトの 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 を使えば動的に拡張可能
Webhook による動的な拡張 9 https://schd.ws/hosted_files/kccna18/c5/KubeCon_2018_NA_ppt-1.pdf より引⽤
Webhook によるポリシーの例 ▶ privileged, hostPath などの使⽤を制限する + PodSecurityPolicy でも可能 ▶
利⽤できるコンテナイメージのレジストリを制限する ▶ Ingress で同⼀の Host 名のデプロイを拒否する ▶ Service で type=LoadBalancer の使⽤を禁⽌する 10
Admission Webhook の課題 ▶ ポリシー以外の実装がそれなりに必要 + HTTP Server & TLS
+ リクエスト、レスポンスの serialize / deserialize ▶ ポリシーを動的に変更するのが難しい 11 ポリシー定義を実装から分離したい
Open Policy Agent
Open Policy Agent (OPA) ▶ 汎⽤的なポリシーエンジン ▶ CNCF の Sandbox
プロジェクト ▶ 独⾃クエリ⾔語 (Rego) で記述する + 宣⾔的に定義できる ▶ ⼊⼒・出⼒はともに JSON + true/false 以外も返せる 13 Service ! OPA ポリシー (Rego) データ (JSON) ポリシーを 問い合わせ ポリシーの 判断を返す
独⾃クエリ⾔語 Rego 14 ▶ ポリシーを宣⾔的に記載 ▶ 慣れるまで難しい ▶ 最初の難関 +
ルール定義 + = の意味 + 同名ルールの意味 + false と undefined Tips: vim 等の Syntax も提供
ルール定義 15 myrule = true { input.method = "POST" input.user_id
= "alice" } Rule Head ▶ myrule がルール名 ▶ Body が真のとき値が設定 + この場合 true ▶ ⼀致しない場合 undefined ▶ 値は省略できる + デフォルト true Rule Body ▶ AND 条件で判定される ▶ = は Equality のチェック ▶ 順序は関係ない ▶ input は⼊⼒値
同名ルールの定義 ▶ 同名ルールを定義可能 ▶ ルールは OR 条件 + どれか⼀つ値があれば良い +
値のコンフリクトは不可 ▶ ⼀致しない場合 undefined + false ではないことに注意 + なので default 値が必要 16 default allow = false allow { input.method = "POST" input.user_id = "alice" } allow { input.method = "GET" }
REST API POST /v1/data/<POLICY_NAME> {"input": <JSON>} 17 1. ポリシー判断の問い合わせ 2.
判断の結果を返却 200 OK {"result": <JSON>} ▶ ⼊⼒・出⼒ともに JSON。true / false 以外も返却できる ▶ ⼊⼒は `input` という変数でルールから参照できる
kubernetes-policy-controller
Azure/kubernetes-policy-controller ▶ OPA で k8s のポリシーを定義できる Admission Webhook ▶ 現在はアルファ
▶ ポリシーは ConfigMap で動的に反映できる + 特定の namespace または label を指定 ▶ kube-mgmt というコンポーネントがキー + k8s オブジェクトとポリシーを OPA に同期 + OPA で管理されているコンポーネント 19
構成 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 結果
Demo
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 }
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"]
まとめ ▶ Admission Webhook を使えば独⾃のポリシーを実装できる + できればポリシー定義を実装から分離したい ▶ Open Policy
Agent という汎⽤的なポリシーエンジンがある + CNCF の Sandbox プロジェクト + 独⾃クエリ⾔語 Rego は慣れが必要 ▶ kubernetes-policy-controller は OPA でポリシーを定義できる + ConfigMap で OPA ポリシーを動的に適⽤できる 24
We are hiring! bit.ly/zlab-careers