Open Policy Agent Survey & Simple Try

Feb 11, 2022 yanyan

Photo by Alvaro Reyes on Unsplash

Photo by Dan Nelson on Unsplash

Open Policy Agent (OPA,讀音為 歐趴) 最初是由 Styra 所建立,後來貢獻到 CNCF。目前由 Styra、Google、Microsoft、和 VMWare 構成開源專案的主要貢獻者團隊。

OPA 實現了一個輕量的政策管理服務,因此可以作為服務的 sidecar 運行,也能作為獨立的政策管理服務運行於整體服務群內。軟體服務可以基於給定的資訊透過 RESTful API 的方式「查詢」相關政策的判斷結果。

Open Policy Agent 如何運作?

如圖可以看到向 OPA 查詢 Policy 的流程,OPA 可以確保各種 API Request 的權限。

  1. User 發送 Request 至服務的 API Server。
  2. API Server 執行 Request 前先向 Open Policy Agent (OPA)查詢該 User 的操作權限。
  3. OPA 根據事先定義好的 Policy 和 Data 查詢結果並回傳 Permission。
  4. API Server 再根據收到的 Permission 決定是否執行 User Request,最後回傳結果給 User。

API Server 向 OPA 查詢 Policy 流程
API Server 向 OPA 查詢 Policy 流程

部署 Open Policy Agent

OPA as a Go library

如果服務是用 Go 語言寫的,那最快導入 OPA 的方式是 import OPA 在 Github 上面的 library。

import "github.com/open-policy-agent/opa/rego"

更多資訊請參考:Try OPA as a Go library

OPA as a container sidecar (Deploy on k8s)

apiVersion: apps/v1
kind: Pod
metadata:
  name: opa
  labels:
    app: opa
spec:
  containers:
  - name: opa
    image: openpolicyagent/opa:0.35.0
    ports:
    - name: http
      containerPort: 8181
    args:
    - "run"
    - "--ignore=.*"  # exclude hidden dirs created by Kubernetes
    - "--server"
    - "/policies"
    volumeMounts:
    - readOnly: true
      mountPath: /policies
      name: example-policy
  volumes:
  - name: example-policy
    configMap:
      name: example-policy
kind: Service
apiVersion: v1
metadata:
  name: opa
  labels:
    app: opa
spec:
  type: NodePort
  selector:
    app: opa
  ports:
    - name: http
      protocol: TCP
      port: 8181

更多資訊請參考:Deployment OPA on Kubernetes

OPA on Host-level daemon

  1. Download Open Policy Agent(OPA)

在 Windows 上使用 OPA,Download here

  1. Run OPA for Host daemon
./opa run --server

OPA 預設路由 0.0.0.0:8181,可透過 opa run — help,查看更多設定,例如:change default listening address、enable TLS 等等設定。

範例

定義使用情境

假設今天希望針對 site 的操作實施以下規則

使用者可以操作自己的 site,管理者可以操作所有的 site

API Server 在執行 site 的操作之前,先送一個 Request 到 OPA 去詢問該使用者是否具有權限操作 site。

{
    "input":{
        "subject": {
          "id": "Brown",
          "type": "user"
        },
        "object": {
          "id": "site-1",
          "type": "site",
          "owner": "Brown"
        },
        "action": "delete"
    }
}
{
    "input":{
        "subject": {
          "id": "admin",
          "type": "admin"
        },
        "object": {
          "id": "site-1",
          "type": "site",
          "owner": "Brown"
        },
        "action": "delete"
    }
}

撰寫 Policy

定義好使用情境和要送往 OPA 的 Request 後,就可以針對要執行的 Policy 撰寫 Policy file,而 OPA 的 Policy file 是透過 Rego 撰寫而成的,更多 Rego 相關資訊請參考官網

測試 Policy

撰寫完 Policy file 之後,可以透過以下幾種方式簡單測試設計的 Policy。

  1. Open Policy Agent(OPA) Playground

OPA 官網提供了一個 online playground,可以自行輸入 input、Data、Policy,驗證撰寫的結果是否符合預期。

將上面定義好的 Policy 政策、input data 輸入至 playground 中,就可以在 output 中看到輸出結果,透過這個 OPA playground 可以簡單的測試我們撰寫的 Policy 跟 input request 是否有符合預期。

opa playground 測試頁面

  1. Local Run OPA Server

在 local 端安裝好 OPA 之後,透過 ./opa run -s(or –server) 的 command 來執行 OPA server,這樣就能透過 RESTful API 的方式向 OPA 查詢 Policy。

opa server log

  1. Policy Test file

更多 test file 請參考官網

  1. 同步 Policy 在分散式的 Open Policy Agent 中,可以透過以下方式來達到 Policy 的同步,讓每個 OPA Server 之間的 Policy & Data 保持一致。

更多 Bundle 設定請參考官網。 OPA 總共支援 4 種 file storage:Amazon S3、Google Cloud Storage、Azure Blob Storage 以及自建在 Nginx 的 file storage。

結論

透過 OPA 將 Policy 從 Service 中分離,讓 Policy 擁有一個獨立而且統一的規範,也可以透過 sidecar 的部署方式,降低 Service 訪問 Policy Agent 的網路延遲,並同時確保 Policy Agent 的可靠性,也因為 Policy 與 Service 分離,所以可以動態的更新 Policy 而不用重啟 Service。

以上透過一個例子來簡單的介紹 OPA 的基本功能,OPA 也提供了取代 Kubernetes 原有 [Admission Controllers](Admission Controllers) 的進階用法,對這部分有興趣的讀者,可以參考官網,或是期待下次有機會再為大家介紹。

OPA as Kubernetes Admission Controllers official docs : here

Reference


雙子星雲端為 CNCF 會員,是 CNCF 所認證的 Kubernetes 服務提供商,在雲端技術擁有十多年以上的經驗,為台灣雲端技術早期>領先者。目前為國家級 AI 雲的軟體及 Kubernetes 技術與服務提供商,更是諸多企業與單位導入容器與管理平台的最佳夥伴。

雙子星雲端除了既有的產品 AI Console 與 Gemini API Gateway 之外,也提供企業諮詢與導入雲原生與 Kubernetes 相關技術服>務,協助企業擁抱 Cloud Natvive,達到數位轉型的目標。


相關文章

回雙子星技術部落格列表

Gemini AI Console

熱門文章


kubernetes professional service

關於我們

雙子星雲端是混合多雲技術的領導者,是國際認證之 KCSP - Kubernetes 服務提供商,同時也為 CNCF 雲原生計算基金會會員。

雙子星的雲端專家擁有 Kubernetes、OpenStack 與 Google Cloud Platform 等多項證照,我們的軟體至今已為上百家機構和數千台的 CPU/GPU 伺服器提供雲端服務。