SlideShare a Scribd company logo
1 of 54
2022/09/27
@mochizuki875
Pod Security Admissionによる
Kubernetesのポリシー制御
Kubernetes Novice Tokyo #21
Name
Keita Mochizuki(mochizuki875)
Company
NTT DATA Corporation
NTT OSS Center
Role
Platform Engineer
whoami
a fox, not a
raccoon dog.
@mochizuki875
宣伝
金曜22:00~23:00(隔週)にKubernetes/Cloud Native関連の話題をYouTube生配信にて
雑談形式で配信しています。
https://kubenews.connpass.com/
@mochizuki875
@antiberial
@bells17̲ @it̲̲chago
@URyo̲0213
宣伝
本日ご説明するPod Security Admissionについて、
先日記事を執筆させていただきました。
こちらも併せてご覧いただけますと幸いです。
@IT
Cloud Nativeチートシート
Kubernetes 1.25からのスタンダード「Pod Security Admission」で
Pod/コンテナのセキュリティを強化しよう
https://atmarkit.itmedia.co.jp/ait/articles/2208/30/news003.html
はじめに
Kubernetesのセキュリティの文脈でしばしばポリシー制御という言葉を耳にすることがあると
思います。
本セッションではKubernetesにおけるコンテナのリスクを踏まえたポリシー制御の意義、
およびKubernetes v1.25でGAとなったKubernetes Built-inのポリシー制御機能である
Pod Security Admissionの基本的な機能についてご説明します。
・本発表はサイバー攻撃を肯定するものではありません
・発表内で用いるコンテナという言葉は基本的にruncで実行されるコンテナを指します
・掲載内容は個人の見解であり、所属する企業や組織の立場、戦略、意見を代表するものではありません
・記載されている会社名、商品名、またはサービス名は、各社の商標登録または商標です
はじめに
1. コンテナのリスク
2. 安全なコンテナの設定とは
3. Kubernetesにおけるポリシー制御
4. Pod Security Admissionによるポリシー制御
4.1. Namespaceに対するポリシー適用
4.2. ポリシー適用前のDry-run
4.3. デフォルトポリシーの適用
5. まとめ
Agenda
1. コンテナのリスク
2. 安全なコンテナの設定とは
3. Kubernetesにおけるポリシー制御
4. Pod Security Admissionによるポリシー制御
4.1. Namespaceに対するポリシー適用
4.2. ポリシー適用前のDry-run
4.3. デフォルトポリシーの適用
5. まとめ
Agenda
1. コンテナのリスク
コンテナの実態はカーネル上で実行されるプロセスです。
OS(Kernel)
Process Process Process
1. コンテナのリスク
OS(Kernel)
コンテナの実態はカーネル上で実行されるプロセスです。
コンテナにあたるプロセスがカーネルの持つ様々な機能により隔離されることで、コンテナとしての機能が実現されます。
Process
rootfs
Process
rootfs
Process
rootfs
実行空間(ex. Namespace、pivot̲root)
プロセスが動作する環境を隔離しあたかも単体で動いているように見せかける
リソース使用量(ex. Cgroup)
プロセスが使用できるリソース量(CPU,Memoryなど)を制限する
権限(ex. Capability、Apparmor、Seccomp)
プロセスのカーネルに対する操作を制限する
Container Container Container
1. コンテナのリスク
OS(Kernel)
コンテナの隔離性が十分に保たれていれば基本的にコンテナ内のプロセスがコンテナ外部に影響を及ぼすことはありません。
しかしながら隔離が不十分な状態であると特定のコンテナ内のプロセスから他のコンテナやコンテナホストに対する操作を
行えてしまう場合があります。(Container Breakout)
Kubernetes上にコンテナ(Pod)をデプロイする際は、マニフェストにてコンテナに対する様々な設定を行うことができますが、
この設定によりコンテナの隔離性を強めることも弱めることもできます。
Process
rootfs
Process
rootfs
Process
rootfs
Container Container Container
具体的にコンテナの隔離性が損なわれている場合のリスクを見てみましょう。
例えば以下のようなマニフェストがあります。
このマニフェストにはコンテナの隔離性を低下させる脆弱な設定が2ヶ所含まれています。
1. コンテナのリスク
apiVersion: v1
kind: Pod
metadata:
name: exploit-pod
spec:
hostPID: true
containers:
- name: ubuntu
image: ubuntu:20.04
command: ["/bin/sh", "-c", "while :; do sleep 10; done"]
securityContext:
privileged: true
exploit-pod.yaml
コンテナに過剰な権限(特権)を与えている
コンテナホストとPID Namespaceを共有
用意した脆弱なマニフェストを用いてKubernetes上にPodをデプロイしてみます。
Podのデプロイが完了したらコンテナに接続し、内部で以下のようなコマンドを実行してみます。
最終的に接続したコンテナからPodが起動しているホスト(Worker Node)に侵入できてしまっていることがわかります。
1. コンテナのリスク
# kubectl apply -f exploit-pod.yaml
pod/exploit-pod created
# kubectl get po
NAME READY STATUS RESTARTS AGE
exploit-pod 1/1 Running 0 16s
# kubectl exec -it exploit-pod -- /bin/bash
root@exploit-pod:/# hostname
exploit-pod
root@exploit-pod:/# nsenter -t 1 -a /bin/bash
root@k8s-cluster-worker01:/# hostname
k8s-cluster-worker01
コンテナに接続
コンテナホストでコマンド実行
コンテナホストに侵入
このような脆弱な設定のPodがデプロイ可能な状態というのは、例えば以下のようなリスクに繋がると言えます。
1. コンテナのリスク
Developer
Kubernetes Cluster
Worker Node #1
Worker Node #2
Manifest
Service A
Service B
脆弱な設定を含む
Web
Master Node
Attacker
NW
Attack!!
例1: 外部の攻撃者に基盤を乗っ取られてしまうリスク
脆弱なコンテナの設定を含んだ状態でWebサーバーPodをデプロイし、外部に公開しているケースを想定します。
万一外部の攻撃者にWebサーバーPodへの侵入を許してしまった場合、攻撃者はコンテナの脆弱性を悪用して
WebサーバーPodのみならずWorker Nodeや他のPodなど、攻撃の範囲を基盤全体に拡大できてしまうリスクに繋がります。
乗っ取れコンテナ!!〜開発者から見たコンテナセキュリティの考え方〜
https://speakerdeck.com/mochizuki875/container-dev-security
攻撃範囲を拡大
このような脆弱な設定のPodがデプロイ可能な状態というのは、例えば以下のようなリスクに繋がると言えます。
1. コンテナのリスク
Kubernetes Cluster
Worker Node #1
Worker Node #2
Service A
Service B
exploit
例2: アプリ開発者が与えられた権限を超えてクラスタを操作できてしまうリスク
Kubernetesクラスタをコンテナ基盤としてアプリ開発者に提供しているケースを想定します。
アプリ開発者にはKubernetesにPodをデプロイするといった基本的な操作は許可したいですが、Worker Nodeなどのクラスタ構成要素へは
アクセスはさせたくありません。 しかしながら、悪意のあるアプリ開発者が脆弱なコンテナ設定を含むPodをデプロイした場合、
デプロイしたPodを経由して本来権限の与えられていないWorker Nodeに不正にアクセスを行い、攻撃を実現できてしまうリスクに繋がります。
Developer(Attacker)
Master Node
権限を超えたアクセス
Manifest
脆弱な設定を含む
1. コンテナのリスク
2. 安全なコンテナの設定とは
3. Kubernetesにおけるポリシー制御
4. Pod Security Admissionによるポリシー制御
4.1. Namespaceに対するポリシー適用
4.2. ポリシー適用前のDry-run
4.3. デフォルトポリシーの適用
5. まとめ
Agenda
Pod Security Standards
https://kubernetes.io/docs/concepts/security/pod-security-standards/
2. 安全なコンテナの設定とは
ポリシー 概要 設定項目の例 セキュリティレベル
Privileged
コンテナの設定項目に規定を設けないポリシー
ー 低
Baseline
コンテナへの特権付与などリスクが明確である設定項目
について最低限規定したポリシー
・コンテナへの特権付与を禁止
・コンテナとホスト間でのNamespace共有を禁止
・HostPathの利用を禁止
etc...
中
Restricted
コンテナの実行ユーザーなど詳細な設定項目までを規定
したベストプラクティスに該当するポリシー
・Baselineで規定されるすべての設定項目
・rootユーザーでのコンテナ起動を禁止
・コンテナ内での特権昇格を禁止
・Seccompの明示的な有効化
etc...
高
Kubernetesの公式ドキュメントではPod Security Standardsと呼ばれるガイドラインを提供しています。
このガイドラインでは下記の3種類のポリシーに応じたPodに関するの設定項目が定義されており、
それらに準拠することで所定のセキュリティレベルを確保することができます。
2. 安全なコンテナの設定とは
(参考)Pod Security Standardsの一例
1. コンテナのリスク
2. 安全なコンテナの設定とは
3. Kubernetesにおけるポリシー制御
4. Pod Security Admissionによるポリシー制御
4.1. Namespaceに対するポリシー適用
4.2. ポリシー適用前のDry-run
4.3. デフォルトポリシーの適用
5. まとめ
Agenda
3. Kubernetesにおけるポリシー制御
先に示したコンテナの設定に起因するリスクに対応するためには、
Kubernetesに脆弱な設定を含むPodをデプロイさせないと言うことが1つの対策になると言えます。
KubernetesにPodをデプロイする際、特定のポリシー(ex. Pod Security Standards)に準拠させるための仕組みを
一般的にポリシー制御と呼びます。
ポリシー制御には以下に示す通り、一般的にValidationとMutationの2種類の制御方式が存在します。
※なおここではPodのみに言及していますが、広義のポリシー制御ではPod以外のリソースも制御対象になります
Manifest
脆弱な設定を含む
Check
デプロイを禁止
Pod Pod
設定を書き換えてデプロイ
Validation
設定を検査した結果、ポリシーに準拠していない
Podのデプロイを禁止する
Mutation
ポリシーに準拠していないPodの設定を上書きして
強制的にポリシーに準拠させる
Manifest
脆弱な設定を含む
Check
3. Kubernetesにおけるポリシー制御
代表的なKubernetesにおけるポリシー制御実現方式
OPA Gatekeeper (3rd-party)
Rego言語を用いてポリシーを定義
KubernetesのAdmission Webhookを用いてポリシー制御(Validation/Mutation)を実現
Kyverno (3rd-party)
YAMLベースでポリシーを定義
KubernetesのAdmission Webhookを用いてポリシー制御(Validation/Mutation)を実現
jsPolicy (3rd party)
JavaScriptでポリシーを定義
KubernetesのAdmission Webhookを用いてポリシー制御(Validation/Mutation)を実現
比較的新しいツール(2021/06 v0.1.0 Release)
Pod Security Policy (Built-in)
YAMLベースでポリシーを定義
KubernetesのAdmission Pluginとしてポリシー制御(Validation/Mutation)を実現
Kubernetes v1.21で非推奨、v1.25で廃止
→ 代替としてPod Security Admission (Built-in)が組み込まれた
3. Kubernetesにおけるポリシー制御
deprecate PSP in 1.21, but leave removal at 1.25 #97171
https://github.com/kubernetes/kubernetes/pull/97171
なぜ Pod Security Policy (PSP) は Kubernetes 1.21 から非推奨になったのか?
https://qiita.com/kiyoshim55/items/0262d42b57320bea2d00
Migrate from PodSecurityPolicy to the Built-In PodSecurity Admission Controller
https://kubernetes.io/docs/tasks/con
fi
gure-pod-container/migrate-from-psp/
Why is PodSecurityPolicy going away?
In the years since PodSecurityPolicy was
fi
rst introduced, we have realized that PSP has some serious
usability problems that canʼt be addressed without making breaking changes.
PodSecurityPolicy Deprecation: Past, Present, and Future
https://kubernetes.io/blog/2021/04/06/podsecuritypolicy-deprecation-past-present-and-future/
(参考) Pod Security Policy廃止に関する情報
1. コンテナのリスク
2. 安全なコンテナの設定とは
3. Kubernetesにおけるポリシー制御
4. Pod Security Admissionによるポリシー制御
4.1. Namespaceに対するポリシー適用
4.2. ポリシー適用前のDry-run
4.3. デフォルトポリシーの適用
5. まとめ
Agenda
4. Pod Security Admissionによるポリシー制御
Pod Security Admission
Kubernetes v1.25で新たにGAとなったポリシー制御の仕組み (Built-in)
- Pod Security Policyの置き換え(v1.22 alpha、v1.23 beta)
Pod Security StandardsをベースとしたValidation機能を主として提供
- 事前にポリシーを定義する必要がない(任意のポリシーを定義することは不可)
- Mutation機能は現時点で提供されていない
Namespaceに対してポリシーを適用
- 3つのモードそれぞれに対してPod Security Standardsのポリシーを指定
- 適用前の事前確認(Dry-run)が可能
- デフォルトポリシーの定義が可能
モード ポリシーに違反するPodのデプロイを検知した場合の挙動 設定値(Pod Security Standardsのポリシー)
enforce Podのデプロイを禁止する。(Validation)
privileged (default)
baseline
restricted
audit KubernetesのAudit Logに記録する。(Podはデプロイされる)
warn 警告を表示する。(Podはデプロイされる)
※Pod Security Admissionの機能自体はデフォルトで有効になっています。しかしながら各モードに対してポリシーを指定しなかった場合、
そのモードには暗黙的にPrivilegedが設定されることになるため、結果的にポリシー制御は行われない状態になります。
4. Pod Security Admissionによるポリシー制御
ここからは以下のような環境に対してPod Security Admissionの3つの機能を使用する例を見ていきます。
Kubernetes Cluster
namespace-a namespace-b namespace-c namespace-d
1. コンテナのリスク
2. 安全なコンテナの設定とは
3. Kubernetesにおけるポリシー制御
4. Pod Security Admissionによるポリシー制御
4.1. Namespaceに対するポリシー適用
4.2. ポリシー適用前のDry-run
4.3. デフォルトポリシーの適用
5. まとめ
Agenda
4.1. Pod Security Admission - Namespaceに対するポリシー適用 -
Kubernetesクラスター上に存在する特定のNamespace(namespace-a)に対してポリシーを適用し、
その挙動を確認します。
Kubernetes Cluster
namespace-a namespace-b namespace-c namespace-d
enforce: baseline
audit: restricted
warn: restricted
ポリシー凡例
4.1. Pod Security Admission - Namespaceに対するポリシー適用 -
apiVersion: v1
kind: Namespace
metadata:
name: namespace-a
labels:
# Baselineポリシーに違反するPodのデプロイを禁止
pod-security.kubernetes.io/enforce: baseline
pod-security.kubernetes.io/enforce-version: v1.25
# Restrictedポリシーに違反するPodのデプロイを検知した場合はAudit Logに記録(違反してもPodはデプロイされる)
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/audit-version: v1.25
# Restrictedポリシーに違反するPodのデプロイを検知した場合は警告を表示(違反してもPodはデプロイされる)
pod-security.kubernetes.io/warn: restricted
pod-security.kubernetes.io/warn-version: v1.25
namespace-a.yaml
Namespaceに対してポリシーを適用する際は、labelsにて各モードそれぞれどのポリシーを適用するかを設定します。
※Pod Security StandardsはKubernetesのバージョンによって内容が見直されるケースがあるためそれぞれバージョンをしてしています。
latestを指定するとそのクラスターで使用可能な最新バージョンの内容が適用されることになります。
4.1. Pod Security Admission - Namespaceに対するポリシー適用 -
apiVersion: v1
kind: Pod
metadata:
name: exploit-pod
spec:
hostPID: true
containers:
- name: ubuntu
image: ubuntu:20.04
command: ["/bin/sh", "-c", "while :; do sleep 10; done"]
securityContext:
privileged: true
exploit-pod.yaml (再掲)
ポリシーが適用されているnamespace-aと、ポリシーが適用されていないnamespace-bに対して以下のマニフェストを用いて
Pod Security StandardsのBaselineに違反するPodをデプロイしてみます。
4.1. Pod Security Admission - Namespaceに対するポリシー適用 -
# kubectl apply -f exploit-pod.yaml -n namespace-a
Error from server (Forbidden): error when creating "exploit-pod.yaml": pods "exploit-pod" is forbidden: violates
PodSecurity "baseline:v1.25": host namespaces (hostPID=true), privileged (container "ubuntu" must not set
securityContext.privileged=true)
# kubectl get po -n namespace-a
No resources found in namespace-a namespace.
# kubectl apply -f exploit-pod.yaml -n namespace-b
pod/exploit-pod created
# kubectl get po -n namespace-b
NAME READY STATUS RESTARTS AGE
exploit-pod 1/1 Running 0 7s
exploit-pod.yaml を各Namespaceに適用してみると、それぞれ以下のような結果になります。
namespace-bでは通常通りPodのデプロイが成功しているのに対し、ポリシーを適用したnamespace-aではエラーが表示され
Podのデプロイに失敗していることが分かります。
namespace-a(ポリシーが適用されている)
namespace-b(ポリシーが適用されていない)
Baselineポリシーに違反しているためPodのデプロイが拒否された
[Pod Security Admission]
enforce: baseline
audit: restricted
warn: restricted
4.1. Pod Security Admission - Namespaceに対するポリシー適用 -
{
"kind": "Event",
……
"responseStatus": {
"metadata": {},
"status": "Failure",
"message": "pods "exploit-pod" is forbidden: violates PodSecurity "baseline:v1.25": host namespaces (hostPID=true), privileged (container "ubuntu" must not set
securityContext.privileged=true)",
"reason": "Forbidden",
"details": {
"name": "exploit-pod",
"kind": "pods"
},
"code": 403
},
"requestReceivedTimestamp": "2022-08-25T14:37:11.624385Z",
"stageTimestamp": "2022-08-25T14:37:11.634141Z",
"annotations": {
"authorization.k8s.io/decision": "allow",
"authorization.k8s.io/reason": "",
"pod-security.kubernetes.io/audit-violations": "would violate PodSecurity "restricted:v1.25": host namespaces (hostPID=true), privileged (container "ubuntu" must not set
securityContext.privileged=true), allowPrivilegeEscalation != false・・・
"pod-security.kubernetes.io/enforce-policy": "baseline:v1.25"
}
}
Audit Logを確認すると以下のようにPod Security StandardsのBaselineポリシーに違反したことによりPodのデプロイが
拒否されたことが記録されているのが分かります。また、Restrictedポリシーに違反している旨も併せて記録されています。
Audit Log
Baselineポリシーに違反しているためPodのデプロイが拒否された
Restrictedポリシーに違反していることが記録された
[Pod Security Admission]
enforce: baseline
audit: restricted
warn: restricted
4.1. Pod Security Admission - Namespaceに対するポリシー適用 -
baseline-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: exploit-pod
spec:
hostPID: true
containers:
- name: ubuntu
image: ubuntu:20.04
command: ["/bin/sh", "-c", "while :; do sleep 10; done"]
securityContext:
privileged: true
先ほどの脆弱な設定を含むマニフェスト(exploit-pod.yaml)に対して、Pod Security StandardsのBaselineポリシーに準拠する
修正を加えたマニフェスト(baseline-pod.yaml)を用意します。
※ただしRestrictedポリシーには準拠していない
4.1. Pod Security Admission - Namespaceに対するポリシー適用 -
baseline-pod.yamlをnamespace-aに適用し、Podをデプロイしてみます。
すると警告メッセージが表示されつつ、Podのデプロイは成功していることが確認できます。
このようにPod Security Admissionではポリシーに準拠していないPodのデプロイを防止したり、
ポリシー違反による警告文言の表示やAudit Logへの記録を行うことができます。
# kubectl apply -f baseline-pod.yaml -n namespace-a
Warning: would violate PodSecurity "restricted:v1.25": allowPrivilegeEscalation != false (container "ubuntu" must set
securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "ubuntu" must set
securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "ubuntu" must set
securityContext.runAsNonRoot=true), seccompPro
fi
le (pod or container "ubuntu" must set
securityContext.seccompPro
fi
le.type to "RuntimeDefault" or "Localhost")
pod/baseline-pod created
# kubectl get po -n namespace-a
NAME READY STATUS RESTARTS AGE
baseline-pod 1/1 Running 0 35s
Restrictedポリシーに違反していることが警告として表示され、
Podがデプロイされた
[Pod Security Admission]
enforce: baseline
audit: restricted
warn: restricted
4.1. Pod Security Admission - Namespaceに対するポリシー適用 -
DeploymentとしてBaselineに違反するPodをデプロイしてみます。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: exploit
name: exploit
spec:
replicas: 1
selector:
matchLabels:
app: exploit
template:
metadata:
labels:
app: exploit
spec:
hostPID: true
containers:
- image: ubuntu:20.04
name: ubuntu
command: ["/bin/sh", "-c", "while :; do sleep 10; done"]
securityContext:
privileged: true
exploit-deployment.yaml
4.1. Pod Security Admission - Namespaceに対するポリシー適用 -
# kubectl apply -f exploit-deployment.yaml -n namespace-a
Warning: would violate PodSecurity "restricted:v1.25": host namespaces (hostPID=true), privileged (container "ubuntu" must not set
securityContext.privileged=true), allowPrivilegeEscalation != false (container "ubuntu" must set・・・
deployment.apps/exploit created
# kubectl get all -n namespace-a
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/exploit 0/1 0 0 19s
NAME DESIRED CURRENT READY AGE
replicaset.apps/exploit-b6765566f 1 0 0 19s
# kubectl describe replicasets.apps exploit-b6765566f -n namespace-a
・・・
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedCreate 49m replicaset-controller Error creating: pods "exploit-b6765566f-84d74" is forbidden: violates
PodSecurity "baseline:v1.25": host namespaces (hostPID=true), privileged (container "ubuntu" must not set
securityContext.privileged=true)
DeploymentとReplicaSetは作成される
ReplicaSetで管理されるPodのデプロイが拒否される
この場合、Deployment、ReplicaSetは通常通り作成されます。
ただしReplicaSet配下で管理されるPodのデプロイについてはPod Security Admissionによるポリシー制御の対象となるため
先の例と同じくデプロイが禁止されます。
1. コンテナのリスク
2. 安全なコンテナの設定とは
3. Kubernetesにおけるポリシー制御
4. Pod Security Admissionによるポリシー制御
4.1. Namespaceに対するポリシー適用
4.2. ポリシー適用前のDry-run
4.3. デフォルトポリシーの適用
5. まとめ
Agenda
4.2. Pod Security Admission - ポリシー適用前のDry-run -
既にPodが起動しているNamespaceにポリシー適用を行う場合、ポリシー適用前にポリシー適用による影響を確認したい
というケースがあります。
Dry-run機能を用いることで、
ポリシーを適用することなく特定のNamespaceで既に起動中のPodがにポリシーに準拠しているか
を確認することができます。
Kubernetes Cluster
namespace-a namespace-b namespace-c namespace-d
enforce: baseline
audit: restricted
warn: restricted
ポリシー凡例
exploit-pod
Baselineポリシーに準拠しているか?
4.2. Pod Security Admission - ポリシー適用前のDry-run -
# kubectl label --dry-run=server --overwrite ns namespace-b 
pod-security.kubernetes.io/enforce=baseline pod-security.kubernetes.io/enforce-version=v1.25
Warning: existing pods in namespace "namespace-b" violate the new PodSecurity enforce level "baseline:v1.25"
Warning: exploit-pod: host namespaces, privileged
namespace/namespace-b labeled
# kubectl get ns namespace-b --show-labels
NAME STATUS AGE LABELS
namespace-b Active 116m kubernetes.io/metadata.name=namespace-b
exploit-podがBaselineポリシーに違反している
実際にはlabelsは付与されない (ポリシーは有効になっていない)
namespace-bで起動しているPodがBaselineポリシーに準拠しているかをDry-run機能により確認してみます。
Dry-runコマンドを実行してみると、以下のように既に起動しているnamespace-bで起動しているPodが
Baselineポリシーに違反していることが確認できます。
※Pod Security AdmissionによるValidationはPod作成時にのみ機能するので、既にポリシーに違反するPodが起動状態で
ポリシーを適用しても、該当のPodが即座に停止することはありません。(ValidationはAdmission Controllで実行されるため)
しかし意図せぬトラブルを避ける意味でも既にPodが起動しているNamespaceに対してポリシーを適用する場合は、
適用前にDry-run機能を用いてポリシー違反が発生しないかを確認しておくのが良いでしょう。
1. コンテナのリスク
2. 安全なコンテナの設定とは
3. Kubernetesにおけるポリシー制御
4. Pod Security Admissionによるポリシー制御
4.1. Namespaceに対するポリシー適用
4.2. ポリシー適用前のDry-run
4.3. デフォルトポリシーの適用
5. まとめ
Agenda
4.3. Pod Security Admission - デフォルトポリシーの適用 -
Kubernetes Cluster
namespace-a namespace-b namespace-c namespace-d
enforce: baseline
audit: restricted
warn: restricted
ポリシー凡例
Kubernetesクラスターとしてデフォルトポリシーを定義し、ポリシーが適用されていないNamespaceには
デフォルトポリシーが適用されるようにします。
また、namespace-cについてはPod Security Admissionによるポリシーの適用対象外とします。
4.3. Pod Security Admission - デフォルトポリシーの適用 -
Kubernetesクラスターのデフォルトポリシーやポリシー適用除外対象はAdmissionCon
fi
gurationとして定義することが
できます。
※ここで除外設定した対象についてはNamespaceにlabelsを付与してもポリシーが適用されなくなる
apiVersion: apiserver.con
fi
g.k8s.io/v1
kind: AdmissionCon
fi
guration
plugins:
- name: PodSecurity
con
fi
guration:
apiVersion: pod-security.admission.con
fi
g.k8s.io/v1
kind: PodSecurityCon
fi
guration
defaults: # デフォルトポリシーを定義
enforce: "baseline" # Baselineポリシーに違反するPodのデプロイを禁止
enforce-version: "v1.25"
audit: "restricted" # Restrictedポリシーに違反するPodのデプロイを検知した場合はAudit Logに記録(違反してもPodはデプロイされる)
audit-version: "v1.25"
warn: "restricted" # Restrictedポリシーに違反するPodのデプロイを検知した場合は警告を表示(違反してもPodはデプロイされる)
warn-version: "v1.25
exemptions: # ポリシー適用除外対象
usernames: [] # ポリシーを適用しないユーザーを指定する
runtimeClasses: [] # ポリシーを適用しないRuntimeClassを指定する
namespaces: # ポリシーを適用しないNamespaceを指定する
- kube-system
- namespace-c
pod-security.yaml
4.3. Pod Security Admission - デフォルトポリシーの適用 -
A Guide to Kubernetes Admission Controllers
https://kubernetes.io/blog/2019/03/21/a-guide-to-kubernetes-admission-controllers/
(参考) KubernetesにおけるValidation/Mutation
一般的にKubernetesmではAPI Serverへのリクエスト時にAdmission Controllerと呼ばれる仕組みを用いてValidation/Mutationを
実現します。
Pod Security AdmissionについてもAdmission Controllerに含まれるAdmission Pluginと言う仕組みを用いて実現されています。
kube-apiserverの処理フロー
4.3. Pod Security Admission - デフォルトポリシーの適用 -
apiVersion: v1
kind: Pod
metadata:
・・・
name: kube-apiserver
namespace: kube-system
spec:
containers:
- command:
- kube-apiserver
・・・
- --admission-control-con
fi
g-
fi
le=/etc/kubernetes/policies/pod-security.yaml
・・・
volumeMounts:
- mountPath: /etc/kubernetes/policies
name: policies
readOnly: true
・・・
volumes:
- name: policies
hostPath:
path: /etc/kubernetes/policies
type: DirectoryOrCreate
・・・
/etc/kubernetes/manifests/kube-apiserver.yaml (kubeadmの例)
AdmissionCon
fi
gurationをKubernetesクラスターに適用するには、kube-apiserverの起動オプション
--admission-control-con
fi
g-
fi
leで、AdmissionCon
fi
guration定義ファイルを指定します。
4.3. Pod Security Admission - デフォルトポリシーの適用 -
# kubectl apply -f exploit-pod.yaml -n namespace-b
Error from server (Forbidden): error when creating "exploit-pod.yaml": pods "exploit-pod" is forbidden: violates
PodSecurity "baseline:v1.25": host namespaces (hostPID=true), privileged (container "ubuntu" must not set
securityContext.privileged=true)
# kubectl get po -n namespace-b
No resources found in namespace-b namespace.
# kubectl apply -f exploit-pod.yaml -n namespace-c
pod/exploit-pod created
# kubectl get po -n namespace-c
NAME READY STATUS RESTARTS AGE
exploit-pod 1/1 Running 0 20s
exploit-pod.yaml をnamespace-bとnamespace-cに適用してみます。
namespace-bにはデフォルトポリシーが適用されているためPodのデプロイに失敗していることが確認できます。
一方namespace-cではポリシーが適用されず、正常にPodのデプロイに成功していることが確認できます。
namespace-c(ポリシー適用除外対象として指定)
namespace-b(デフォルトポリシーが適用される)
ポリシーが適用されずPodのデプロイに成功している
Baselineポリシーに違反しているためPodのデプロイが拒否された
[Pod Security Admission]
enforce: baseline
audit: restricted
warn: restricted
4.3. Pod Security Admission - デフォルトポリシーの適用 -
(参考)ポリシー適用除外対象としてUsernameを指定する際の注意事項
ポリシーの適用対象外としてUsernameを指定する場合はPod作成に関連するServiceAccountを指定してしまうと
Pod Security Admissionによるポリシー制御が意味をなさなくなってしまうため注意が必要です。
例として、以下ではreplicaset-controllerのServiceAccountをポリシー適用対象外に指定したケースを考えてみます。
Kubernetes Cluster
kube-system namespace (enforce: baseline)
exploit-pod
Create
ポリシーにより作成が禁止される
Baselineに違反する
Podをデプロイ
4.3. Pod Security Admission - デフォルトポリシーの適用 -
Kubernetes Cluster
replicaset-controller
※ポリシー適用対象外
kube-system namespace (enforce: baseline)
replicaset-controller exploit-pod
exploit-replicaset
Create
Create
Watch
Controller経由で
Podが作成されてしまう
Baselineに違反する
Podを含む
ReplicaSetを作成
(参考)ポリシー適用除外対象としてUsernameを指定する際の注意事項
ポリシーの適用対象外としてUsernameを指定する場合はPod作成に関連するServiceAccountを指定してしまうと
Pod Security Admissionによるポリシー制御が意味をなさなくなってしまうため注意が必要です。
例として、以下ではreplicaset-controllerのServiceAccountをポリシー適用対象外に指定したケースを考えてみます。
ポリシーに違反するPodを
ReplicaSet経由でデプロイ
できてしまう
4.3. Pod Security Admission - デフォルトポリシーの適用 -
Kubernetes Cluster
namespace-a namespace-b namespace-c namespace-d
enforce: baseline
audit: restricted
warn: restricted
ポリシー凡例
デフォルトポリシーが適用されている状態で、特定のNamespace(namespace-d)にポリシーを適用し、挙動を確認してみます。
enforce: privileged
audit: baseline
warn: baseline
4.3. Pod Security Admission - デフォルトポリシーの適用 -
namespace-dに適用するポリシーは以下の通りです。
namespace-dに対してはデフォルトポリシーよりも制約の弱いポリシーを適用しています。
apiVersion: v1
kind: Namespace
metadata:
name: namespace-d
labels:
# Privilegedポリシー(Podのデプロイを制限しない)
pod-security.kubernetes.io/enforce: privileged
pod-security.kubernetes.io/enforce-version: v1.25
# Baselineポリシーに違反するPodのデプロイを検知した場合はAudit Logに記録(違反してもPodはデプロイされる)
pod-security.kubernetes.io/audit: baseline
pod-security.kubernetes.io/audit-version: v1.25
# Baselineポリシーに違反するPodのデプロイを検知した場合は警告を表示(違反してもPodはデプロイされる)
pod-security.kubernetes.io/warn: baseline
pod-security.kubernetes.io/warn-version: v1.25
namespace-d.yaml
4.3. Pod Security Admission - デフォルトポリシーの適用 -
# kubectl apply -f exploit-pod.yaml -n namespace-d
Warning: would violate PodSecurity "baseline:v1.25": host namespaces (hostPID=true), privileged (container "ubuntu"
must not set securityContext.privileged=true)
pod/exploit-pod created
kubectl get po -n namespace-d
NAME READY STATUS RESTARTS AGE
exploit-pod 1/1 Running 0 9s
exploit-pod.yamlをnamespace-dに適用し、Podをデプロイしてみます。
すると警告メッセージが表示されつつPodのデプロイは成功していることが確認できます。
このようにデフォルトポリシーが適用されている状態でNamespaceに個別にポリシーを適用した場合は、
Namespaceに適用したポリシーが優先的に適用されることになります。
namespace-dのポリシーが適用された
Baselineポリシーに違反していることが警告として表示され、
Podがデプロイされた
[Pod Security Admission]
enforce: privileged
audit: baseline
warn: baseline
1. コンテナのリスク
2. 安全なコンテナの設定とは
3. Kubernetesにおけるポリシー制御
4. Pod Security Admissionによるポリシー制御
4.1. Namespaceに対するポリシー適用
4.2. ポリシー適用前のDry-run
4.3. デフォルトポリシーの適用
5. まとめ
Agenda
5. まとめ
Pod Security AdmissionによりKubernetesのポリシー制御実現が容易になった
・ポリシーの定義不要
・Namespaceにlabelsを付与するだけでポリシー適用が可能
・Built-inなので3rd-Partyのライフサイクルを考慮する必要がない
ポリシー制御の汎用性に難あり
・Pod Security Standardsに準拠したポリシー制御しか行えない(一部の設定項目のみ変更することも不可)
・Mutationが行えない
→汎用性を求める場合は3rd-Partyを利用
Namespaceに対する権限に注意
・Namespaceのlabelsを操作できればポリシーを変更できてしまう
→基盤利用者にNamespaceに対する権限を与えないようRBACで制限
PodSecurityPolicyの廃止に備えて、 一足先にPodSecurity Admissionを試してみよう!
https://speakerdeck.com/uesyn/from-psp-to-podsecurity
コンテナ技術入門 - 仮想化との違いを知り、要素技術を触って学ぼう
https://eh-career.com/engineerhub/entry/2019/02/05/103000
参考
初めてのコミュニティ登壇として最適な場だと思います!
みなさんも是非登壇にチャレンジしてみてください!
Thank You!!

More Related Content

What's hot

What's hot (20)

Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
 
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)
その Pod 突然落ちても大丈夫ですか!?(OCHaCafe5 #5 実験!カオスエンジニアリング 発表資料)
 
AKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみたAKS と ACI を組み合わせて使ってみた
AKS と ACI を組み合わせて使ってみた
 
急速に進化を続けるCNIプラグイン Antrea
急速に進化を続けるCNIプラグイン Antrea 急速に進化を続けるCNIプラグイン Antrea
急速に進化を続けるCNIプラグイン Antrea
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
 
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
 
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
 
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
 
【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践
【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践
【de:code 2020】 Azure Red hat OpenShift (ARO) によるシステムアーキテクチャ構築の実践
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
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 発表資料)
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
 
Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説Prometheus入門から運用まで徹底解説
Prometheus入門から運用まで徹底解説
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
Docker Tokyo
Docker TokyoDocker Tokyo
Docker Tokyo
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)
Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)
Kubernetes 基盤における非機能試験の deepdive(Kubernetes Novice Tokyo #17 発表資料)
 
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
Kinesis + Elasticsearchでつくるさいきょうのログ分析基盤
 

Similar to Pod Security AdmissionによるKubernetesのポリシー制御(Kubernetes Novice Tokyo #21 発表資料)

【DeepSecurityUserNight】我が家の箱入り娘を世間に晒すのは危険なのでDeepSecurityに見守ってもらった話
【DeepSecurityUserNight】我が家の箱入り娘を世間に晒すのは危険なのでDeepSecurityに見守ってもらった話【DeepSecurityUserNight】我が家の箱入り娘を世間に晒すのは危険なのでDeepSecurityに見守ってもらった話
【DeepSecurityUserNight】我が家の箱入り娘を世間に晒すのは危険なのでDeepSecurityに見守ってもらった話
Hibino Hisashi
 

Similar to Pod Security AdmissionによるKubernetesのポリシー制御(Kubernetes Novice Tokyo #21 発表資料) (20)

【DeepSecurityUserNight】我が家の箱入り娘を世間に晒すのは危険なのでDeepSecurityに見守ってもらった話
【DeepSecurityUserNight】我が家の箱入り娘を世間に晒すのは危険なのでDeepSecurityに見守ってもらった話【DeepSecurityUserNight】我が家の箱入り娘を世間に晒すのは危険なのでDeepSecurityに見守ってもらった話
【DeepSecurityUserNight】我が家の箱入り娘を世間に晒すのは危険なのでDeepSecurityに見守ってもらった話
 
インフラチームの歴史とこれから
インフラチームの歴史とこれからインフラチームの歴史とこれから
インフラチームの歴史とこれから
 
[Cloud OnAir] 【Anthos 演習】 解説を聞きながら Anthos を体験しよう 2020年11月5日 放送
[Cloud OnAir] 【Anthos 演習】 解説を聞きながら Anthos を体験しよう 2020年11月5日 放送[Cloud OnAir] 【Anthos 演習】 解説を聞きながら Anthos を体験しよう 2020年11月5日 放送
[Cloud OnAir] 【Anthos 演習】 解説を聞きながら Anthos を体験しよう 2020年11月5日 放送
 
KustomizeとGitHub Actionsを利用したUbieのデプロイの仕組み
KustomizeとGitHub Actionsを利用したUbieのデプロイの仕組みKustomizeとGitHub Actionsを利用したUbieのデプロイの仕組み
KustomizeとGitHub Actionsを利用したUbieのデプロイの仕組み
 
45分で理解するKubernetesの世界
45分で理解するKubernetesの世界45分で理解するKubernetesの世界
45分で理解するKubernetesの世界
 
Google Container Engine (GKE) & Kubernetes のアーキテクチャ解説
Google Container Engine (GKE) & Kubernetes のアーキテクチャ解説Google Container Engine (GKE) & Kubernetes のアーキテクチャ解説
Google Container Engine (GKE) & Kubernetes のアーキテクチャ解説
 
【de:code 2020】 GitHub と Azure Security Center による、アプリケーションのための Azure セキュリティ
【de:code 2020】 GitHub と Azure Security Center による、アプリケーションのための Azure セキュリティ【de:code 2020】 GitHub と Azure Security Center による、アプリケーションのための Azure セキュリティ
【de:code 2020】 GitHub と Azure Security Center による、アプリケーションのための Azure セキュリティ
 
[Cloud OnAir] 【Google Kubernetes Engine 演習】解説を聞きながら GKE を体験しよう 2020年10月29日 放送
[Cloud OnAir] 【Google Kubernetes Engine 演習】解説を聞きながら GKE を体験しよう 2020年10月29日 放送[Cloud OnAir] 【Google Kubernetes Engine 演習】解説を聞きながら GKE を体験しよう 2020年10月29日 放送
[Cloud OnAir] 【Google Kubernetes Engine 演習】解説を聞きながら GKE を体験しよう 2020年10月29日 放送
 
最近のKeycloakのご紹介 ~クライアントポリシーとFAPI~
最近のKeycloakのご紹介 ~クライアントポリシーとFAPI~最近のKeycloakのご紹介 ~クライアントポリシーとFAPI~
最近のKeycloakのご紹介 ~クライアントポリシーとFAPI~
 
PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57
PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57
PodSecurityPolicy からGatekeeper に移行しました / Kubernetes Meetup Tokyo #57
 
オンプレミスからクラウドへ:Oracle Databaseの移行ベストプラクティスを解説 (Oracle Cloudウェビナーシリーズ: 2021年2月18日)
オンプレミスからクラウドへ:Oracle Databaseの移行ベストプラクティスを解説 (Oracle Cloudウェビナーシリーズ: 2021年2月18日)オンプレミスからクラウドへ:Oracle Databaseの移行ベストプラクティスを解説 (Oracle Cloudウェビナーシリーズ: 2021年2月18日)
オンプレミスからクラウドへ:Oracle Databaseの移行ベストプラクティスを解説 (Oracle Cloudウェビナーシリーズ: 2021年2月18日)
 
CyberAgentのインフラについて メディア事業編 #catechchallenge
CyberAgentのインフラについて メディア事業編 #catechchallengeCyberAgentのインフラについて メディア事業編 #catechchallenge
CyberAgentのインフラについて メディア事業編 #catechchallenge
 
今改めて学ぶ Microsoft Azure 基礎知識
今改めて学ぶ Microsoft Azure 基礎知識今改めて学ぶ Microsoft Azure 基礎知識
今改めて学ぶ Microsoft Azure 基礎知識
 
Kube con + cloudnativecon 2017 社内報告会(外部公開用)
Kube con + cloudnativecon 2017 社内報告会(外部公開用)Kube con + cloudnativecon 2017 社内報告会(外部公開用)
Kube con + cloudnativecon 2017 社内報告会(外部公開用)
 
K8sjp11 KubeCon-Recap Multi-Cluster Operations
K8sjp11 KubeCon-Recap Multi-Cluster OperationsK8sjp11 KubeCon-Recap Multi-Cluster Operations
K8sjp11 KubeCon-Recap Multi-Cluster Operations
 
OCHaCafe2#5 変幻自在♪ 広がるKubernetesのエコシステム
OCHaCafe2#5 変幻自在♪ 広がるKubernetesのエコシステムOCHaCafe2#5 変幻自在♪ 広がるKubernetesのエコシステム
OCHaCafe2#5 変幻自在♪ 広がるKubernetesのエコシステム
 
Kubernetes超入門
Kubernetes超入門Kubernetes超入門
Kubernetes超入門
 
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ
 
Hyperledger Cactus V0.4 リリースの概要と今後の開発方針
Hyperledger Cactus V0.4 リリースの概要と今後の開発方針Hyperledger Cactus V0.4 リリースの概要と今後の開発方針
Hyperledger Cactus V0.4 リリースの概要と今後の開発方針
 
ACI Kubernetes Integration
ACI Kubernetes IntegrationACI Kubernetes Integration
ACI Kubernetes Integration
 

More from NTT DATA Technology & Innovation

More from NTT DATA Technology & Innovation (20)

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
 
COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)
COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)
COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方
 
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...
 
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)
 
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
 
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
 
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
 
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
 
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
 
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
 
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
 
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
 
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
 
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
 
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...
 
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
 
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)
 
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
 

Recently uploaded

Recently uploaded (6)

新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

Pod Security AdmissionによるKubernetesのポリシー制御(Kubernetes Novice Tokyo #21 発表資料)

  • 2. Name Keita Mochizuki(mochizuki875) Company NTT DATA Corporation NTT OSS Center Role Platform Engineer whoami a fox, not a raccoon dog. @mochizuki875
  • 4. 宣伝 本日ご説明するPod Security Admissionについて、 先日記事を執筆させていただきました。 こちらも併せてご覧いただけますと幸いです。 @IT Cloud Nativeチートシート Kubernetes 1.25からのスタンダード「Pod Security Admission」で Pod/コンテナのセキュリティを強化しよう https://atmarkit.itmedia.co.jp/ait/articles/2208/30/news003.html
  • 7. 1. コンテナのリスク 2. 安全なコンテナの設定とは 3. Kubernetesにおけるポリシー制御 4. Pod Security Admissionによるポリシー制御 4.1. Namespaceに対するポリシー適用 4.2. ポリシー適用前のDry-run 4.3. デフォルトポリシーの適用 5. まとめ Agenda
  • 8. 1. コンテナのリスク 2. 安全なコンテナの設定とは 3. Kubernetesにおけるポリシー制御 4. Pod Security Admissionによるポリシー制御 4.1. Namespaceに対するポリシー適用 4.2. ポリシー適用前のDry-run 4.3. デフォルトポリシーの適用 5. まとめ Agenda
  • 12. 具体的にコンテナの隔離性が損なわれている場合のリスクを見てみましょう。 例えば以下のようなマニフェストがあります。 このマニフェストにはコンテナの隔離性を低下させる脆弱な設定が2ヶ所含まれています。 1. コンテナのリスク apiVersion: v1 kind: Pod metadata: name: exploit-pod spec: hostPID: true containers: - name: ubuntu image: ubuntu:20.04 command: ["/bin/sh", "-c", "while :; do sleep 10; done"] securityContext: privileged: true exploit-pod.yaml コンテナに過剰な権限(特権)を与えている コンテナホストとPID Namespaceを共有
  • 13. 用意した脆弱なマニフェストを用いてKubernetes上にPodをデプロイしてみます。 Podのデプロイが完了したらコンテナに接続し、内部で以下のようなコマンドを実行してみます。 最終的に接続したコンテナからPodが起動しているホスト(Worker Node)に侵入できてしまっていることがわかります。 1. コンテナのリスク # kubectl apply -f exploit-pod.yaml pod/exploit-pod created # kubectl get po NAME READY STATUS RESTARTS AGE exploit-pod 1/1 Running 0 16s # kubectl exec -it exploit-pod -- /bin/bash root@exploit-pod:/# hostname exploit-pod root@exploit-pod:/# nsenter -t 1 -a /bin/bash root@k8s-cluster-worker01:/# hostname k8s-cluster-worker01 コンテナに接続 コンテナホストでコマンド実行 コンテナホストに侵入
  • 14. このような脆弱な設定のPodがデプロイ可能な状態というのは、例えば以下のようなリスクに繋がると言えます。 1. コンテナのリスク Developer Kubernetes Cluster Worker Node #1 Worker Node #2 Manifest Service A Service B 脆弱な設定を含む Web Master Node Attacker NW Attack!! 例1: 外部の攻撃者に基盤を乗っ取られてしまうリスク 脆弱なコンテナの設定を含んだ状態でWebサーバーPodをデプロイし、外部に公開しているケースを想定します。 万一外部の攻撃者にWebサーバーPodへの侵入を許してしまった場合、攻撃者はコンテナの脆弱性を悪用して WebサーバーPodのみならずWorker Nodeや他のPodなど、攻撃の範囲を基盤全体に拡大できてしまうリスクに繋がります。 乗っ取れコンテナ!!〜開発者から見たコンテナセキュリティの考え方〜 https://speakerdeck.com/mochizuki875/container-dev-security 攻撃範囲を拡大
  • 15. このような脆弱な設定のPodがデプロイ可能な状態というのは、例えば以下のようなリスクに繋がると言えます。 1. コンテナのリスク Kubernetes Cluster Worker Node #1 Worker Node #2 Service A Service B exploit 例2: アプリ開発者が与えられた権限を超えてクラスタを操作できてしまうリスク Kubernetesクラスタをコンテナ基盤としてアプリ開発者に提供しているケースを想定します。 アプリ開発者にはKubernetesにPodをデプロイするといった基本的な操作は許可したいですが、Worker Nodeなどのクラスタ構成要素へは アクセスはさせたくありません。 しかしながら、悪意のあるアプリ開発者が脆弱なコンテナ設定を含むPodをデプロイした場合、 デプロイしたPodを経由して本来権限の与えられていないWorker Nodeに不正にアクセスを行い、攻撃を実現できてしまうリスクに繋がります。 Developer(Attacker) Master Node 権限を超えたアクセス Manifest 脆弱な設定を含む
  • 16. 1. コンテナのリスク 2. 安全なコンテナの設定とは 3. Kubernetesにおけるポリシー制御 4. Pod Security Admissionによるポリシー制御 4.1. Namespaceに対するポリシー適用 4.2. ポリシー適用前のDry-run 4.3. デフォルトポリシーの適用 5. まとめ Agenda
  • 17. Pod Security Standards https://kubernetes.io/docs/concepts/security/pod-security-standards/ 2. 安全なコンテナの設定とは ポリシー 概要 設定項目の例 セキュリティレベル Privileged コンテナの設定項目に規定を設けないポリシー ー 低 Baseline コンテナへの特権付与などリスクが明確である設定項目 について最低限規定したポリシー ・コンテナへの特権付与を禁止 ・コンテナとホスト間でのNamespace共有を禁止 ・HostPathの利用を禁止 etc... 中 Restricted コンテナの実行ユーザーなど詳細な設定項目までを規定 したベストプラクティスに該当するポリシー ・Baselineで規定されるすべての設定項目 ・rootユーザーでのコンテナ起動を禁止 ・コンテナ内での特権昇格を禁止 ・Seccompの明示的な有効化 etc... 高 Kubernetesの公式ドキュメントではPod Security Standardsと呼ばれるガイドラインを提供しています。 このガイドラインでは下記の3種類のポリシーに応じたPodに関するの設定項目が定義されており、 それらに準拠することで所定のセキュリティレベルを確保することができます。
  • 19. 1. コンテナのリスク 2. 安全なコンテナの設定とは 3. Kubernetesにおけるポリシー制御 4. Pod Security Admissionによるポリシー制御 4.1. Namespaceに対するポリシー適用 4.2. ポリシー適用前のDry-run 4.3. デフォルトポリシーの適用 5. まとめ Agenda
  • 20. 3. Kubernetesにおけるポリシー制御 先に示したコンテナの設定に起因するリスクに対応するためには、 Kubernetesに脆弱な設定を含むPodをデプロイさせないと言うことが1つの対策になると言えます。 KubernetesにPodをデプロイする際、特定のポリシー(ex. Pod Security Standards)に準拠させるための仕組みを 一般的にポリシー制御と呼びます。 ポリシー制御には以下に示す通り、一般的にValidationとMutationの2種類の制御方式が存在します。 ※なおここではPodのみに言及していますが、広義のポリシー制御ではPod以外のリソースも制御対象になります Manifest 脆弱な設定を含む Check デプロイを禁止 Pod Pod 設定を書き換えてデプロイ Validation 設定を検査した結果、ポリシーに準拠していない Podのデプロイを禁止する Mutation ポリシーに準拠していないPodの設定を上書きして 強制的にポリシーに準拠させる Manifest 脆弱な設定を含む Check
  • 21. 3. Kubernetesにおけるポリシー制御 代表的なKubernetesにおけるポリシー制御実現方式 OPA Gatekeeper (3rd-party) Rego言語を用いてポリシーを定義 KubernetesのAdmission Webhookを用いてポリシー制御(Validation/Mutation)を実現 Kyverno (3rd-party) YAMLベースでポリシーを定義 KubernetesのAdmission Webhookを用いてポリシー制御(Validation/Mutation)を実現 jsPolicy (3rd party) JavaScriptでポリシーを定義 KubernetesのAdmission Webhookを用いてポリシー制御(Validation/Mutation)を実現 比較的新しいツール(2021/06 v0.1.0 Release) Pod Security Policy (Built-in) YAMLベースでポリシーを定義 KubernetesのAdmission Pluginとしてポリシー制御(Validation/Mutation)を実現 Kubernetes v1.21で非推奨、v1.25で廃止 → 代替としてPod Security Admission (Built-in)が組み込まれた
  • 22. 3. Kubernetesにおけるポリシー制御 deprecate PSP in 1.21, but leave removal at 1.25 #97171 https://github.com/kubernetes/kubernetes/pull/97171 なぜ Pod Security Policy (PSP) は Kubernetes 1.21 から非推奨になったのか? https://qiita.com/kiyoshim55/items/0262d42b57320bea2d00 Migrate from PodSecurityPolicy to the Built-In PodSecurity Admission Controller https://kubernetes.io/docs/tasks/con fi gure-pod-container/migrate-from-psp/ Why is PodSecurityPolicy going away? In the years since PodSecurityPolicy was fi rst introduced, we have realized that PSP has some serious usability problems that canʼt be addressed without making breaking changes. PodSecurityPolicy Deprecation: Past, Present, and Future https://kubernetes.io/blog/2021/04/06/podsecuritypolicy-deprecation-past-present-and-future/ (参考) Pod Security Policy廃止に関する情報
  • 23. 1. コンテナのリスク 2. 安全なコンテナの設定とは 3. Kubernetesにおけるポリシー制御 4. Pod Security Admissionによるポリシー制御 4.1. Namespaceに対するポリシー適用 4.2. ポリシー適用前のDry-run 4.3. デフォルトポリシーの適用 5. まとめ Agenda
  • 24. 4. Pod Security Admissionによるポリシー制御 Pod Security Admission Kubernetes v1.25で新たにGAとなったポリシー制御の仕組み (Built-in) - Pod Security Policyの置き換え(v1.22 alpha、v1.23 beta) Pod Security StandardsをベースとしたValidation機能を主として提供 - 事前にポリシーを定義する必要がない(任意のポリシーを定義することは不可) - Mutation機能は現時点で提供されていない Namespaceに対してポリシーを適用 - 3つのモードそれぞれに対してPod Security Standardsのポリシーを指定 - 適用前の事前確認(Dry-run)が可能 - デフォルトポリシーの定義が可能 モード ポリシーに違反するPodのデプロイを検知した場合の挙動 設定値(Pod Security Standardsのポリシー) enforce Podのデプロイを禁止する。(Validation) privileged (default) baseline restricted audit KubernetesのAudit Logに記録する。(Podはデプロイされる) warn 警告を表示する。(Podはデプロイされる) ※Pod Security Admissionの機能自体はデフォルトで有効になっています。しかしながら各モードに対してポリシーを指定しなかった場合、 そのモードには暗黙的にPrivilegedが設定されることになるため、結果的にポリシー制御は行われない状態になります。
  • 25. 4. Pod Security Admissionによるポリシー制御 ここからは以下のような環境に対してPod Security Admissionの3つの機能を使用する例を見ていきます。 Kubernetes Cluster namespace-a namespace-b namespace-c namespace-d
  • 26. 1. コンテナのリスク 2. 安全なコンテナの設定とは 3. Kubernetesにおけるポリシー制御 4. Pod Security Admissionによるポリシー制御 4.1. Namespaceに対するポリシー適用 4.2. ポリシー適用前のDry-run 4.3. デフォルトポリシーの適用 5. まとめ Agenda
  • 27. 4.1. Pod Security Admission - Namespaceに対するポリシー適用 - Kubernetesクラスター上に存在する特定のNamespace(namespace-a)に対してポリシーを適用し、 その挙動を確認します。 Kubernetes Cluster namespace-a namespace-b namespace-c namespace-d enforce: baseline audit: restricted warn: restricted ポリシー凡例
  • 28. 4.1. Pod Security Admission - Namespaceに対するポリシー適用 - apiVersion: v1 kind: Namespace metadata: name: namespace-a labels: # Baselineポリシーに違反するPodのデプロイを禁止 pod-security.kubernetes.io/enforce: baseline pod-security.kubernetes.io/enforce-version: v1.25 # Restrictedポリシーに違反するPodのデプロイを検知した場合はAudit Logに記録(違反してもPodはデプロイされる) pod-security.kubernetes.io/audit: restricted pod-security.kubernetes.io/audit-version: v1.25 # Restrictedポリシーに違反するPodのデプロイを検知した場合は警告を表示(違反してもPodはデプロイされる) pod-security.kubernetes.io/warn: restricted pod-security.kubernetes.io/warn-version: v1.25 namespace-a.yaml Namespaceに対してポリシーを適用する際は、labelsにて各モードそれぞれどのポリシーを適用するかを設定します。 ※Pod Security StandardsはKubernetesのバージョンによって内容が見直されるケースがあるためそれぞれバージョンをしてしています。 latestを指定するとそのクラスターで使用可能な最新バージョンの内容が適用されることになります。
  • 29. 4.1. Pod Security Admission - Namespaceに対するポリシー適用 - apiVersion: v1 kind: Pod metadata: name: exploit-pod spec: hostPID: true containers: - name: ubuntu image: ubuntu:20.04 command: ["/bin/sh", "-c", "while :; do sleep 10; done"] securityContext: privileged: true exploit-pod.yaml (再掲) ポリシーが適用されているnamespace-aと、ポリシーが適用されていないnamespace-bに対して以下のマニフェストを用いて Pod Security StandardsのBaselineに違反するPodをデプロイしてみます。
  • 30. 4.1. Pod Security Admission - Namespaceに対するポリシー適用 - # kubectl apply -f exploit-pod.yaml -n namespace-a Error from server (Forbidden): error when creating "exploit-pod.yaml": pods "exploit-pod" is forbidden: violates PodSecurity "baseline:v1.25": host namespaces (hostPID=true), privileged (container "ubuntu" must not set securityContext.privileged=true) # kubectl get po -n namespace-a No resources found in namespace-a namespace. # kubectl apply -f exploit-pod.yaml -n namespace-b pod/exploit-pod created # kubectl get po -n namespace-b NAME READY STATUS RESTARTS AGE exploit-pod 1/1 Running 0 7s exploit-pod.yaml を各Namespaceに適用してみると、それぞれ以下のような結果になります。 namespace-bでは通常通りPodのデプロイが成功しているのに対し、ポリシーを適用したnamespace-aではエラーが表示され Podのデプロイに失敗していることが分かります。 namespace-a(ポリシーが適用されている) namespace-b(ポリシーが適用されていない) Baselineポリシーに違反しているためPodのデプロイが拒否された [Pod Security Admission] enforce: baseline audit: restricted warn: restricted
  • 31. 4.1. Pod Security Admission - Namespaceに対するポリシー適用 - { "kind": "Event", …… "responseStatus": { "metadata": {}, "status": "Failure", "message": "pods "exploit-pod" is forbidden: violates PodSecurity "baseline:v1.25": host namespaces (hostPID=true), privileged (container "ubuntu" must not set securityContext.privileged=true)", "reason": "Forbidden", "details": { "name": "exploit-pod", "kind": "pods" }, "code": 403 }, "requestReceivedTimestamp": "2022-08-25T14:37:11.624385Z", "stageTimestamp": "2022-08-25T14:37:11.634141Z", "annotations": { "authorization.k8s.io/decision": "allow", "authorization.k8s.io/reason": "", "pod-security.kubernetes.io/audit-violations": "would violate PodSecurity "restricted:v1.25": host namespaces (hostPID=true), privileged (container "ubuntu" must not set securityContext.privileged=true), allowPrivilegeEscalation != false・・・ "pod-security.kubernetes.io/enforce-policy": "baseline:v1.25" } } Audit Logを確認すると以下のようにPod Security StandardsのBaselineポリシーに違反したことによりPodのデプロイが 拒否されたことが記録されているのが分かります。また、Restrictedポリシーに違反している旨も併せて記録されています。 Audit Log Baselineポリシーに違反しているためPodのデプロイが拒否された Restrictedポリシーに違反していることが記録された [Pod Security Admission] enforce: baseline audit: restricted warn: restricted
  • 32. 4.1. Pod Security Admission - Namespaceに対するポリシー適用 - baseline-pod.yaml apiVersion: v1 kind: Pod metadata: name: exploit-pod spec: hostPID: true containers: - name: ubuntu image: ubuntu:20.04 command: ["/bin/sh", "-c", "while :; do sleep 10; done"] securityContext: privileged: true 先ほどの脆弱な設定を含むマニフェスト(exploit-pod.yaml)に対して、Pod Security StandardsのBaselineポリシーに準拠する 修正を加えたマニフェスト(baseline-pod.yaml)を用意します。 ※ただしRestrictedポリシーには準拠していない
  • 33. 4.1. Pod Security Admission - Namespaceに対するポリシー適用 - baseline-pod.yamlをnamespace-aに適用し、Podをデプロイしてみます。 すると警告メッセージが表示されつつ、Podのデプロイは成功していることが確認できます。 このようにPod Security Admissionではポリシーに準拠していないPodのデプロイを防止したり、 ポリシー違反による警告文言の表示やAudit Logへの記録を行うことができます。 # kubectl apply -f baseline-pod.yaml -n namespace-a Warning: would violate PodSecurity "restricted:v1.25": allowPrivilegeEscalation != false (container "ubuntu" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "ubuntu" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "ubuntu" must set securityContext.runAsNonRoot=true), seccompPro fi le (pod or container "ubuntu" must set securityContext.seccompPro fi le.type to "RuntimeDefault" or "Localhost") pod/baseline-pod created # kubectl get po -n namespace-a NAME READY STATUS RESTARTS AGE baseline-pod 1/1 Running 0 35s Restrictedポリシーに違反していることが警告として表示され、 Podがデプロイされた [Pod Security Admission] enforce: baseline audit: restricted warn: restricted
  • 34. 4.1. Pod Security Admission - Namespaceに対するポリシー適用 - DeploymentとしてBaselineに違反するPodをデプロイしてみます。 apiVersion: apps/v1 kind: Deployment metadata: labels: app: exploit name: exploit spec: replicas: 1 selector: matchLabels: app: exploit template: metadata: labels: app: exploit spec: hostPID: true containers: - image: ubuntu:20.04 name: ubuntu command: ["/bin/sh", "-c", "while :; do sleep 10; done"] securityContext: privileged: true exploit-deployment.yaml
  • 35. 4.1. Pod Security Admission - Namespaceに対するポリシー適用 - # kubectl apply -f exploit-deployment.yaml -n namespace-a Warning: would violate PodSecurity "restricted:v1.25": host namespaces (hostPID=true), privileged (container "ubuntu" must not set securityContext.privileged=true), allowPrivilegeEscalation != false (container "ubuntu" must set・・・ deployment.apps/exploit created # kubectl get all -n namespace-a NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/exploit 0/1 0 0 19s NAME DESIRED CURRENT READY AGE replicaset.apps/exploit-b6765566f 1 0 0 19s # kubectl describe replicasets.apps exploit-b6765566f -n namespace-a ・・・ Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedCreate 49m replicaset-controller Error creating: pods "exploit-b6765566f-84d74" is forbidden: violates PodSecurity "baseline:v1.25": host namespaces (hostPID=true), privileged (container "ubuntu" must not set securityContext.privileged=true) DeploymentとReplicaSetは作成される ReplicaSetで管理されるPodのデプロイが拒否される この場合、Deployment、ReplicaSetは通常通り作成されます。 ただしReplicaSet配下で管理されるPodのデプロイについてはPod Security Admissionによるポリシー制御の対象となるため 先の例と同じくデプロイが禁止されます。
  • 36. 1. コンテナのリスク 2. 安全なコンテナの設定とは 3. Kubernetesにおけるポリシー制御 4. Pod Security Admissionによるポリシー制御 4.1. Namespaceに対するポリシー適用 4.2. ポリシー適用前のDry-run 4.3. デフォルトポリシーの適用 5. まとめ Agenda
  • 37. 4.2. Pod Security Admission - ポリシー適用前のDry-run - 既にPodが起動しているNamespaceにポリシー適用を行う場合、ポリシー適用前にポリシー適用による影響を確認したい というケースがあります。 Dry-run機能を用いることで、 ポリシーを適用することなく特定のNamespaceで既に起動中のPodがにポリシーに準拠しているか を確認することができます。 Kubernetes Cluster namespace-a namespace-b namespace-c namespace-d enforce: baseline audit: restricted warn: restricted ポリシー凡例 exploit-pod Baselineポリシーに準拠しているか?
  • 38. 4.2. Pod Security Admission - ポリシー適用前のDry-run - # kubectl label --dry-run=server --overwrite ns namespace-b pod-security.kubernetes.io/enforce=baseline pod-security.kubernetes.io/enforce-version=v1.25 Warning: existing pods in namespace "namespace-b" violate the new PodSecurity enforce level "baseline:v1.25" Warning: exploit-pod: host namespaces, privileged namespace/namespace-b labeled # kubectl get ns namespace-b --show-labels NAME STATUS AGE LABELS namespace-b Active 116m kubernetes.io/metadata.name=namespace-b exploit-podがBaselineポリシーに違反している 実際にはlabelsは付与されない (ポリシーは有効になっていない) namespace-bで起動しているPodがBaselineポリシーに準拠しているかをDry-run機能により確認してみます。 Dry-runコマンドを実行してみると、以下のように既に起動しているnamespace-bで起動しているPodが Baselineポリシーに違反していることが確認できます。 ※Pod Security AdmissionによるValidationはPod作成時にのみ機能するので、既にポリシーに違反するPodが起動状態で ポリシーを適用しても、該当のPodが即座に停止することはありません。(ValidationはAdmission Controllで実行されるため) しかし意図せぬトラブルを避ける意味でも既にPodが起動しているNamespaceに対してポリシーを適用する場合は、 適用前にDry-run機能を用いてポリシー違反が発生しないかを確認しておくのが良いでしょう。
  • 39. 1. コンテナのリスク 2. 安全なコンテナの設定とは 3. Kubernetesにおけるポリシー制御 4. Pod Security Admissionによるポリシー制御 4.1. Namespaceに対するポリシー適用 4.2. ポリシー適用前のDry-run 4.3. デフォルトポリシーの適用 5. まとめ Agenda
  • 40. 4.3. Pod Security Admission - デフォルトポリシーの適用 - Kubernetes Cluster namespace-a namespace-b namespace-c namespace-d enforce: baseline audit: restricted warn: restricted ポリシー凡例 Kubernetesクラスターとしてデフォルトポリシーを定義し、ポリシーが適用されていないNamespaceには デフォルトポリシーが適用されるようにします。 また、namespace-cについてはPod Security Admissionによるポリシーの適用対象外とします。
  • 41. 4.3. Pod Security Admission - デフォルトポリシーの適用 - Kubernetesクラスターのデフォルトポリシーやポリシー適用除外対象はAdmissionCon fi gurationとして定義することが できます。 ※ここで除外設定した対象についてはNamespaceにlabelsを付与してもポリシーが適用されなくなる apiVersion: apiserver.con fi g.k8s.io/v1 kind: AdmissionCon fi guration plugins: - name: PodSecurity con fi guration: apiVersion: pod-security.admission.con fi g.k8s.io/v1 kind: PodSecurityCon fi guration defaults: # デフォルトポリシーを定義 enforce: "baseline" # Baselineポリシーに違反するPodのデプロイを禁止 enforce-version: "v1.25" audit: "restricted" # Restrictedポリシーに違反するPodのデプロイを検知した場合はAudit Logに記録(違反してもPodはデプロイされる) audit-version: "v1.25" warn: "restricted" # Restrictedポリシーに違反するPodのデプロイを検知した場合は警告を表示(違反してもPodはデプロイされる) warn-version: "v1.25 exemptions: # ポリシー適用除外対象 usernames: [] # ポリシーを適用しないユーザーを指定する runtimeClasses: [] # ポリシーを適用しないRuntimeClassを指定する namespaces: # ポリシーを適用しないNamespaceを指定する - kube-system - namespace-c pod-security.yaml
  • 42. 4.3. Pod Security Admission - デフォルトポリシーの適用 - A Guide to Kubernetes Admission Controllers https://kubernetes.io/blog/2019/03/21/a-guide-to-kubernetes-admission-controllers/ (参考) KubernetesにおけるValidation/Mutation 一般的にKubernetesmではAPI Serverへのリクエスト時にAdmission Controllerと呼ばれる仕組みを用いてValidation/Mutationを 実現します。 Pod Security AdmissionについてもAdmission Controllerに含まれるAdmission Pluginと言う仕組みを用いて実現されています。 kube-apiserverの処理フロー
  • 43. 4.3. Pod Security Admission - デフォルトポリシーの適用 - apiVersion: v1 kind: Pod metadata: ・・・ name: kube-apiserver namespace: kube-system spec: containers: - command: - kube-apiserver ・・・ - --admission-control-con fi g- fi le=/etc/kubernetes/policies/pod-security.yaml ・・・ volumeMounts: - mountPath: /etc/kubernetes/policies name: policies readOnly: true ・・・ volumes: - name: policies hostPath: path: /etc/kubernetes/policies type: DirectoryOrCreate ・・・ /etc/kubernetes/manifests/kube-apiserver.yaml (kubeadmの例) AdmissionCon fi gurationをKubernetesクラスターに適用するには、kube-apiserverの起動オプション --admission-control-con fi g- fi leで、AdmissionCon fi guration定義ファイルを指定します。
  • 44. 4.3. Pod Security Admission - デフォルトポリシーの適用 - # kubectl apply -f exploit-pod.yaml -n namespace-b Error from server (Forbidden): error when creating "exploit-pod.yaml": pods "exploit-pod" is forbidden: violates PodSecurity "baseline:v1.25": host namespaces (hostPID=true), privileged (container "ubuntu" must not set securityContext.privileged=true) # kubectl get po -n namespace-b No resources found in namespace-b namespace. # kubectl apply -f exploit-pod.yaml -n namespace-c pod/exploit-pod created # kubectl get po -n namespace-c NAME READY STATUS RESTARTS AGE exploit-pod 1/1 Running 0 20s exploit-pod.yaml をnamespace-bとnamespace-cに適用してみます。 namespace-bにはデフォルトポリシーが適用されているためPodのデプロイに失敗していることが確認できます。 一方namespace-cではポリシーが適用されず、正常にPodのデプロイに成功していることが確認できます。 namespace-c(ポリシー適用除外対象として指定) namespace-b(デフォルトポリシーが適用される) ポリシーが適用されずPodのデプロイに成功している Baselineポリシーに違反しているためPodのデプロイが拒否された [Pod Security Admission] enforce: baseline audit: restricted warn: restricted
  • 45. 4.3. Pod Security Admission - デフォルトポリシーの適用 - (参考)ポリシー適用除外対象としてUsernameを指定する際の注意事項 ポリシーの適用対象外としてUsernameを指定する場合はPod作成に関連するServiceAccountを指定してしまうと Pod Security Admissionによるポリシー制御が意味をなさなくなってしまうため注意が必要です。 例として、以下ではreplicaset-controllerのServiceAccountをポリシー適用対象外に指定したケースを考えてみます。 Kubernetes Cluster kube-system namespace (enforce: baseline) exploit-pod Create ポリシーにより作成が禁止される Baselineに違反する Podをデプロイ
  • 46. 4.3. Pod Security Admission - デフォルトポリシーの適用 - Kubernetes Cluster replicaset-controller ※ポリシー適用対象外 kube-system namespace (enforce: baseline) replicaset-controller exploit-pod exploit-replicaset Create Create Watch Controller経由で Podが作成されてしまう Baselineに違反する Podを含む ReplicaSetを作成 (参考)ポリシー適用除外対象としてUsernameを指定する際の注意事項 ポリシーの適用対象外としてUsernameを指定する場合はPod作成に関連するServiceAccountを指定してしまうと Pod Security Admissionによるポリシー制御が意味をなさなくなってしまうため注意が必要です。 例として、以下ではreplicaset-controllerのServiceAccountをポリシー適用対象外に指定したケースを考えてみます。 ポリシーに違反するPodを ReplicaSet経由でデプロイ できてしまう
  • 47. 4.3. Pod Security Admission - デフォルトポリシーの適用 - Kubernetes Cluster namespace-a namespace-b namespace-c namespace-d enforce: baseline audit: restricted warn: restricted ポリシー凡例 デフォルトポリシーが適用されている状態で、特定のNamespace(namespace-d)にポリシーを適用し、挙動を確認してみます。 enforce: privileged audit: baseline warn: baseline
  • 48. 4.3. Pod Security Admission - デフォルトポリシーの適用 - namespace-dに適用するポリシーは以下の通りです。 namespace-dに対してはデフォルトポリシーよりも制約の弱いポリシーを適用しています。 apiVersion: v1 kind: Namespace metadata: name: namespace-d labels: # Privilegedポリシー(Podのデプロイを制限しない) pod-security.kubernetes.io/enforce: privileged pod-security.kubernetes.io/enforce-version: v1.25 # Baselineポリシーに違反するPodのデプロイを検知した場合はAudit Logに記録(違反してもPodはデプロイされる) pod-security.kubernetes.io/audit: baseline pod-security.kubernetes.io/audit-version: v1.25 # Baselineポリシーに違反するPodのデプロイを検知した場合は警告を表示(違反してもPodはデプロイされる) pod-security.kubernetes.io/warn: baseline pod-security.kubernetes.io/warn-version: v1.25 namespace-d.yaml
  • 49. 4.3. Pod Security Admission - デフォルトポリシーの適用 - # kubectl apply -f exploit-pod.yaml -n namespace-d Warning: would violate PodSecurity "baseline:v1.25": host namespaces (hostPID=true), privileged (container "ubuntu" must not set securityContext.privileged=true) pod/exploit-pod created kubectl get po -n namespace-d NAME READY STATUS RESTARTS AGE exploit-pod 1/1 Running 0 9s exploit-pod.yamlをnamespace-dに適用し、Podをデプロイしてみます。 すると警告メッセージが表示されつつPodのデプロイは成功していることが確認できます。 このようにデフォルトポリシーが適用されている状態でNamespaceに個別にポリシーを適用した場合は、 Namespaceに適用したポリシーが優先的に適用されることになります。 namespace-dのポリシーが適用された Baselineポリシーに違反していることが警告として表示され、 Podがデプロイされた [Pod Security Admission] enforce: privileged audit: baseline warn: baseline
  • 50. 1. コンテナのリスク 2. 安全なコンテナの設定とは 3. Kubernetesにおけるポリシー制御 4. Pod Security Admissionによるポリシー制御 4.1. Namespaceに対するポリシー適用 4.2. ポリシー適用前のDry-run 4.3. デフォルトポリシーの適用 5. まとめ Agenda
  • 51. 5. まとめ Pod Security AdmissionによりKubernetesのポリシー制御実現が容易になった ・ポリシーの定義不要 ・Namespaceにlabelsを付与するだけでポリシー適用が可能 ・Built-inなので3rd-Partyのライフサイクルを考慮する必要がない ポリシー制御の汎用性に難あり ・Pod Security Standardsに準拠したポリシー制御しか行えない(一部の設定項目のみ変更することも不可) ・Mutationが行えない →汎用性を求める場合は3rd-Partyを利用 Namespaceに対する権限に注意 ・Namespaceのlabelsを操作できればポリシーを変更できてしまう →基盤利用者にNamespaceに対する権限を与えないようRBACで制限
  • 52. PodSecurityPolicyの廃止に備えて、 一足先にPodSecurity Admissionを試してみよう! https://speakerdeck.com/uesyn/from-psp-to-podsecurity コンテナ技術入門 - 仮想化との違いを知り、要素技術を触って学ぼう https://eh-career.com/engineerhub/entry/2019/02/05/103000 参考