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
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
CLIライブラリ開発を支える技術
htnabe
0
130
SREへの勘違いに気づいた後の話
tomodakengo
0
110
Deployment の 先にある AI Agent 基盤 - kagent vNext、Agent Substrate、Hermes から読み解く Agent Runtime の現在地 / k8s-matsuri-2-ai-agent-platform-amsy810
masayaaoyama
4
670
「ピッケル本」日本語版は4.0(第6版)が出版されるべき / pickaxe4-nagoyark05
kakutani
2
190
AIエージェントの一手は 誰も見ていない - Falco拡張OSS「Prempti」とeBPFで サーバーレス実行基盤を二層防御する
keitah
0
240
AI 時代のスタートアップエコシステ厶から考究する技術的負債との向き合い方
m3m0r7
PRO
3
2.3k
Slack上でインフラをトラブルシュートする! Agentic Platform Engineeringの第一歩
teru0x1
5
1.8k
アクセスキーこわい やめかたと漏らさない工夫
sassssan68
1
450
絵ではじめるKubernetesセキュリティ
aoi1
4
680
顧客に向き合う開発組織へ。リアーキテクチャとフィーチャーチーム化で挑む組織改革
safie
0
2.1k
AIは推し活である。
kurazuuuuuu
1
810
Claude in Chrome 入門 / Introduction to Claude in Chrome
cielo1985
0
870
Featured
See All Featured
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Practical Orchestrator
shlominoach
192
12k
Producing Creativity
orderedlist
PRO
348
41k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
67
58k
Skip the Path - Find Your Career Trail
mkilby
1
230
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
410
My Coaching Mixtape
mlcsv
0
320
How to Think Like a Performance Engineer
csswizardry
28
2.8k
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.