1. OPA 項(xiàng)目實(shí)踐解讀

        共 4175字,需瀏覽 9分鐘

         ·

        2021-09-23 22:32


        · Policy As Code ·



        Current Situation


        目前國(guó)外越來(lái)越多的公司開(kāi)始使用Policy As Code來(lái)替換現(xiàn)有的策略邏輯,但國(guó)內(nèi)的相關(guān)研究還處于起步階段。雅客云安全SimonSun對(duì)OPA做了深入研究,并總結(jié)出一些看法與大家分享,歡迎探討。


        現(xiàn)代云原生項(xiàng)目中通常涉及到大量的策略邏輯,比如流量的準(zhǔn)入控制以及合規(guī)性檢查等。 然而, 如果使用傳統(tǒng)的硬代碼去寫(xiě)上述邏輯會(huì)帶來(lái)頻繁的程序變更,代碼也會(huì)越來(lái)越難以維護(hù),更重要的是隨著時(shí)間的推移系統(tǒng)的Bug數(shù)量會(huì)越來(lái)越多,由此給開(kāi)發(fā)者帶來(lái)開(kāi)發(fā)負(fù)擔(dān)。由CNCF托管的開(kāi)源策略引擎OPA項(xiàng)目——就是以解決此問(wèn)題為目的,應(yīng)運(yùn)而生的新一代策略引擎。





        OPA的優(yōu)勢(shì)

        OPA 是由 Styra 公司于 2016 年開(kāi)發(fā),在2019年4月2號(hào)OPA正式進(jìn)入了CNCF,作為孵化級(jí)托管項(xiàng)目。



        上圖是OPA官方提供的結(jié)構(gòu)圖,OPA使用Json作為數(shù)據(jù)存儲(chǔ),使用Rego作為 OPA 策略所用到的聲明語(yǔ)言。OPA要實(shí)現(xiàn)的目標(biāo)是 Policy As Code。OPA可以作為Golang Library 庫(kù)引入,也可以以Restful Api,還可以是Sidecar、主機(jī)級(jí)守護(hù)進(jìn)程同時(shí)也能編譯為WASM(WebAssembly)。


        OPA目前在云原生領(lǐng)域逐漸替代了傳統(tǒng)的策略引擎(如RBAC),目前社區(qū)比較活躍,并且在微服務(wù)、Kubernetes、CI/CD 、API gateways 等各個(gè)領(lǐng)域都有實(shí)踐。雅客云在赤巖石項(xiàng)目中逐步使用OPA替換原有的策略邏輯,目前運(yùn)行穩(wěn)定。


        OPA的性能

        OPA目前最新版本是0.32。如下圖所示,OPA在0.4.9的版本解決了性能問(wèn)題,我們可以看下圖,OPA從O(n)的復(fù)雜度優(yōu)化到了常量級(jí)別的復(fù)雜度。



        OPA具體的優(yōu)化方式是將Rego的策略列表轉(zhuǎn)換成了一個(gè)樹(shù),從而可以在毫秒內(nèi)響應(yīng)請(qǐng)求。



        總體來(lái)說(shuō)OPA的性能表現(xiàn)良好,目前能夠滿足項(xiàng)目?jī)?nèi)的多種應(yīng)用場(chǎng)景。


        Debug工具齊全

        OPA像Golang一樣,提供了很多實(shí)用的工具、命令,使開(kāi)發(fā)Rego更簡(jiǎn)單一些。不論提供的fmt命令還是eval命令都像Golang一樣既簡(jiǎn)潔又實(shí)用。

        $opa --helpAn open source project to policy-enable your service.
        Usage: opa [command]
        Available Commands: bench Benchmark a Rego query build Build an OPA bundle check Check Rego source files completion generate the autocompletion script for the specified shell deps Analyze Rego query dependencies eval Evaluate a Rego query fmt Format Rego source files help Help about any command parse Parse Rego source file run Start OPA in interactive or server mode sign Generate an OPA bundle signature test Execute Rego test cases version Print the version of OPA
        Flags: -h, --help help for opa
        Use "opa [command] --help" for more information about a command.


        聲明式指定策略

        與K8s的聲明式API一樣,Rego也是聲明式的。如下是一個(gè)簡(jiǎn)單的Rego,其聲明了一個(gè)HTTP鑒權(quán)的邏輯。

        package acmecorp.api import data.acmecorp.roles
        default allow = false allow { input.method = “GET” input.path = [“accounts”, user] input.user = user} allow { input.method = “GET” input.path = [“accounts”, “report”] roles[input.user][_] = “admin”}
        allow { input.method = “POST” input.path = [“accounts”] roles[input.user][_] = “admin”}


        包含單元測(cè)試、性能測(cè)試、覆蓋率測(cè)試、Mock

        測(cè)試在如今的分布式、微服務(wù)系統(tǒng)架構(gòu)下的重要性不言而喻,雅客云團(tuán)隊(duì)內(nèi)部使用了自動(dòng)化測(cè)試并且引入了混沌工程,OPA能夠提多種類型的測(cè)試并且供Json格式的輸出,可以很方便的接入自動(dòng)化測(cè)試平臺(tái)。

        單元測(cè)試示例

        $ opa test . -vdata.authz.test_post_allowed: PASS (1.417μs)data.authz.test_get_anonymous_denied: PASS (426ns)data.authz.test_get_user_allowed: PASS (367ns)data.authz.test_get_another_user_denied: PASS (320ns)--------------------------------------------------------------------------------PASS: 4/4


        性能測(cè)試示例

        opa test -v --bench example.rego example_test.rego
        data.authz.test_post_allowed 98425 11773 ns/op 9298 timer_rego_query_eval_ns/op 8437 B/op 160 allocs/opdata.authz.test_get_anonymous_denied 131479 9106 ns/op 6841 timer_rego_query_eval_ns/op 6596 B/op 133 allocs/opdata.authz.test_get_user_allowed 96920 12395 ns/op 9920 timer_rego_query_eval_ns/op 8966 B/op 166 allocs/opdata.authz.test_get_another_user_denied 103340 11834 ns/op 9301 timer_rego_query_eval_ns/op 8341 B/op 157 allocs/op--------------------------------------------------------------------------------PASS: 4/4


        覆蓋率測(cè)試示例

        opa test --coverage --format=json example.rego example_test.rego
        { "files": { "example.rego": { "covered": [ { "start": { "row": 3 }, "end": { "row": 5 } }, ... ], "coverage": 100 }, "example_test.rego": { "covered": [ .... ], "coverage": 100 } }, "coverage": 100}


        IDA插件支持

        OPA有IDA插件支持,可以更快速的開(kāi)發(fā)、驗(yàn)證。目前在Vscode、Goland(Jetbrains全家桶)中都有OPA插件。

        其他

        我們發(fā)現(xiàn)當(dāng)OPA遇到K8s的CRD之后可以給項(xiàng)目帶來(lái)更多可擴(kuò)展的可能性,客戶可以通過(guò)創(chuàng)建K8s的CR來(lái)創(chuàng)建Rego從而能夠達(dá)到多種策略組合、自定義策略等多種模式。


        OPA不足

        目前國(guó)內(nèi)OPA使用的還不廣泛,相關(guān)資料較少,缺少最佳實(shí)踐,需要自己踩坑。然后Reog語(yǔ)言有上手門(mén)檻,需要學(xué)習(xí)才能夠上手使用。


        總結(jié)

        策略抽離后帶來(lái)的好處是充分解耦。在代碼更容易維護(hù)、擴(kuò)展的同時(shí)可以盡可能的減少由策略配置錯(cuò)誤導(dǎo)致的Bug。以達(dá)到給客戶提供更優(yōu)質(zhì)服務(wù)的目的。


        使用OPA后我們可以對(duì)策略本身進(jìn)行版本化、重復(fù)的測(cè)試、策略復(fù)用等。并且可以預(yù)見(jiàn)的是就像數(shù)據(jù)庫(kù)、隊(duì)列、CICD、編排等模塊一樣,策略從代碼中抽離出來(lái)是未來(lái)的趨勢(shì)。


        瀏覽 54
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 交换做爰电影在线观看 | 成人激情视频网 | 皇上和太监h高肉h | 狠狠狠狠狠狠狠 | 色小姐综合|