授权策略可以为网格中的工作负载启用访问控制能力。本文介绍授权策略的配置示例和字段说明。
授权策略介绍
授权策略支持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规则匹配到该请求,该请求需要遵从这些规则。关于生效的优先级,请参见授权策略介绍。 |