授權策略可以為網格中的工作負載啟用訪問控制能力。本文介紹授權策略的配置示例和字段說明。
授權策略介紹
授權策略支持CUSTOM(自定義)、DENY(拒絕)和ALLOW(允許)三種規則,生效的優先級從高到低依次為:CUSTOM、DENY、ALLOW。工作負載訪問控制的基本流程如下:
配置示例
示例一:ALLOW規則
允許滿足以下所有條件的請求通過:
來源的
prinicipals
為cluster.local/ns/default/sa/sleep
或者namespaces
為test
。請求操作為
GET
方法且路徑為/info*
,或者請求操作為POST
方法且路徑為/data
。請求的JWT中的Issuer為
https://accounts.aliyun.com
。apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: httpbin namespace: foo spec: action: ALLOW rules: - from: - source: principals: ["cluster.local/ns/default/sa/sleep"] - source: namespaces: ["test"] to: - operation: methods: ["GET"] paths: ["/info*"] - operation: methods: ["POST"] paths: ["/data"] when: - key: request.auth.claims[iss] values: ["https://accounts.aliyun.com"]
示例二:DENY規則
滿足以下所有條件的請求將被拒絕:
來自
dev
命名空間。請求方法為
POST
。
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: httpbin
namespace: foo
spec:
action: DENY
rules:
- from:
- source:
namespaces: ["dev"]
to:
- operation:
methods: ["POST"]
示例三:CUSTOM規則
請求路徑為/admin*
的請求將執行自定義授權服務。
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: ext-authz
namespace: istio-system
spec:
selector:
matchLabels:
app: istio-ingressgateway
action: CUSTOM
provider:
name: "my-custom-authz"
rules:
- to:
- operation:
paths: ["/admin/*"]
字段說明
AuthorizationPolicy
AuthorizationPolicy可以為網格中的工作負載啟用訪問控制能力。
字段 | 類型 | 是否必選 | 說明 |
selector | 否 | 定義在當前命名空間中的哪些工作負載上應用授權策略。如果授權策略存在于根命名空間(istio-system), | |
rules | 否 | 一個可以匹配請求的規則列表。
| |
action | 否 | 如果一個請求匹配到rules中的規則,則執行該action。如果未配置,默認為ALLOW。 | |
provider | 否 | 當action為CUSTOM時,指定使用的自定義授權服務。 |
WorkloadSelector
WorkloadSelector用于決定哪些工作負載應用當前配置。以下參數為必選。
字段 | 類型 | 是否必選 | 說明 |
matchLabels | map<string, string> | 是 | 配置一組或者多組標簽來選擇策略生效的工作負載。標簽的搜索范圍僅限于當前資源的配置命名空間。 |
Rule
Rule通過來源、操作、其他條件三個維度來匹配請求。
一個請求被匹配到的條件如下。一個空的Rule會匹配到任意請求。
至少滿足一條請求來源規則。
至少滿足一條請求操作規則。
滿足所有的其他條件。
Rule中的所有string類型都支持精確匹配、前綴匹配、后綴匹配和存在匹配。
匹配方式 | 配置示例 | 示例說明 |
精確匹配 | abc | 表示只匹配abc的值。 |
前綴匹配 | abc* | 表示匹配以abc開頭的字符串且包含abc。 |
后綴匹配 | *abc | 表示匹配以abc結尾的字符串且包含abc。 |
存在匹配 | * | 表示匹配所有非空值。 |
Rule字段說明如下。
字段 | 類型 | 是否必選 | 說明 |
from | 否 | 表示一個請求的來源。如果未配置,任意來源都會被允許。 | |
to | 否 | 指定一個請求的操作。如果未配置,任意操作都會被允許。 | |
when | 否 | 指定對于一個請求的其他條件列表。如果未配置,任何情況都會被允許。 |
Rule.From
From字段包含一個source列表。
字段 | 類型 | 是否必選 | 說明 |
source | 否 | 指定一個請求的來源。 |
Rule.From.Source
Source指定一個請求的來源身份。Source中的不同字段之間是AND的關系。
如下示例中,source配置會匹配到principals
是admin
或者dev
,namespaces
是prod
或者test
,且IP不是1.2.X.X
的請求。
principals: ["admin", "dev"]
namespaces: ["prod", "test"]
notIpBlocks: ["1.2.X.X"]
字段 | 類型 | 是否必選 | 說明 |
principals | string[] | 否 | 一個對等身份列表。對等身份的格式為<TRUST_DOMAIN>/ns/<NAMESPACE>/sa/<SERVICE_ACCOUNT>。TRUST_DOMAIN在ASM中默認為cluster.local。該字段要求開啟mTLS。如果未配置,任何身份列表都會被允許。 |
notPrincipals | string[] | 否 | 對等身份的反向匹配列表。 |
requestPrincipals | string[] | 否 | 一個請求身份列表。該值從請求的JWT中生成。請求身份的格式為<ISS>/<SUB>,例如 配置為 |
notRequestPrincipals | string[] | 否 | 請求身份的反向匹配列表。 |
namespaces | string[] | 否 | 一個命名空間列表。該字段要求開啟mTLS。如果未配置,任意命名空間都會被允許。 |
notNamespaces | string[] | 否 | 命名空間的反向匹配列表。 |
ipBlocks | string[] | 否 | 一個IP Block的列表,來自IP包的源地址。支持單個IP(例如 |
notIpBlocks | string[] | 否 | IP Block的反向匹配列表。 |
remoteIpBlocks | string[] | 否 | 一個IP Block的列表,來自X-Forewarded-For請求頭或者代理協議。支持單個IP(例如 |
notRemoteIpBlocks | string[] | 否 | RemoteIp Block的反向匹配列表。 |
Rule.To
To字段包含一個operations列表。
字段 | 類型 | 是否必選 | 說明 |
operation | 否 | 指定一個請求的操作。 |
Operation
Operation指定一個請求的操作。Operation中的不同字段之間是AND的關系。如下示例中,Operation配置會匹配到Host后綴為.example.com
,請求方法為GET
或者HEAD
”,且請求路徑不以/admin
開頭的請求。
hosts: ["*.example.com"]
methods: ["GET", "HEAD"]
notPaths: ["/admin*"]
字段 | 類型 | 是否必選 | 說明 |
hosts | string[] | 否 | 一個基于HTTP請求Hosts列表。匹配不區分大小寫。如果未配置,任意Host都會被允許。該字段僅適用于HTTP協議。 |
notHosts | string[] | 否 | Hosts的反向匹配列表。匹配時不區分大小寫。 |
ports | string[] | 否 | 連接的端口列表。如果未配置,任意端口都會被允許。 |
notPorts | string[] | 否 | 端口的反向匹配列表。 |
methods | string[] | 否 | 一個HTTP請求的方法列表。對于gRPC請求,該字段為POST。如果未配置,任意方法都會被允許。該字段僅適用于HTTP協議。 |
notMethods | string[] | 否 | 方法的反向匹配列表。 |
paths | string[] | 否 | 一個HTTP請求路徑的列表。對于gRPC服務,路徑格式為/package.service/method。 |
notPaths | string[] | 否 | 路徑的反向匹配列表。 |
Condition
Condition指定請求的一些其他屬性。
字段 | 類型 | 是否必選 | 說明 |
key | string | 是 | Istio屬性的名稱。更多信息,請參見支持的屬性列表。 |
values | string[] | 否,但必須至少配置一個。 | 一個允許的屬性值列表。 |
notValues | string[] | 一個允許的屬性值的反向匹配列表。 |
AuthorizationPolicy.ExtensionProvider
字段 | 類型 | 是否必選 | 說明 |
name | string | 否 | 指定自定義授權服務的名稱。您需要在ASM控制臺的自定義授權服務頁面配置。不同的Workload可以指定不同的自定義授權服務。更多信息,請參見自定義授權。 |
AuthorizationPolicy.Action
Action指定要求請求指定的動作。
字段 | 說明 |
ALLOW | 默認值,允許被Rules匹配到的請求通過。 |
DENY | 拒絕被Rules匹配到的請求。 |
CUSTOM | 對匹配到的請求執行自定義授權服務。您需要先在ASM控制臺的自定義授權服務頁面配置。匹配到的請求會由指定的自定義授權服務決定是否放行。更多信息,請參見自定義授權。 自定義授權服務決定通過(ALLOW)一個請求后,不代表該請求一定會通過。如果有其他ALLOW或者DENY規則匹配到該請求,該請求需要遵從這些規則。關于生效的優先級,請參見授權策略介紹。 |