OPA:open policy agent简介
OPA:open policy agent
官方文檔 https://www.openpolicyagent.org/docs/latest/philosophy/#what-is-opa
視頻介紹 https://www.bilibili.com/video/av96102581/
參考:http://blog.newbmiao.com/2020/03/13/opa-quick-start.html
https://my.oschina.net/cncf/blog/4768958
策略(policy)是一套管理軟件服務(wù)行為的規(guī)則。該策略可以描述速率限制、受信任的服務(wù)器名稱、應(yīng)用程序應(yīng)部署到的集群、允許的網(wǎng)絡(luò)路線或用戶可以提款的賬戶等。
授權(quán)是一種特殊的策略,通常規(guī)定哪些人或機器可以在哪些資源上運行哪些操作。授權(quán)有時會與認證(Authentication)混淆:人或機器如何證明他們是他們所說的人。授權(quán)和更一般的策略經(jīng)常利用認證的結(jié)果(用戶名、用戶屬性、組、聲明),但做出的決定所基于的信息遠遠超過用戶是誰。從授權(quán)歸納到策略,使兩者的區(qū)別更加清晰,因為有些策略決策與用戶無關(guān),例如,策略只是描述了軟件系統(tǒng)中必須保持的不變量(例如,所有的二進制文件必須來自一個可信的來源)。
現(xiàn)在,策略通常是它實際管理的軟件服務(wù)的一個硬編碼功能。Open Policy Agent讓您可以將策略從軟件服務(wù)中解耦出來,這樣,負責(zé)策略的人員就可以從服務(wù)本身中分離出來,對策略進行讀、寫、分析、版本、發(fā)布以及一般的管理。OPA還為您提供了一個統(tǒng)一的工具集,使您可以將策略與任何您喜歡的軟件服務(wù)解耦,并使用任何您喜歡的上下文來編寫上下文感知策略。簡而言之,OPA可以幫助您使用任何上下文從任何軟件系統(tǒng)解耦任何策略。
what is policy?
所有的組織都有策略。策略是組織長期運行的關(guān)鍵,因為它們編碼了關(guān)于如何遵守法律要求、如何在技術(shù)限制下工作、如何避免重復(fù)錯誤等重要知識。
在最簡單的形式中,政策可以根據(jù)寫下來的規(guī)則或不言而喻但滲透到組織文化中的慣例來手動應(yīng)用。策略也可以通過應(yīng)用邏輯或在部署時靜態(tài)配置來執(zhí)行。
What is Policy Decoupling?
軟件服務(wù)應(yīng)該允許聲明式地指定策略,隨時更新而無需重新編譯或重新部署,并自動執(zhí)行(當需要比人工更快地做出決策時,這一點尤其有價值)。
解耦策略可以幫助你大規(guī)模地構(gòu)建這樣的軟件服務(wù),使其能夠適應(yīng)不斷變化的業(yè)務(wù)需求,提高發(fā)現(xiàn)違規(guī)和沖突的能力,提高策略合規(guī)性的一致性,并降低人為錯誤的風(fēng)險。你編寫的策略可以更容易地適應(yīng)外部環(huán)境,適應(yīng)開發(fā)者在設(shè)計軟件服務(wù)時無法想象的因素。
例如,云計算服務(wù)可以回答這樣的問題:"我可以增加計算容量嗎?
-
我可以增加計算能力嗎?
-
我可以在哪些地區(qū)增加計算能力?
-
目前哪些實例運行在錯誤的區(qū)域?
Why use OPA?
OPA是一個全功能的策略引擎,它可以將策略決策從您的軟件中提取出來。你可以把它看作是你的軟件的禮賓員,它可以代表你的用戶回答詳細的問題,以滿足他們的特殊需求。OPA提供了在系統(tǒng)中實現(xiàn)更好的控制和策略可視性的構(gòu)件。
如果沒有OPA,你需要從頭開始實施軟件的策略管理。所需的組件,如策略語言(語法和語義)和評估引擎,需要仔細設(shè)計、實施、測試、記錄,然后維護,以確保正確的行為和為客戶提供積極的用戶體驗。除此之外,你還必須仔細考慮安全、工具、管理等問題。這是一個很大的工作。
The OPA Document Model
OPA策略(用Rego編寫)基于分層結(jié)構(gòu)化的數(shù)據(jù)做出決策。有時,我們將這些數(shù)據(jù)稱為文檔、屬性集、上下文片段,甚至只是 “JSON” [1]. 重要的是,OPA策略可以根據(jù)任意的結(jié)構(gòu)化數(shù)據(jù)進行決策。OPA本身不與任何特定的領(lǐng)域模型掛鉤。同樣,OPA策略可以將決策表示為任意的結(jié)構(gòu)化數(shù)據(jù)(如布爾函數(shù)、字符串、映射、映射列表的映射等)。
數(shù)據(jù)可以使用push或pull接口從外界加載到OPA中,這些接口在策略計算方面同步或異步操作。我們把所有從外部世界加載到OPA的數(shù)據(jù)稱為基礎(chǔ)文檔[2]。這些基礎(chǔ)文檔幾乎總是有助于你的策略決策邏輯。然而,你的策略也可以基于彼此進行決策。策略幾乎總是由多條規(guī)則組成,這些規(guī)則指向其他規(guī)則(可能由不同的組撰寫)。在OPA中,我們把由規(guī)則(也就是決策)生成的值稱為虛擬文檔。在這種情況下,術(shù)語 "虛擬 "只是意味著文檔是由策略計算出來的,也就是說,它不是從外部世界加載到OPA中的。
基礎(chǔ)文檔和虛擬文檔可以表示完全相同的信息,例如,數(shù)字、字符串、列表、映射等。此外,通過Rego,您可以使用完全相同的點/括號式引用語法來引用基礎(chǔ)文檔和虛擬文檔。可以表示的值的類型和這些值的引用方式的一致性意味著策略作者只需要學(xué)習(xí)一種建模和引用信息的方式,以驅(qū)動策略決策。此外,由于在基礎(chǔ)文檔和虛擬文檔中,值的類型或引用這些值的方式?jīng)]有概念上的差異,Rego 讓您可以通過稱為數(shù)據(jù)的全局變量同時引用基礎(chǔ)文檔和虛擬文檔。同樣,OPA讓你通過/v1/data HTTP API[3]來查詢基礎(chǔ)文檔和虛擬文檔。這就是為什么只查詢data(或data.foo或data.foo.bar等)會返回該路徑下的基礎(chǔ)文檔和虛擬文檔的組合。
由于基礎(chǔ)文檔來自O(shè)PA外部,它們在data下的位置由進行加載的軟件控制。另一方面,虛擬文檔在data下的位置是由策略本身使用語言中的package指令控制的。
當狀態(tài)信息發(fā)生變化時,可以通過將數(shù)據(jù)復(fù)制到OPA中,將基礎(chǔ)文檔異步推送或拉入OPA。這可以周期性地發(fā)生,或者當一些事件(如數(shù)據(jù)庫變化通知)發(fā)生時。異步加載的基礎(chǔ)文檔總是在data全局變量下被訪問。另一方面,當你的軟件查詢OPA進行策略決策時,基礎(chǔ)文檔也可以同步推送或拉入OPA。我們說把同步推送的基礎(chǔ)文檔稱為 “輸入”。策略可以在input全局變量下訪問這些輸入。為了在策略計算過程中拉取基礎(chǔ)文檔,OPA公開了(并可以通過自定義擴展)內(nèi)置函數(shù),如http.send。內(nèi)置函數(shù)的返回值可以分配給本地變量,并在虛擬文檔中浮現(xiàn)。同步加載的數(shù)據(jù)被保存在data之外,以避免命名沖突。
| Asynchronous Push | The data global variable | Invoke OPA’s API(s), e.g., PUT /v1/data |
| Asynchronous Pull | The data global variable | Configure OPA’s Bundle feature |
| Synchronous Push | The input global variable | Provide data in policy query, e.g., inside the body of POST /v1/data |
| Synchronous Pull | The built-in functions, e.g., http.send | N/A |
以異步方式加載到OPA的數(shù)據(jù)被緩存在內(nèi)存中,以便在策略計算期間能夠有效地讀取。同樣,策略也被緩存在內(nèi)存中,以確保高性能和高可用性。同步拉取的數(shù)據(jù)也可以緩存在內(nèi)存中。關(guān)于將外部數(shù)據(jù)加載到OPA中的更多信息,包括權(quán)衡,請參閱外部數(shù)據(jù)頁面。
下圖說明了上面描述的基礎(chǔ)和虛擬文檔模型,該模型是一個假設(shè)的策略,它根據(jù)以下內(nèi)容做出授權(quán)決定(命名為 data.acme.allow)。
-
位于輸入下同步推送的API請求信息。
-
權(quán)限數(shù)據(jù)異步拉取,位于data.entitlements下。
-
在策略評估過程中使用http.send內(nèi)置函數(shù)同步拉取資源數(shù)據(jù)。
權(quán)限和資源信息被規(guī)則抽象,生成的虛擬文檔分別命名為data.iam.user_has_role和data.acme.user_is_assigned。
[1] OPA對加載JSON和YAML有很好的支持,因為它們在現(xiàn)代系統(tǒng)中很普遍,但OPA不與任何特定的數(shù)據(jù)格式掛鉤。OPA使用它自己的內(nèi)部表示法來表示結(jié)構(gòu),比如映射和列表(也就是JSON中的對象和數(shù)組)。
2] "文檔 "一詞來自于面向文檔的數(shù)據(jù)庫世界。文檔只是一個通用術(shù)語,指的是以某種標準格式編碼的數(shù)據(jù)或信息,如JSON、YAML、XML等。面向文檔的數(shù)據(jù)不必像關(guān)系世界中的數(shù)據(jù)那樣遵守嚴格的模式。文檔往往是深度嵌套的、分層的數(shù)據(jù)結(jié)構(gòu),包含多層嵌入的地圖和列表。
3]在內(nèi)部,像GET /v1/data或GET /v1/data/foo/bar這樣的HTTP請求會變成與HTTP路徑幾乎相同的Rego查詢(如data或data.foo.bar)。
Conclusion
OPA是一種輕量策略引擎。將策略的決策過程從策略的執(zhí)行中解耦。可以用于 Kubernetes、Terraform、Envoy等場景。OPA的模型可以抽象為
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XgtVzBCC-1607522961796)(http://media.newbmiao.com/opa/policy.png)]
簡單來說,OPA就是將Policy的實現(xiàn)同具體的服務(wù)解耦,提供一個接口去做邏輯判斷,例如authorization場景。OPA的作用類似于一個大大的if-than-else語句,對用戶的請求做一個判斷,返回“allow”或“deny”。
,提供一個接口去做邏輯判斷,例如authorization場景。OPA的作用類似于一個大大的if-than-else語句,對用戶的請求做一個判斷,返回“allow”或“deny”。
OPA使用REGO語言編輯策略,關(guān)于REGO語言可見……。
總結(jié)
以上是生活随笔為你收集整理的OPA:open policy agent简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一章 网络入门【仅参考】
- 下一篇: 关于 PCB 多层板制程能力不得不说的那