Kubernetes 叢集的安全管理日益重要,Open Policy Agent (OPA) 提供一個統一管理安全策略和組態驗證的解決方案。本文說明如何利用 Shell 指令碼自動化佈署 OPA,首先會生成必要的 TLS 憑證,確保 OPA 服務與 Kubernetes API 伺服器之間的通訊安全。接著建立 Kubernetes 資源,包含佈署 OPA 服務和設定相關的 RBAC 許可權,並透過容器啟動引陣列態 OPA 服務,設定 TLS 憑證路徑、監聽地址和日誌格式。雖然 OPA 預設僅在 Pod 內部網路可被存取,但可透過 Kubernetes Service 和 Endpoint 資源將其暴露給叢集內其他資源。文章也提供 OPA 安裝後的驗證步驟、解除安裝流程,以及 kube-mgmt sidecar 的組態說明,最後,文章也探討了 OPA 未來的發展方向,例如整合更多安全工具、最佳化策略管理以及提升可觀測性,以強化 Kubernetes 叢集的安全性。

使用Shell指令碼自動化佈署Open Policy Agent(OPA)於Kubernetes叢集

在現代的Kubernetes環境中,安全管理與策略執行的需求日益重要。Open Policy Agent(OPA)提供了一個強大的解決方案來統一管理叢集中的安全策略與組態驗證。本文將探討如何使用Shell指令碼自動化佈署OPA於Kubernetes叢集,並詳細解析相關的技術細節與實作過程。

自動化佈署指令碼解析

首先,我們來分析用於自動化佈署OPA的Shell指令碼。此指令碼負責生成必要的TLS憑證、建立Kubernetes資源,以及組態OPA服務。

1. 生成TLS憑證

# 建立目錄結構
mkdir -p $SECRETS_DIRECTORY

# 生成CA私鑰
openssl genrsa -out $SECRETS_DIRECTORY/opa-ca.key 2048

# 生成CA憑證
openssl req -x509 -new -nodes -key $SECRETS_DIRECTORY/opa-ca.key \
    -subj "/CN=opa-ca" -out $SECRETS_DIRECTORY/opa-ca.crt -sha256

# 生成伺服器私鑰和CSR
openssl genrsa -out $SECRETS_DIRECTORY/opa-server.key 2048
openssl req -new -key $SECRETS_DIRECTORY/opa-server.key \
    -subj "/CN=opa.opa.svc" -out $SECRETS_DIRECTORY/opa-server.csr

# 簽署伺服器憑證
openssl x509 -req -in $SECRETS_DIRECTORY/opa-server.csr \
    -CA $SECRETS_DIRECTORY/opa-ca.crt -CAkey $SECRETS_DIRECTORY/opa-ca.key \
    -CAcreateserial -out $SECRETS_DIRECTORY/opa-server.crt -sha256

內容解密:

此段程式碼使用OpenSSL工具生成TLS憑證。首先,建立CA私鑰和自簽名CA憑證,接著為OPA伺服器生成私鑰和憑證簽署請求(CSR),最後使用CA憑證簽署伺服器CSR以生成伺服器憑證。所有這些步驟對於確保OPA服務與Kubernetes API伺服器之間的通訊安全至關重要。

2. 建立Kubernetes資源

# 建立TLS憑證的Kubernetes Secret
kubectl create secret tls opa-server --cert=$SECRETS_DIRECTORY/opa-server.crt \
    --key=$SECRETS_DIRECTORY/opa-server.key

# 套用OPA佈署組態
cat $TEMPLATES_DIRECTORY/admission-controller-template.yaml | \
    sed -e "s/__OWNER_VALUE__/${OWNER}/g" | sed -e "s/__ENV_VALUE__/${ENV}/g" \
    | sed -e "s/__BILLING_VALUE__/${BILLING}/g" > \
    "$CONFIGS_DIRECTORY/opa-admission-controller.yaml"
kubectl apply -f $CONFIGS_DIRECTORY/opa-admission-controller.yaml

內容解密:

這段程式碼首先將生成的TLS憑證和私鑰儲存在Kubernetes Secret中,以供OPA服務使用。接著,透過替換範本中的變數並套用生成的組態檔案來佈署OPA服務及其相關的RBAC許可權。

OPA服務組態與啟動引數

在佈署過程中,OPA服務的組態是透過容器啟動引數進行設定的。以下是相關的組態片段:

args:
  - "run"
  - "--server"
  - "--tls-cert-file=/certs/tls.crt"
  - "--tls-private-key-file=/certs/tls.key"
  - "--addr=0.0.0.0:8443"
  - "--addr=http://127.0.0.1:8181"
  - "--log-format=json"
  - "--set=status.console=true"
  - "--set=decision_logs.console=true"

內容解密:

此YAML組態定義了OPA容器的啟動引數。其中,--tls-cert-file--tls-private-key-file指定了TLS憑證和私鑰的位置,而--addr引數則設定了OPA服務的監聽地址。特別地,--addr=http://127.0.0.1:8181使得OPA服務在Pod內部可被存取。此外,--log-format=json設定了日誌輸出格式為JSON,以便於日誌收集和分析。

網路組態與安全性考量

在預設情況下,OPA服務僅在Pod內部網路中可被存取。然而,透過Kubernetes Service和Endpoint資源,可以將OPA服務暴露給叢集內的其他資源。

graph LR
    A[Kubernetes API Server] -->|Validation Request|> B[OPA Service]
    B -->|Validation Response|> A
    C[Kube-mgmt Sidecar] -->|Policy Management|> B

圖表翻譯: 此圖展示了Kubernetes API Server、OPA Service以及Kube-mgmt Sidecar之間的互動關係。Kubernetes API Server向OPA Service傳送驗證請求,而OPA Service則根據已載入的策略傳回驗證結果。同時,Kube-mgmt Sidecar負責管理OPA中的策略組態。

  1. 整合更多安全工具:探索將OPA與其他安全工具(如Falco、Trivy等)整合,以實作更全面的安全防護。
  2. 最佳化策略管理:研究如何簡化策略的編寫、測試和佈署流程,以提高安全管理的效率。
  3. 提升可觀測性:增強對OPA日誌和指標的監控和分析能力,以便及時發現和回應安全事件。

透過這些努力,我們可以進一步鞏固Kubernetes叢集的安全基礎,為業務的穩定執行提供堅實的保障。

在Kubernetes中安裝與管理Open Policy Agent (OPA)

安裝流程與驗證

在進行OPA的安裝時,採用了根據多年經驗的自定義安裝流程,同時參考了官方檔案。除了自定義安裝外,OPA也提供了Helm chart進行安裝,並且可以透過修改values.yaml來停用kube-mgmt sidecar:

# Helm values snippet to disable kube-mgmt sidecar
mgmt:
  enabled: false

內容解密:

此段Helm values組態用於停用kube-mgmt sidecar。在某些情況下,使用者可能不需要kube-mgmt的功能,因此可以透過此設定進行停用。

安裝完成後,透過多個檢查步驟驗證OPA的功能:

  1. 檢查OPA policy configmaps是否正確編譯和載入。
  2. 檢查OPA伺服器的日誌,確認REST API健康檢查的狀態。
# OPA policy configmap checks
$ kubectl get cm opa-policy-main -o=jsonpath='{.metadata.annotations.openpolicyagent\.org\/kube-mgmt-status}'
{"status":"ok"}
$ kubectl get cm lib-k8s-helpers -o=jsonpath='{.metadata.annotations.openpolicyagent\.org\/kube-mgmt-status}'
{"status":"ok"}

# Review logs for health-checks
$ kubectl -n opa logs opa...
{"client_addr":"172.17.0.1:36366","level":"info","msg":"Received request.","req_id":82,"req_method":"GET","req_path":"/health","time":"2022-12-20T18:42:11Z"}
{"client_addr":"172.17.0.1:36366","level":"info","msg":"Sent response.","req_id":82,"req_method":"GET","req_path":"/health","resp_bytes":2,"resp_duration":1.964084,"resp_status":200,"time":"2022-12-20T18:42:11Z"}

內容解密:

這些命令用於檢查OPA的運作狀態。首先,透過kubectl get cm命令檢查configmap的狀態註解,確認OPA policy是否正確載入。接著,檢視OPA伺服器的日誌,確認REST API的健康檢查是否正常。

解除安裝OPA

解除安裝OPA的過程同樣透過自定義的shell指令碼進行,主要步驟包括刪除相關資源:

# OPA uninstall script
#!/usr/bin/env bash
# error handling
set -e
trap 'catch $? $LINENO' ERR
catch() {
  if [ "$1" != "0" ]; then
    echo "Error $1 occurred on $2"
  fi
}
KUBECTL="kubectl"
${KUBECTL} delete MutatingWebhookConfiguration -l app=opa --ignore-not-found
${KUBECTL} delete ValidatingWebhookConfiguration -l app=opa --ignore-not-found
${KUBECTL} delete ns opa --ignore-not-found
${KUBECTL} delete ns policy-test --ignore-not-found
${KUBECTL} delete clusterrolebinding opa-kube-mgmt-viewer --ignore-not-found
${KUBECTL} label namespace kube-system openpolicyagent.org/webhook-

也可以使用make命令進行解除安裝:

$ make down
./down.sh 2>&1
No resources found
validatingwebhookconfiguration.admissionregistration.k8s.io "opa-validating-webhook" deleted
namespace "opa" deleted
clusterrolebinding.rbac.authorization.k8s.io "opa-kube-mgmt-viewer" deleted
namespace/kube-system unlabeled

內容解密:

解除安裝指令碼中使用了錯誤處理機制,確保在出現錯誤時能夠正確輸出錯誤訊息。透過kubectl delete命令刪除與OPA相關的資源,包括MutatingWebhookConfiguration、ValidatingWebhookConfiguration、Namespace等。

Kubernetes Management Sidecar (kube-mgmt)

kube-mgmt是一個重要的元件,用於管理OPA的策略和資料。它透過OPA的REST API將Rego-based policies載入到OPA中。kube-mgmt的組態範例如下:

# kube-mgmt config
- name: kube-mgmt
  image: openpolicyagent/kube-mgmt:8.5.5
  securityContext:
    allowPrivilegeEscalation: false
    runAsUser: 1000
    readOnlyRootFilesystem: true
    runAsNonRoot: true
    capabilities:
      drop: ["ALL"]
    seccompProfile:
      type: "RuntimeDefault"
  args:
    - "--replicate-cluster=v1/namespaces"
    - "--replicate=networking.k8s.io/v1/ingresses"
    - "--namespaces=opa"

內容解密:

此組態定義了kube-mgmt容器的詳細設定,包括使用的映像檔、安全性上下文以及啟動引數。透過args引數,可以設定kube-mgmt監聽的資源型別和Namespace。

Kubernetes策略管理

kube-mgmt透過監聽特定Namespace下的configmap,將其中標註為openpolicyagent.org/policy: rego的Rego策略載入到OPA中。這使得Kubernetes管理員可以透過簡單地建立或更新configmap來管理OPA策略。