Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
OpenPolicyAgentでValidationするセキュアなパイプライン入門
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
ipppppei
October 21, 2022
Technology
680
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
OpenPolicyAgentでValidationするセキュアなパイプライン入門
ツナカン(TUNA-JP Conference) #5(
https://tuna-jp.connpass.com/event/259873/)で発表した資料です
ipppppei
October 21, 2022
Other Decks in Technology
See All in Technology
実体験から学ぶ分析エージェントの開発と運⽤
recruitengineers
PRO
8
2.4k
オントロジーって 結局なにもの? AI エージェントに「意味」を渡す知識設計の話
greenmidori
0
230
AI時代のPRレビューにどう向き合うか?
kairim0
1
240
会社説明資料
persolserverworks
0
9.8k
Running Kotlin + Quarkus with Lambda
nealle
1
3.8k
ブラウザとサーバーから考えるAI時代のフロントエンド監視
shogo4131
3
990
⾮構造化データを価値に変える AI エージェント基盤とその組織
ivry_presentationmaterials
0
190
[JAWS-UG彩の国埼玉#12]そろそろ準備する?re:Invent2026をやさしく解説 / reinvent2026-sainokuni
sh_fk2
1
350
「事実」を「計測」して、「解釈」する 〜AWS Lambdaのメモリ最適解の見つけ方〜
maimyyym
0
170
JAWSUG TOHOKU 青森支部 「LoGoチャット」のAWS移行で 乗り越えたこと
taketakekaho
0
340
DWH の限界突破! AI エージェント向け爆速リアルタイムデータ基盤 ClickHouse
jozono
1
480
DGX Spark でどこまでハッキングができるのか?
kash1064
3
1.3k
Featured
See All Featured
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.7k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.4k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
460
The Curse of the Amulet
leimatthew05
3
16k
GraphQLとの向き合い方2022年版
quramy
50
15k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
580
Crafting Experiences
bethany
1
380
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
590
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
780
Chasing Engaging Ingredients in Design
codingconduct
0
360
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1.2k
Transcript
OpenPolicyAgentで Validationするセキュアな パイプライン⼊⾨ Ippei Murata 2022/10/21
Confidential │ © VMware, Inc. 2 Agenda • OpenPolicyAgentとは •
OpenPolicyAgent利⽤時のCI/CDと課題 • Konstraint • まとめ
Confidential │ © VMware, Inc. 3 こんなことありませんか︖ あなた (クラスタ管理者) 新⽶のクラスタ利⽤者
最⾼のアプリが出来たので、とりあえず開発環境に デプロイすっか。 開発⽤途だし、ミドルウェアは適当なものを Dockerhubから拾ってくればいいや。
Confidential │ © VMware, Inc. 4 こんなことありませんか︖ あなた (クラスタ管理者) 新⽶のクラスタ利⽤者
おい︕デプロイ先が本番⽤クラスタになってるぞ︕ 本番環境にDockerhubから引っ張った イメージおいちゃったよ セキュリティ事故おきたらどうすんだよ おい、アプリがバグってメモリ⾷いすぎて 、本番のサービスが死にだしたぞ
Confidential │ © VMware, Inc. 5 こんなことありませんか︖ あなた (クラスタ管理者) 新⽶のクラスタ利⽤者
っておい︕Namespaceごと削除すんなーーー︕︕ ひええ、すぐに⽌めます
Confidential │ © VMware, Inc. 6 こんなことありませんか︖
Confidential │ © VMware, Inc. 7 ⼀般的には・・・ • 認証・認可の仕組みを使って抑⽌する ただし、RBACだけだと難しいことも多い
今回のケースで欲しかったもの︓ • コンテナレジストリの制限 • 特定のNamespaceのみ利⽤ • limitsの設定必須化
Confidential │ © VMware, Inc. 8 Open Policy Agent(OPA︓オーパ) OPA︓OSSの汎⽤ポリシーエンジン(CNCFのGraduated
Project) ポリシー実⾏ポイント ポリシーエンジンとは(⼀般論) ポリシーエンジン リソース ①アクセス要求 ②アクセス可否の チェック依頼 ②アクセス可否の 連絡 ③アクセス許可 ③アクセス拒否 Policy 稼働 情報 静的に定義されたポリシー や動的な稼働情報を元に アクセス可否を判断
Confidential │ © VMware, Inc. 9 Open Policy Agent(OPA︓オーパ) OPA︓OSSの汎⽤ポリシーエンジン(CNCFのGraduated
Project) ポリシー実⾏ポイント ポリシーエンジンとは(OPA) ポリシーエンジン (Admission Controller) リソース ①利⽤要求 ②利⽤可否の チェック依頼 ②利⽤可否の 連絡 ③利⽤許可 ③利⽤拒否 Rego 稼働 情報 RegoというOPAのPolicy 記載⽤⾔語で書かれた Policyを解釈 Admission Cotroller として実装 Gatekeeperとしてだけでなく、 監査⽬的(チェックのみ)でも利⽤可能
Confidential │ © VMware, Inc. 10 Open Policy Agent(OPA︓オーパ) ポリシー実⾏ポイント
ポリシーエンジン (Admission Controller) リソース ①利⽤要求 ②利⽤可否の チェック依頼 ②利⽤可否の 連絡 ③利⽤拒否 Rego ・dockerhub禁⽌ ・Namespace規制 ・limit必須 稼働 情報 実装イメージ︓ apiVersion: templates.gatekeeper.sh/v1 kind: ConstraintTemplate : spec: targets: - target: admission.k8s.gatekeeper.sh rego: | <Policy> Rego部分
Confidential │ © VMware, Inc. 11 余談︓Tanzu Mission ControlのOPA •
予めテンプレートが⽤意 • Regoを書かなくてもPolicy設定可能 (勝⼿にRegoを書いてくれる) • OPA Gatekeeperも⾃動インストール
Confidential │ © VMware, Inc. 12 ちなみに・・・ https://kubernetes.io/docs/concepts/security/pod-security-policy/ • 従来⼩回りの効く権限管理のための
Admission ControllerはPSPだった • v1.25で廃⽌された = 最新版ではもう使えない • 後継はPSA(Pod Security Admission) → OPAはKubernetesのコンポーネントではない あくまでも3rd partyのAdmission Controller その他PSPの代替候補 ・K-Rail ・Kyverno
Confidential │ © VMware, Inc. 13 OPA利⽤時のCI/CD push to /my-app
push to /my-app-manifest AppのManifest作成 Push Appのコード修正 Push/PR E2E Test Test失敗 Polling Sync Policy 違反 デプロイできないので テストも失敗
Confidential │ © VMware, Inc. 14 OPA利⽤時のCI/CD push to /my-app
push to /my-app-manifest AppのManifest作成 Push Appのコード修正 Push/PR E2E Test Test成功/失敗 Polling Sync ManifestのValidation 事前にManifestをValidation(検証=テスト)し、 動くもののみをPushするようにする
Confidential │ © VMware, Inc. 15 ManifestのValidation⽅法と課題 ▪Conftest • OpenPolicyAgent標準のPolicyテストツール
• K8s Manifest以外もDockerfile、AWS SAM、Jsonnet等様々なフォーマットに対応 • 出⼒フォーマットも多彩(json, tap, table, junit, github) $ conftest test -p . -n ns_policy ./nginx.yaml FAIL - ./nginx.yaml - ns_policy - invalid namespace: kube-system 1 test, 0 passed, 0 warnings, 1 failure, 0 exceptions $ conftest test -p . -n ns_policy nginx.yaml -o table +---------+------------+-----------+--------------------------------+ | RESULT | FILE | NAMESPACE | MESSAGE | +---------+------------+-----------+--------------------------------+ | failure | nginx.yaml | ns_policy | invalid namespace: kube-system | +---------+------------+-----------+--------------------------------+ apiVersion: v1 kind: Pod metadata: name: nginx namespace: kube-system deniedNamespaces := [ "kube-system", "gitlab" ] violation[{"msg": msg}] { deniedNamespaces[_] == input.metadata.namespace msg := sprintf("denied namespace: %v", [input.metadata.namespace]) } nginx.yaml ns_policy.rego
Confidential │ © VMware, Inc. 16 ManifestのValidation⽅法と課題 ▪Conftest • OpenPolicyAgent標準のPolicyテストツール
• K8s Manifest以外もDockerfile、AWS SAM、Jsonnet等様々なフォーマットに対応 • 出⼒フォーマットも多彩(json, tap, table, junit, github) • OPA GatekeeperのRegoはそのままサポートしていない → 検証⽤のRegoとGatekeeper⽤のRegoの2つを管理することになる 例)特定のNamespaceの利⽤を禁⽌する deniedNamespaces := [ "kube-system", "gitlab" ] violation[{"msg": msg}] { deniedNamespaces[_] == input.metadata.namespace msg := sprintf("denied namespace: %v", [input.metadata.namespace]) } conftest (検証⽤Rego) deniedNamespaces := [ "kube-system", "gitlab" ] violation[{"msg": msg}] { deniedNamespaces[_] == input.review.namespace msg := sprintf("denied namespace: %v", [input.review.namespace]) } ConstraintTemplate (Gatekeeper⽤Rego) ※⽐較⽤なので、いい書き⽅ではありません ※ConstraintTemplate⾃体はManifestで ここではRego部分のみ抜粋
Confidential │ © VMware, Inc. 17 ManifestのValidation⽅法と課題 ▪Conftest • OpenPolicyAgent標準のPolicyテストツール
• K8s Manifest以外もDockerfile、AWS SAM、Jsonnet等様々なフォーマットに対応 • 出⼒フォーマットも多彩(json, tap, table, junit, github) • OPA GatekeeperのRegoはそのままサポートしていない → 検証⽤のRegoとGatekeeper⽤のRegoの2つを管理することになる 例)特定のNamespaceの利⽤を禁⽌する deniedNamespaces := [ "kube-system", "gitlab" ] violation[{"msg": msg}] { deniedNamespaces[_] == input.metadata.namespace msg := sprintf("denied namespace: %v", [input.metadata.namespace]) } conftest (検証⽤Rego) deniedNamespaces := [ "kube-system", "gitlab" ] violation[{"msg": msg}] { deniedNamespaces[_] == input.review.namespace msg := sprintf("denied namespace: %v", [input.review.namespace]) } ConstraintTemplate (Gatekeeper⽤Rego) ※⽐較⽤なので、いい書き⽅ではありません ※ConstraintTemplate⾃体はManifestで ここではRego部分のみ抜粋 ⼀元管理のためのアプローチ ・検証⽤RegoからGatekeeper⽤リソースを⽣成する → Konstraint ★今⽇のメイン (Gatekeeper⽤リソースを管理しない) ・Gatekeeper⽤リソースで検証する → Gator (検証⽤Regoを管理しない)
Confidential │ © VMware, Inc. 18 /template /constraint Policyの共通化︓Konstraint Gatekeeper⽤
Manifestの作成 検証⽤Rego の作成 /rego 従来︓ RegoとManifestを別々に管理(メンテ) 検証⽤Rego の作成 /rego Konstraint︓ Regoで⼀元管理 konstraint create kubectl apply -f /tmpleate -f /constraint kubectl apply -f /tmpleate -f /constraint Konstraint︓ • Regoファイルを元にGatekeeper⽤Manifestを⾃動⽣成するツール • conftestのPluginとRegoをManifestに変換するCLIから構成
Confidential │ © VMware, Inc. 19 KonstraintのRego deniedNamespaces := [
"kube-system", "gitlab" ] violation[{"msg": msg}] { deniedNamespaces[_] == input.metadata.namespace msg := sprintf("denied namespace: %v", [input.metadata.namespace]) } conftest (検証⽤Rego) import data.lib.core deniedNamespaces := [ "kube-system", "gitlab" ] violation[{"msg": msg}] { deniedNamespaces[_] == core.resource.metadata.namespace msg := sprintf("invalid namespace: %v", [core.resource.metadata.namespace]) } conftest (Konstaint対応Rego) konstraintのライブラリ (data.lib.core)を利⽤して inputを置き換える 実⾏コマンドは同じ︓ $ conftest test -p . -n ns_policy ./nginx.yaml
Confidential │ © VMware, Inc. 20 KonstraintによるGatekeeper⽤Manifestの⽣成 $ konstraint create
. -o ./konstraint/ $ ls ./konstraint constraint_Policy.yaml template_Policy.yaml konstraintコマンド実⾏でconftest⽤RegoからManifestが⾃動⽣成される - consraint_Policy.yaml︓ Constraint(Policyをクラスタに適⽤するManifest) - template_Policy.yaml︓ ConstraintTemplate(Policyを定義するManifest) - libs: - |- package lib.core default is_gatekeeper = false is_gatekeeper { has_field(input, "review") has_field(input.review, "object") } ConstraintTemplateの中⾝はKonstraintのライブラリとconftest⽤Regoで構成 rego: |- package ns_policy import data.lib.core deniedNamespaces := [ "kube-system", "gitlab" ] violation[{"msg": msg}] { deniedNamespaces[_] == core.resource.metadata.namespace msg := sprintf("invalid namespace: %v", [core.resource.metadata.namespace]) } Konstraintライブラリ部分 conftest⽤Rego部分
Confidential │ © VMware, Inc. 21 まとめ • 細かい認可の設定にはOPAが有効 •
OPA Gatekeeperを使った環境でCI/CDパイプラインを実装する場合、 Manifestのpush/PR前にPolicyに合致するか検証すべき • OPA Gatekeeperで使うPolicy(Manifest)はCI/CDパイプライン上で検証⽤途に直接使えない → 検証⽤Rego(conftest⽤Rego)が別途必要に • Konstraintを使うとconftest⽤RegoからOPA Gatekeeperで使うPolicy(Manifest)を ⽣成することが可能に • おまけ︓Regoに疲れたらTanzu Mission Control使いましょう
Confidential │ © VMware, Inc. 22 おまけ︓もう1つPolicyの共通化ツール Gator Gator︓ •
Regoの代わりにContraintとContraintTemplateを使ってPolicyを評価するツール • OPA Gatekeeperで開発されている(https://github.com/open-policy-agent/gatekeeper/blob/master/website/docs/gator.md) $ conftest test -p . -n ns_policy ./nginx.yaml FAIL - ./nginx.yaml - ns_policy - invalid namespace: kube-system 1 test, 0 passed, 0 warnings, 1 failure, 0 exceptions $ cat nginx.yaml | gator test -f konstraint/ Message: "invalid namespace: kube-system" conftest+konstraint pluginの結果 Gatorでの結果 • 先にConstraintTemplateを作る場合(Tanzu Mission Controlを利⽤する場合など)で有効 • 枯れてない(alpha版)上にドキュメントやサンプルがかなり少ない点に注意 ※Qiitaに紹介記事書いてます https://qiita.com/ipppppei/items/935d19da952ba5369a33
Thank You Confidential │ © VMware, Inc.