SlideShare a Scribd company logo
1 of 29
Download to read offline
PodSecurityPolicy から
Gatekeeper に移行しました
Kubernetes Meetup Tokyo #57
YABUUCHI Hidehito, Preferred Networks, Inc.
2
● 薮内 秀仁 (YABUUCHI Hidehito)
● Preferred Networks (PFN) (2020/04 ~)
● オンプレ Kubernetes クラスタの
運用・開発
● 社内 CI 基盤の開発
自己紹介
3
● PodSecurityPolicy (PSP) のおさらい
● PFN での PSP からの移行
○ どう移行先を選定したか
○ どうセキュリティポリシを設計したか
○ どう移行したか
● ブログ記事も参照ください!
○ Kubernetes クラスタの PodSecurityPolicy を Gatekeeper に移行しました -
Preferred Networks Research & Development
本日お話しする内容
4
PodSecurityPolicy (PSP) の
おさらい
5
● Kubernetes 組み込みのセキュリティ機構
○ Pod が満たすべきセキュリティポリシを定義し、
○ Pod リソースの spec をポリシに適合するよう変更・
適合するポリシがない pod の作成を拒否
PodSecurityPolicy (PSP)
kind: PodSecurityPolicy
spec:
# Privileged コンテナの利用を制御
# Pod の spec.containers[].securityContext.privileged フィールド
privileged: false
# コンテナの UID を制御
# Pod の spec.securityContext.runAsUser などのフィールド
runAsUser:
rule: "MustRunAsNonRoot"
6
● PFN のクラスタ向けにカスタムしたセキュリティポリシの適用に利用
○ 一般的なセキュリティ要件
■ Privileged コンテナの禁止など
○ PFN のワークロード向けにカスタムした要件
■ 使用できる Linux capabilities など
○ NFS・ノードローカルストレージのアクセス制御
■ HostPath を使う場合、ユーザごとに UID / GID を特定の値に制限
■ HostPath を使わない場合、root 権限で動くコンテナを許可
■ Pod spec によってポリシを切り替え
PFN での PSP の利用
7
● Pod が PSP リソースを使用する(適用されうる)権限のソースが複数
○ Pod 作成者 または pod に紐づく ServiceAccount が use できる PSP
■ Deployment などの場合、作成者 = コントローラ
● 複数の PSP がある場合、複雑なルールでどれが適用されるか決まる
PSP の主な問題点:挙動のわかりにくさ
RBAC (use verb)
ServiceAccount
Pod spec を変更・検証
PodSecurityPolicy
PodSecurityPolicy
8
● 互換性を保ちつつ問題点を解決するのも難しい
○ Kubernetes 1.21 (2021/04) で非推奨
○ Kubernetes 1.25 (2022/08) で削除
○ PodSecurityPolicy Deprecation: Past, Present, and Future |
Kubernetes
● PFN では 2023/01 に Kubernetes 1.25 に更新
○ PSP からの移行をおこなった
PSP の廃止
9
移行先の選定
10
● セキュリティレベルを落とさず PSP を代替できること
○ カスタムしたセキュリティポリシを利用できること
○ Pod spec によって適用するポリシを選択できること
■ NFS・ノードローカルストレージのアクセス制御のため
● 扱いやすいこと
○ 単体での扱いやすさというより、扱いやすい運用方法を
設計できること
移行先の要件
11
移行先候補の比較
Pod Security
Admission (PSA)
Gatekeeper Kyverno
カスタムした
セキュリティポリシ
No
Pod Security
Standards の3種類
Yes
Rego 言語で記述
Yes
YAML 上に
独自記法で記述
Pod spec によって
ポリシを選択
No
ネームスペース
ごとに固定
Yes*
ラベルや名前など
で適用対象を選択
Yes*
ラベルや名前など
で適用対象を選択
*: 別途 Admission Webhook と組み合わせる
12
● PFN のユースケースで Gatekeeper と Kyverno に大きな違いはない
● Gatekeeper でセキュリティポリシの PoC を書き、
扱いやすそうだったのでそのまま採用
○ セキュリティポリシの作成には Gatekeeper Library を利用
■ 自分で Rego はほぼ書かなかった
■ PSP の allowedUnsafeSysctls 相当の機能だけ pull request
● open-policy-agent/gatekeeper-library#253
移行先の選定
13
1. ConstraintTemplate リソースで制約テンプレートを定義 → CRD が作られる
2. パラメータを指定して CRD から制約リソースを作成
Gatekeeper の概要
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: k8spspforbiddensysctls
spec:
crd:
spec:
names: # 作る CRD の名前
kind: K8sPSPForbiddenSysctls
validation:
openAPIV3Schema:
properties: # 制約のパラメータ
allowedSysctls: ...
forbiddenSysctls: ...
targets:
- rego: ... # 制約の内容
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPForbiddenSysctls
metadata:
name: baseline-forbidden-sysctls
spec:
match: # 制約の適用対象
scope: Namespaced
kinds:
- ...
labelSelector: ...
parameters: # パラメータを指定
allowedSysctls:
- ...
①
②
14
制約リソースの設計
15
● Gatekeeper では pod の属性ごとに制約が別々のリソースになる
○ 制約リソースごとに適用対象も別々となりうる
● → どんな制約リソースを作るか、どう組織化するかの設計が重要
○ セキュリティポリシを Pod に漏れなく適用
○ Pod にどの制約が適用されるか簡単に把握
設計の必要性
kind: K8sPSPPrivilegedContainer
metadata:
name: privileged-container-0
kind: K8sPSPCapabilities
metadata:
name: capabilities-0
Pod
Pod
Pod
Pod
適用
16
● PSP の利点を引き継ぐ
○ 🙆 各 pod に一つの PSP が適用され、ポリシの内容がまとまっている
○ 🙆 Pod にどの PSP が適用されたか簡単に把握できる
○ 🙆 ポリシに適合するよう、Pod spec を自動で mutate する
● PSP の欠点を解消する
○ 🙅 PSP が複数ある場合、どれが適用されるかわかりにくい
○ 🙅 Pod spec の mutation が暗黙的
設計上の観点
17
● 🙆 各 pod に一つの PSP が適用され、ポリシの内容がまとまっている
○ 課題:Gatekeeper は pod の属性ごとに制約が別々のリソースに
■ Privileged コンテナ、UID / GID, ...
● 🙆 Pod にどの PSP が適用されたか簡単に把握できる
○ 課題:Gatekeeper は制約リソースから適用対象の pod を選択する形
■ spec.match フィールドの条件にマッチした pod に適用される
● → 解決策:セキュリティポリシの単位で制約リソースをまとめ
「ポリシ」を構成
PSP の利点をどう引き継ぐか
18
制約リソースをまとめ「ポリシ」を構成
baseline ポリシ
kind: Pod
metadata:
labels:
gatekeeper.k8s.preferred.jp/policy: baseline
.
.
.
kind: K8sPSPForbiddenSysctls
spec:
match:
labelSelector:
matchLabels:
gatekeeper.k8s.preferred.jp/policy: baseline
kind: K8sPSPForbiddenSysctls
spec:
match:
labelSelector:
matchLabels:
gatekeeper.k8s.preferred.jp/policy: baseline
kind: K8sPSPForbiddenSysctls
spec:
match:
labelSelector:
matchLabels:
gatekeeper.k8s.preferred.jp/policy: baseline
ポリシ内の制約リソースは
同じラベルセレクタをもつ
1. Pod のラベルでポリシを指定 2. ポリシ内の制約がすべて適用される
19
● 🙆 各 pod に一つの PSP が適用され、ポリシの内容がまとまっている
○ 結果:各 pod に一つのポリシが適用され、ポリシ内に制約リソー
スがまとまっている
● 🙆 Pod にどの PSP が適用されたか簡単に把握できる
🙅 PSP が複数ある場合、どれが適用されるかわかりにくい
○ 結果:Pod のラベルにどのポリシを適用するか明示され、pod 側
からポリシを指定する形に
PSP の利点の引き継ぎ・欠点の解消
20
● 🙆 ポリシに適合するよう、Pod spec を自動で mutate する
🙅 Pod spec の mutation が暗黙的
○ Gatekeeper ではリソースの mutation も可能
■ 例:Pod の runAsUser フィールドにユーザごとの UID を書き込む
○ Mutation 操作は Assign などのカスタムリソースで明示的に表現
● → 結果:PSP の利点をすべて引き継ぎ・欠点をすべて解消
Mutation
21
● ユーザ向け:スムーズな移行のため、既存の PSP と同等のポリシ
○ root
■ Pod が root 権限で動くことを許可
■ UID / GID 以外の制約が強い(HostPath 禁止など)
○ non-root
■ Pod が一般ユーザ権限で動くことを強制
● クラスタアドオン向け:Pod Security Standards に準拠したポリシ
○ restricted
○ baseline
○ privileged(制約リソースなし)
用意したポリシ
22
● すべての pod に適切なポリシが適用されていることを担保したい
○ クラスタアドオン
■ 解決策:デフォルトで restricted ポリシを適用
○ ユーザの pod
■ 課題:どのポリシを適用するかは pod のラベルで指定
● ユーザは pod のラベルを自由に設定できる
■ 課題:Pod spec によって適用するポリシを選択したい
■ → 解決策:Mutating admission webhook と組み合わせ
ポリシ適用の強制
23
Mutating admission webhook との連携
kind: Pod
metadata:
labels:
gatekeeper.k8s.preferred.jp/policy: root
Pod spec に応じてポリシを選択
Mutating
admission webhook
Gatekeeper
kind: Pod
metadata:
labels: {}
● ポリシを指定するラベルを検証
● ポリシに応じて制約を満たすか検証
24
移行
25
1. クラスタアドオンのポリシ違反をすべて修正
a. ユーザ向けポリシは PSP と互換だったため、ユーザの移行作業は不要
2. ポリシの適用を有効化
3. (etcd から PodSecurityPolicy リソースを削除)
a. Kubernetes 更新後は PSP の削除もできなくなるため
4. Kubernetes を 1.25 に更新
移行の進め方
26
1. Gatekeeper の制約リソースを spec.enforcementAction: warn で作成
a. 違反時も pod 作成・更新は拒否せず、警告のみ
b. クラスタアドオンを稼働させたままにできる
2. ポリシ違反が解消されるまで、クラスタアドオンを一つずつ修正
a. Gatekeeper の audit controller のログで違反を確認
i. 定期的にクラスタ上の pod を検査
b. ほとんどのアドオンは securityContext を明示的に設定すること
で restricted ポリシに適合できた
クラスタアドオンのポリシ違反をすべて修正
27
1. 制約リソースをすべて spec.enforcementAction: deny に変更
a. 違反時に pod 作成・更新を拒否
2. クラスタアドオンをローリングリスタートし、起動することを確認
ポリシの適用を有効化
28
● Kubernetes 1.25 への更新を契機に PSP から Gatekeeper に移行した
○ PSP の利点を引き継ぎつつ欠点を解消するよう、制約リソースを
組織化し「ポリシ」を構成
○ ユーザに影響なく クラスタアドオンをポリシに適合させていき、
スムーズな更新を達成
● 今後:社内の admission webhook の機能を Gatekeeper に移植する
ことを検討
○ ポリシの宣言的な記述・リリース作業の簡略化のため
まとめと今後
Making the real world computable

More Related Content

What's hot

What's hot (20)

実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
大規模データ処理の定番OSS Hadoop / Spark 最新動向 - 2021秋 -(db tech showcase 2021 / ONLINE 発...
大規模データ処理の定番OSS Hadoop / Spark 最新動向 - 2021秋 -(db tech showcase 2021 / ONLINE 発...大規模データ処理の定番OSS Hadoop / Spark 最新動向 - 2021秋 -(db tech showcase 2021 / ONLINE 発...
大規模データ処理の定番OSS Hadoop / Spark 最新動向 - 2021秋 -(db tech showcase 2021 / ONLINE 発...
 
分散ストレージソフトウェアCeph・アーキテクチャー概要
分散ストレージソフトウェアCeph・アーキテクチャー概要分散ストレージソフトウェアCeph・アーキテクチャー概要
分散ストレージソフトウェアCeph・アーキテクチャー概要
 
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
 
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
 
10分でわかる Cilium と XDP / BPF
10分でわかる Cilium と XDP / BPF10分でわかる Cilium と XDP / BPF
10分でわかる Cilium と XDP / BPF
 
Lxc で始めるケチケチ仮想化生活?!
Lxc で始めるケチケチ仮想化生活?!Lxc で始めるケチケチ仮想化生活?!
Lxc で始めるケチケチ仮想化生活?!
 
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
Kubernetes ControllerをScale-Outさせる方法 / Kubernetes Meetup Tokyo #55
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門
 
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニングJVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
 
Fluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンFluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターン
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 

Similar to PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57

130329 04
130329 04130329 04
130329 04
openrtm
 
20130329 rtm4
20130329 rtm420130329 rtm4
20130329 rtm4
openrtm
 
Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開
Shogo Kawahara
 

Similar to PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57 (20)

Pod Security AdmissionによるKubernetesのポリシー制御(Kubernetes Novice Tokyo #21 発表資料)
Pod Security AdmissionによるKubernetesのポリシー制御(Kubernetes Novice Tokyo #21 発表資料)Pod Security AdmissionによるKubernetesのポリシー制御(Kubernetes Novice Tokyo #21 発表資料)
Pod Security AdmissionによるKubernetesのポリシー制御(Kubernetes Novice Tokyo #21 発表資料)
 
Mk vpp for-containers-vppug
Mk vpp for-containers-vppugMk vpp for-containers-vppug
Mk vpp for-containers-vppug
 
200527 ur
200527 ur200527 ur
200527 ur
 
Introduction Pycon2010
Introduction Pycon2010Introduction Pycon2010
Introduction Pycon2010
 
What's new in open shift container platform 4.7 japan_20210318
What's new in open shift container platform 4.7 japan_20210318What's new in open shift container platform 4.7 japan_20210318
What's new in open shift container platform 4.7 japan_20210318
 
IKEv2-VPN PyHackCon2023
IKEv2-VPN PyHackCon2023IKEv2-VPN PyHackCon2023
IKEv2-VPN PyHackCon2023
 
FIWARE IoTデバイスを保護する方法
FIWARE IoTデバイスを保護する方法FIWARE IoTデバイスを保護する方法
FIWARE IoTデバイスを保護する方法
 
How to run P4 BMv2
How to run P4 BMv2How to run P4 BMv2
How to run P4 BMv2
 
ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略
 
TungstenFabricでOpenStackとk8sをラクラク管理
TungstenFabricでOpenStackとk8sをラクラク管理TungstenFabricでOpenStackとk8sをラクラク管理
TungstenFabricでOpenStackとk8sをラクラク管理
 
Heroku seminar winter19
Heroku seminar winter19Heroku seminar winter19
Heroku seminar winter19
 
Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster
Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-clusterKubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster
Kubernetes meetup-tokyo-13-customizing-kubernetes-for-ml-cluster
 
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
 
Tech Dojo 02/09 IBM Japan CSM
Tech Dojo 02/09 IBM Japan CSMTech Dojo 02/09 IBM Japan CSM
Tech Dojo 02/09 IBM Japan CSM
 
Nsx t api-automation_202103
Nsx t api-automation_202103Nsx t api-automation_202103
Nsx t api-automation_202103
 
130329 04
130329 04130329 04
130329 04
 
20130329 rtm4
20130329 rtm420130329 rtm4
20130329 rtm4
 
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
 
Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開
 
OpenStackネットワーキング管理者入門 - OpenStack最新情報セミナー 2014年8月
OpenStackネットワーキング管理者入門 - OpenStack最新情報セミナー 2014年8月OpenStackネットワーキング管理者入門 - OpenStack最新情報セミナー 2014年8月
OpenStackネットワーキング管理者入門 - OpenStack最新情報セミナー 2014年8月
 

More from Preferred Networks

More from Preferred Networks (20)

Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
 
Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...
Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...
Kubernetes + containerd で cgroup v2 に移行したら "failed to create fsnotify watcher...
 
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
深層学習の新しい応用と、 それを支える計算機の進化 - Preferred Networks CEO 西川徹 (SEMICON Japan 2022 Ke...
 
Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2
Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2
Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2
 
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
 
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
Optuna Dashboardの紹介と設計解説 - 2022/12/10 Optuna Meetup #2
 
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
スタートアップが提案する2030年の材料開発 - 2022/11/11 QPARC講演
 
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
 
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
PFNにおける研究開発(2022/10/19 東大大学院「融合情報学特別講義Ⅲ」)
 
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
自然言語処理を 役立てるのはなぜ難しいのか(2022/10/25東大大学院「自然言語処理応用」)
 
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語るKubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
Kubernetes にこれから入るかもしれない注目機能!(2022年11月版) / TechFeed Experts Night #7 〜 コンテナ技術を語る
 
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
Matlantis™のニューラルネットワークポテンシャルPFPの適用範囲拡張
 
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
PFNのオンプレ計算機クラスタの取り組み_第55回情報科学若手の会
 
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
Kubernetes Service Account As Multi-Cloud Identity / Cloud Native Security Co...
 
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
KubeCon + CloudNativeCon Europe 2022 Recap / Kubernetes Meetup Tokyo #51 / #k...
 
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...
KubeCon + CloudNativeCon Europe 2022 Recap - Batch/HPCの潮流とScheduler拡張事例 / Kub...
 
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
 
Topology Managerについて / Kubernetes Meetup Tokyo 50
Topology Managerについて / Kubernetes Meetup Tokyo 50Topology Managerについて / Kubernetes Meetup Tokyo 50
Topology Managerについて / Kubernetes Meetup Tokyo 50
 
PFN Summer Internship 2021 / Kohei Shinohara: Charge Transfer Modeling in Neu...
PFN Summer Internship 2021 / Kohei Shinohara: Charge Transfer Modeling in Neu...PFN Summer Internship 2021 / Kohei Shinohara: Charge Transfer Modeling in Neu...
PFN Summer Internship 2021 / Kohei Shinohara: Charge Transfer Modeling in Neu...
 
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
 

PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57

  • 1. PodSecurityPolicy から Gatekeeper に移行しました Kubernetes Meetup Tokyo #57 YABUUCHI Hidehito, Preferred Networks, Inc.
  • 2. 2 ● 薮内 秀仁 (YABUUCHI Hidehito) ● Preferred Networks (PFN) (2020/04 ~) ● オンプレ Kubernetes クラスタの 運用・開発 ● 社内 CI 基盤の開発 自己紹介
  • 3. 3 ● PodSecurityPolicy (PSP) のおさらい ● PFN での PSP からの移行 ○ どう移行先を選定したか ○ どうセキュリティポリシを設計したか ○ どう移行したか ● ブログ記事も参照ください! ○ Kubernetes クラスタの PodSecurityPolicy を Gatekeeper に移行しました - Preferred Networks Research & Development 本日お話しする内容
  • 5. 5 ● Kubernetes 組み込みのセキュリティ機構 ○ Pod が満たすべきセキュリティポリシを定義し、 ○ Pod リソースの spec をポリシに適合するよう変更・ 適合するポリシがない pod の作成を拒否 PodSecurityPolicy (PSP) kind: PodSecurityPolicy spec: # Privileged コンテナの利用を制御 # Pod の spec.containers[].securityContext.privileged フィールド privileged: false # コンテナの UID を制御 # Pod の spec.securityContext.runAsUser などのフィールド runAsUser: rule: "MustRunAsNonRoot"
  • 6. 6 ● PFN のクラスタ向けにカスタムしたセキュリティポリシの適用に利用 ○ 一般的なセキュリティ要件 ■ Privileged コンテナの禁止など ○ PFN のワークロード向けにカスタムした要件 ■ 使用できる Linux capabilities など ○ NFS・ノードローカルストレージのアクセス制御 ■ HostPath を使う場合、ユーザごとに UID / GID を特定の値に制限 ■ HostPath を使わない場合、root 権限で動くコンテナを許可 ■ Pod spec によってポリシを切り替え PFN での PSP の利用
  • 7. 7 ● Pod が PSP リソースを使用する(適用されうる)権限のソースが複数 ○ Pod 作成者 または pod に紐づく ServiceAccount が use できる PSP ■ Deployment などの場合、作成者 = コントローラ ● 複数の PSP がある場合、複雑なルールでどれが適用されるか決まる PSP の主な問題点:挙動のわかりにくさ RBAC (use verb) ServiceAccount Pod spec を変更・検証 PodSecurityPolicy PodSecurityPolicy
  • 8. 8 ● 互換性を保ちつつ問題点を解決するのも難しい ○ Kubernetes 1.21 (2021/04) で非推奨 ○ Kubernetes 1.25 (2022/08) で削除 ○ PodSecurityPolicy Deprecation: Past, Present, and Future | Kubernetes ● PFN では 2023/01 に Kubernetes 1.25 に更新 ○ PSP からの移行をおこなった PSP の廃止
  • 10. 10 ● セキュリティレベルを落とさず PSP を代替できること ○ カスタムしたセキュリティポリシを利用できること ○ Pod spec によって適用するポリシを選択できること ■ NFS・ノードローカルストレージのアクセス制御のため ● 扱いやすいこと ○ 単体での扱いやすさというより、扱いやすい運用方法を 設計できること 移行先の要件
  • 11. 11 移行先候補の比較 Pod Security Admission (PSA) Gatekeeper Kyverno カスタムした セキュリティポリシ No Pod Security Standards の3種類 Yes Rego 言語で記述 Yes YAML 上に 独自記法で記述 Pod spec によって ポリシを選択 No ネームスペース ごとに固定 Yes* ラベルや名前など で適用対象を選択 Yes* ラベルや名前など で適用対象を選択 *: 別途 Admission Webhook と組み合わせる
  • 12. 12 ● PFN のユースケースで Gatekeeper と Kyverno に大きな違いはない ● Gatekeeper でセキュリティポリシの PoC を書き、 扱いやすそうだったのでそのまま採用 ○ セキュリティポリシの作成には Gatekeeper Library を利用 ■ 自分で Rego はほぼ書かなかった ■ PSP の allowedUnsafeSysctls 相当の機能だけ pull request ● open-policy-agent/gatekeeper-library#253 移行先の選定
  • 13. 13 1. ConstraintTemplate リソースで制約テンプレートを定義 → CRD が作られる 2. パラメータを指定して CRD から制約リソースを作成 Gatekeeper の概要 apiVersion: templates.gatekeeper.sh/v1 kind: ConstraintTemplate metadata: name: k8spspforbiddensysctls spec: crd: spec: names: # 作る CRD の名前 kind: K8sPSPForbiddenSysctls validation: openAPIV3Schema: properties: # 制約のパラメータ allowedSysctls: ... forbiddenSysctls: ... targets: - rego: ... # 制約の内容 apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sPSPForbiddenSysctls metadata: name: baseline-forbidden-sysctls spec: match: # 制約の適用対象 scope: Namespaced kinds: - ... labelSelector: ... parameters: # パラメータを指定 allowedSysctls: - ... ① ②
  • 15. 15 ● Gatekeeper では pod の属性ごとに制約が別々のリソースになる ○ 制約リソースごとに適用対象も別々となりうる ● → どんな制約リソースを作るか、どう組織化するかの設計が重要 ○ セキュリティポリシを Pod に漏れなく適用 ○ Pod にどの制約が適用されるか簡単に把握 設計の必要性 kind: K8sPSPPrivilegedContainer metadata: name: privileged-container-0 kind: K8sPSPCapabilities metadata: name: capabilities-0 Pod Pod Pod Pod 適用
  • 16. 16 ● PSP の利点を引き継ぐ ○ 🙆 各 pod に一つの PSP が適用され、ポリシの内容がまとまっている ○ 🙆 Pod にどの PSP が適用されたか簡単に把握できる ○ 🙆 ポリシに適合するよう、Pod spec を自動で mutate する ● PSP の欠点を解消する ○ 🙅 PSP が複数ある場合、どれが適用されるかわかりにくい ○ 🙅 Pod spec の mutation が暗黙的 設計上の観点
  • 17. 17 ● 🙆 各 pod に一つの PSP が適用され、ポリシの内容がまとまっている ○ 課題:Gatekeeper は pod の属性ごとに制約が別々のリソースに ■ Privileged コンテナ、UID / GID, ... ● 🙆 Pod にどの PSP が適用されたか簡単に把握できる ○ 課題:Gatekeeper は制約リソースから適用対象の pod を選択する形 ■ spec.match フィールドの条件にマッチした pod に適用される ● → 解決策:セキュリティポリシの単位で制約リソースをまとめ 「ポリシ」を構成 PSP の利点をどう引き継ぐか
  • 18. 18 制約リソースをまとめ「ポリシ」を構成 baseline ポリシ kind: Pod metadata: labels: gatekeeper.k8s.preferred.jp/policy: baseline . . . kind: K8sPSPForbiddenSysctls spec: match: labelSelector: matchLabels: gatekeeper.k8s.preferred.jp/policy: baseline kind: K8sPSPForbiddenSysctls spec: match: labelSelector: matchLabels: gatekeeper.k8s.preferred.jp/policy: baseline kind: K8sPSPForbiddenSysctls spec: match: labelSelector: matchLabels: gatekeeper.k8s.preferred.jp/policy: baseline ポリシ内の制約リソースは 同じラベルセレクタをもつ 1. Pod のラベルでポリシを指定 2. ポリシ内の制約がすべて適用される
  • 19. 19 ● 🙆 各 pod に一つの PSP が適用され、ポリシの内容がまとまっている ○ 結果:各 pod に一つのポリシが適用され、ポリシ内に制約リソー スがまとまっている ● 🙆 Pod にどの PSP が適用されたか簡単に把握できる 🙅 PSP が複数ある場合、どれが適用されるかわかりにくい ○ 結果:Pod のラベルにどのポリシを適用するか明示され、pod 側 からポリシを指定する形に PSP の利点の引き継ぎ・欠点の解消
  • 20. 20 ● 🙆 ポリシに適合するよう、Pod spec を自動で mutate する 🙅 Pod spec の mutation が暗黙的 ○ Gatekeeper ではリソースの mutation も可能 ■ 例:Pod の runAsUser フィールドにユーザごとの UID を書き込む ○ Mutation 操作は Assign などのカスタムリソースで明示的に表現 ● → 結果:PSP の利点をすべて引き継ぎ・欠点をすべて解消 Mutation
  • 21. 21 ● ユーザ向け:スムーズな移行のため、既存の PSP と同等のポリシ ○ root ■ Pod が root 権限で動くことを許可 ■ UID / GID 以外の制約が強い(HostPath 禁止など) ○ non-root ■ Pod が一般ユーザ権限で動くことを強制 ● クラスタアドオン向け:Pod Security Standards に準拠したポリシ ○ restricted ○ baseline ○ privileged(制約リソースなし) 用意したポリシ
  • 22. 22 ● すべての pod に適切なポリシが適用されていることを担保したい ○ クラスタアドオン ■ 解決策:デフォルトで restricted ポリシを適用 ○ ユーザの pod ■ 課題:どのポリシを適用するかは pod のラベルで指定 ● ユーザは pod のラベルを自由に設定できる ■ 課題:Pod spec によって適用するポリシを選択したい ■ → 解決策:Mutating admission webhook と組み合わせ ポリシ適用の強制
  • 23. 23 Mutating admission webhook との連携 kind: Pod metadata: labels: gatekeeper.k8s.preferred.jp/policy: root Pod spec に応じてポリシを選択 Mutating admission webhook Gatekeeper kind: Pod metadata: labels: {} ● ポリシを指定するラベルを検証 ● ポリシに応じて制約を満たすか検証
  • 25. 25 1. クラスタアドオンのポリシ違反をすべて修正 a. ユーザ向けポリシは PSP と互換だったため、ユーザの移行作業は不要 2. ポリシの適用を有効化 3. (etcd から PodSecurityPolicy リソースを削除) a. Kubernetes 更新後は PSP の削除もできなくなるため 4. Kubernetes を 1.25 に更新 移行の進め方
  • 26. 26 1. Gatekeeper の制約リソースを spec.enforcementAction: warn で作成 a. 違反時も pod 作成・更新は拒否せず、警告のみ b. クラスタアドオンを稼働させたままにできる 2. ポリシ違反が解消されるまで、クラスタアドオンを一つずつ修正 a. Gatekeeper の audit controller のログで違反を確認 i. 定期的にクラスタ上の pod を検査 b. ほとんどのアドオンは securityContext を明示的に設定すること で restricted ポリシに適合できた クラスタアドオンのポリシ違反をすべて修正
  • 27. 27 1. 制約リソースをすべて spec.enforcementAction: deny に変更 a. 違反時に pod 作成・更新を拒否 2. クラスタアドオンをローリングリスタートし、起動することを確認 ポリシの適用を有効化
  • 28. 28 ● Kubernetes 1.25 への更新を契機に PSP から Gatekeeper に移行した ○ PSP の利点を引き継ぎつつ欠点を解消するよう、制約リソースを 組織化し「ポリシ」を構成 ○ ユーザに影響なく クラスタアドオンをポリシに適合させていき、 スムーズな更新を達成 ● 今後:社内の admission webhook の機能を Gatekeeper に移植する ことを検討 ○ ポリシの宣言的な記述・リリース作業の簡略化のため まとめと今後
  • 29. Making the real world computable