九 Istio:istio安全之授權( 二 )

version: v2 標簽的工作負載 。action 字段被設置為 DENY 。
最后,我們在 rules 字段中定義所有規則 。我們例子中的規則是說 , 當請求來自 default 命名空間之外時 , 拒絕對 customers v2 工作負載的請求(action) 。
除了規則中的 from 字段外,我們還可以使用 towhen 字段進一步定制規則 。讓我們看一個使用這些字段的例子 。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata:name: customers-denynamespace: default spec:selector:matchLabels:app: customersversion: v2action: DENYrules:- from:- source:notNamespaces: ["default"]- to:- operation:methods: ["GET"]- when:- key: request.headers [User-Agent]values: ["Mozilla/*"]我們在規則部分添加了 towhen 字段 。如果我們翻譯一下上面的規則,我們可以說,當客戶的 GET 請求來自 default 命名空間之外,并且 User Agent 頭的值與正則表達式 Mozilla/* 相匹配時,我們會拒絕 customers v2 的工作負載 。
總的來說,to 定義了策略所允許的行動,from 定義了誰可以采取這些行動,when 定義了每個請求必須具備的屬性,以便被策略所允許,selector 定義了哪些工作負載將執行該策略 。
如果一個工作負載有多個策略,則首先評估拒絕的策略 。評估遵循這些規則:

  1. 如果有與請求相匹配的 DENY 策略,則拒絕該請求
  2. 如果沒有適合該工作負載的 ALLOW 策略,則允許該請求 。
  3. 如果有任何 ALLOW 策略與該請求相匹配,則允許該請求 。
  4. 拒絕該請求
3.2 來源我們在上述例子中使用的源是 notNamespaces 。我們還可以使用以下任何一個字段來指定請求的來源,如表中所示 。
來源示例釋義principalsprincipals: ["my-service-account"]任何是有 my-service-account 的工作負載notPrincipalsnotPrincipals: ["my-service-account"]除了 my-service-account 的任何工作負載requestPrincipalsrequestPrincipals: ["my-issuer/hello"]任何具有有效 JWT 和請求主體 my-issuer/hello 的工作負載notRequestPrincipalsnotRequestPrincipals: ["*"]任何沒有請求主體的工作負載(只有有效的 JWT 令牌) 。namespacesnamespaces: ["default"]任何來自 default 命名空間的工作負載notNamespacesnotNamespaces: ["prod"]任何不在 prod 命名空間的工作負載ipBlocksipBlocks: ["1.2.3.4","9.8.7.6/15"]任何具有 1.2.3.4 的 IP 地址或來自 CIDR 塊的 IP 地址的工作負載notIpBlocknotIpBlocks: ["1.2.3.4/24"]Any IP address that's outside of the CIDR block3.3 操作操作被定義在 to 字段下 , 如果多于一個,則使用 AND 語義 。就像來源一樣,操作是成對的,有正反兩面的匹配 。設置在操作字段的值是字符串:
  • hostsnotHosts
  • portsnotPorts
  • methodsnotMethods
  • pathsnotPath
所有這些操作都適用于請求屬性 。例如,要在一個特定的請求路徑上進行匹配,我們可以使用路徑 。paths:["/api/*","/admin"] 或特定的端口 ports: ["8080"],以此類推 。
3.4 條件為了指定條件,我們必須提供一個 key 字段 。key 字段是一個 Istio 屬性的名稱 。例如,request.headers、source.ip、destination.port 等等 。關于支持的屬性的完整列表 , 請參考 授權政策條件 。
條件的第二部分是 valuesnotValues 的字符串列表 。下面是一個 when 條件的片段:
...- when:- key: source.ipnotValues: ["10.0.1.1"]四.實戰:授權(訪問控制)4.1 訪問控制在這個實驗中 , 我們將學習如何使用授權策略來控制工作負載之間的訪問 。
首先部署 Gateway:
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata:name: gateway spec:selector:istio: ingressgatewayservers:- port:number: 80name: httpprotocol: HTTPhosts:- '*'將上述 YAML 保存為 gateway.yaml,并使用 kubectl apply -f gateway.yaml 部署網關 。
接下來,我們將創建 Web 前端部署、服務賬戶、服務 和 VirtualService 。

推薦閱讀