HashiCorp發(fā)布了Sentinel,一種集成在HashiCorp Enterprise產(chǎn)品中的嵌入式“策略即代碼”(Policy as Code)框架。Sentinel支持“基于邏輯的細粒度策略決策”,實現(xiàn)了審計的自動化,并在與架構(gòu)即代碼和其它HashiCorp平臺工具一并工作時,,實現(xiàn)在如有必要時執(zhí)行企業(yè)策略、合規(guī)策略或安全策略。
HashiCorp當前提供了架構(gòu)自動化工具產(chǎn)品套裝,使用了廣為采用的開源項目Terraform、Vault、Consul和Nomad,分別支持工程師實現(xiàn)架構(gòu)的策略規(guī)定、安全、連接并運行。根據(jù)“HashiCorp之道”(Tao of HashiCorp)介紹,工具基于“架構(gòu)即代碼(IaC,Infrastructure as Code)”構(gòu)建。IaC支持大規(guī)模地開展基礎(chǔ)設(shè)施管理的編纂和自動化。但是在大型組織中,這種大規(guī)模創(chuàng)建、更改和注銷基礎(chǔ)架構(gòu)的能力是有風險的,因為缺乏經(jīng)驗的工程師或自動化的配置錯誤可引發(fā)影響業(yè)務(wù)運營的重大錯誤。
一些現(xiàn)代基礎(chǔ)設(shè)施平臺和工具提供了不同程度的訪問控制,一些云服務(wù)提供商也提供了身份和訪問管理(IAM,Identity and Access Management) 類型的策略及訪問列表(ACL,Access Control List)控制。據(jù)HashiCorp Sentinel官方網(wǎng)頁介紹,這些ACL系統(tǒng)“解決了一個直接且必要的問題,就是廣泛存在的系統(tǒng)鎖定問題”。對于更高級的軟件策略決策,Sentinel從中脫穎而出,它實現(xiàn)的是一種可重用的系統(tǒng)。
很多現(xiàn)有的策略或ACL系統(tǒng)并非可實用的“策略即代碼”。一些策略是通過點擊GUI設(shè)置的,不易于重做和版本管理。通常它們并不提供任何測試策略的系統(tǒng),而是去測試可能破壞策略的行為。這使得自動化測試難以實現(xiàn)。而策略語言本身也是因產(chǎn)品而異的。
Sentinel將策略的組織和監(jiān)管編碼為文本配置,實現(xiàn)了限制風險,可確保對基礎(chǔ)設(shè)施的變更是安全的。Sentinel在Terraform Enterprise、Vault Enterprise、Consul Enterprise和Nomad Enterprise中引入了“策略即代碼”。當前,Sentinel并不支持上述工具的開源版本。Sentinel是在實時運行的系統(tǒng)中實現(xiàn)“防護欄”、業(yè)務(wù)需求和合法合規(guī)等。這就是說,Sentinel并非一種“亡羊補牢”型的審計工具。
Sentinel支持:
策略即代碼:Sentinel將策略看成是應(yīng)用,可用于版本控制、代碼審核、測試和自動化等。策略的語法和行為易于被Sentinel驗證,并且可以使用Sentinel提供的命令行接口(CLI)實現(xiàn)自動化測試。如果輔以版本控制系統(tǒng),可以支持拉取(Pull)請求工作流,以驗證策略是否保持了合并(Merge)前的預(yù)期系統(tǒng)行為。
基于條件的細粒度策略:Sentinel的策略支持拒絕任何可用輸入上的行為,而非粗粒度的讀取、吸入和管理策略。任何使用公開Sentinel SDK的開發(fā)人員,都可以編寫插件訪問來自于定制系統(tǒng)的外部信息。通過將策略邏輯表示為代碼,可以直接在代碼中表示策略相關(guān)的信息和邏輯,并可以加入評論信息,避免了依賴于口口相傳去了解策略制定原因的傳統(tǒng)方式。
多重執(zhí)法等級(Enforcement Levels):包括建議性(Advisory), 軟強制(soft-mandatory)和硬強制(hard-mandatory)等級,支持策略編寫者對侵犯行為賦予適當?shù)膰乐匦裕o出警告,甚至拒絕。所有的活動可被日志記錄和審計。
兼容多云。確保架構(gòu)更改符合業(yè)務(wù)的范圍,也符合各個基礎(chǔ)設(shè)施提供商的合規(guī)策略。
Sentinel定義并使用自己的策略語言。該語言在設(shè)計上考慮了非編程人員的理解,其中提供了多個用例,使得非開發(fā)人員也可以成為策略制定者。要了解更多的信息,可訪問策略編寫章節(jié)和Sentinel語言參考。
命令sentinel apply實現(xiàn)在本地執(zhí)行一個用于開發(fā)的策略,其用法為sentinel apply [選項] POLICY。命令執(zhí)行由POLICY指定的路徑中的策略文件。輸出顯示了策略是否通過,或是失敗。配置文件可使用-config選項指定,其中定義了可用的導入插件、模擬數(shù)據(jù)和全局值,用于模擬嵌入到應(yīng)用中的策略。可用的命令行選項如下:
-config=path:指定配置文件的目錄。配置文件中定義了可用的導入插件、模擬數(shù)據(jù)和全局值等。模擬數(shù)據(jù)可定義任何用于內(nèi)建Sentinel Simulator測試的復雜場景。
-global key=value:設(shè)置注入運行中策略的全局值。
-explain:設(shè)置為總是顯示執(zhí)行追蹤的情況。追蹤將會顯示執(zhí)行過程中間的布爾表達式值,總是會顯示失敗的策略。
下面是Terraform Sentinel策略文件的一個例子,策略定義為不允許在未提供標簽的情況下設(shè)置資源:
import "tfplan"main = rule { all tfplan.resources as r { r.attr contains "tags" and length(r.attr.tags) > 0 }}對于那些在工作中無需使用HashiCorp工具的工程師,如果他們熱衷于此類“策略即代碼”方法,可以嘗試如下工具:對AWS資源做RSpec測試的