OPA Gatekeeper 筆記整理 - I

研究 Open Policy Agent Gatekeeper(a.k.a OPA Gatekeeper)的起因還是在準備考 CKS(Certified Kubernetes Security Specialist) 這張證照的過程中有看到這個工具。

一般來說,在管理 Kubernetes 時如果有想要做部署規範管理,會想到 Kubernetes 原生的 Pod Security Policies(PSP)

但是有在關注 Kubernetes 的公告的人,就會發現 PSPKubernetes 1.21 版本標示為 deprecated,並且在 Kubernetes 1.25 版本將完全被移除 (fully removed),取而代之的是使用 Pod Security Standards (PSS) 。這意味這如果你是使用原生的方式去撰寫這些管理的 Policies 的話,未來會需要花費一番功伕去升級、改寫這些 Policies,所以就開始研究第三方 (3rd-Party) 的規範管理工具。

♖ 環境

  • AWS EKS, Kubernetes Version: 1.21
  • OPA Gatekeeper, Version: release-3.7

♖ OPA 是什麼? 和 OPA Gatekeeper 有什麼差別

建議可以先參照這幾篇文章:

由上而下,理解 OPA 以及 OPA Gatekeeper 的差別,會有比較詳細的背景知識。

在開發服務的時候,我們會需要注意到服務的 驗證(Authentication)授權(Authorization) 這兩套機制要怎麼實作,區別如下:

  • Authentication(驗證):確認使用者是否存在於系統當中,比方你在登入公司系統,系統會先確認你是否是這家公司的員工。
  • Authorization(授權):根據使用者的角色來授予應有的權限,成功登入公司系統後,系統會根據你的職等,決定你可以看什麼資料、做什麼事情。

而 OPA 的概念就是要 把 授權(Authorization) 的概念從服務中獨立出來,讓不同的服務都能夠呼叫同一個 OPA Server授權(Authorization) 這件事,概念圖如下:

upload successful

比方說 API Server 接收到了一個 Request,在已經確認這個 Request 是由合法的使用者發出的請求後,API Server 會再發出一個請求到 OPA Server,確認這個 Request 要做的事情和不合乎規範,若合乎系統規範,回傳成功,反之則回傳失敗。

OPA Gatekeeper 又是什麼? OPA Gatekeeper 封裝了 OPA 的程式碼,讓 OPA 可以以 Webhook Server 的方式運作在 Kubernetes 裡面,解決了 Kubernetes 各種部署的審核問題。當然 OPA 本身是可以不需要 KubernetesDaemon 的方式運行,比較通用的做法是透過程式碼呼叫 library 去實作 Policy [註:Policy 是用 Rego 語法寫的,來自於一種數據查詢語言 – Datalog],比方說 GolangRego package 可以載來用。

差別如下,這是 Policy:

1
2
3
4
5
6
7
8
9
10
11
package k8s.labels

parameters.labels = {"front-end" : ["front-end", "dashboard"]}

deny[msg] {
namespace := input.request.namespace
required := {label | label := parameters.labels[namespace][_]}
provided := input.request.object.metadata.labels["app"]
not required[provided]
msg := sprintf("Missing required label %v",[required])
}

這是 Kubernetes 用的 ConstraintTemplate :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
name: podrequiredlabels
spec:
crd:
spec:
names:
kind: PodRequiredLabels
validation:
# Schema for the `parameters` field
openAPIV3Schema:
properties:
labels:
type: array
items: string
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package podrequiredlabels

violation[{"msg": msg, "details": {"required_labels": required}}] {
required := {label | label := input.parameters.labels[_]}
provided := input.review.object.metadata.labels["app"]
not required[provided]
msg := sprintf("Missing required labels %v",[required])
}

♖ 挑選 OPA Gatekeeper 的原因

在經過一番研究之後,目前在 CNCF 生態系中,關於 策略(Policies) 以及 治理(governance) 的工具,大宗分為兩支:

  1. Open Policy Agent Gatekeeper(a.k.a OPA Gatekeeper)
  2. Kyverno (發音類似於:凱 verno)

先簡短講一下兩者的差異性好了。沿用上面的 ConstraintTemplate,同樣規範 Pod 需要帶有特定 label 的情況來看,Kyverno 的寫法不需要額外學習新的語法,並且相容於 Kubernetes 原生的 yaml 撰寫方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-labels
annotations:
policies.kyverno.io/title: Require Labels
policies.kyverno.io/category: Best Practices
policies.kyverno.io/severity: medium
policies.kyverno.io/subject: Pod, Label
policies.kyverno.io/description: >-
Define and use labels that identify semantic attributes of your application or Deployment.
A common set of labels allows tools to work collaboratively, describing objects in a common manner that
all tools can understand. The recommended labels describe applications in a way that can be
queried. This policy validates that the label `app.kubernetes.io/name` is specified with some value.
spec:
validationFailureAction: audit
background: true
rules:
- name: check-for-labels
match:
resources:
kinds:
- Pod
validate:
message: "The label `app.kubernetes.io/name` is required."
pattern:
metadata:
labels:
app.kubernetes.io/name: "?*"

這張圖是 Kyverno 官方文件上描述的關係圖,非常清楚易懂:
upload successful

但是最後我還是選擇 OPA Gatekeeper 來研究,網路上的比較文章很多,OPA Gatekeeper 在星星數以及實際的使用人數上也略勝一籌。雖然 Kyverno 簡單易用,Cluster Policy 和沿用它的 Rules 之間的關係也寫得蠻清楚易懂。但正所謂由奢入儉難,學習了 Rego 語法後,未來若有不是部署在 Kubernetes 的服務,也適用於這套部署規範管理工具,而且難保服務變多之後會需要更精細的控制程度。

♖ Reference

Kubernetes Pod Security Policy Deprecation: All You Need to Know
Kyverno 介紹
intro-to-gatekeeper-policies
Open Policy Agent - REST API
RBAC and PSP
Differences between OPA and Gatekeeper for Kubernetes Admission Control
Open Policy Agent – 快速導入 Authz 至 Microservice 架構