授权策略(Authorization Policy)

授权策略可以为网格中的工作负载启用访问控制能力。本文介绍授权策略的配置示例和字段说明。

授权策略介绍

授权策略支持CUSTOM(自定义)、DENY(拒绝)和ALLOW(允许)三种规则,生效的优先级从高到低依次为:CUSTOM、DENY、ALLOW。工作负载访问控制的基本流程如下:

匹配规则

配置示例

示例一:ALLOW规则

允许满足以下所有条件的请求通过:

  • 来源的prinicipalscluster.local/ns/default/sa/sleep或者namespacestest

  • 请求操作为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

WorkloadSelector

定义在当前命名空间中的哪些工作负载上应用授权策略。如果授权策略存在于根命名空间(istio-system),selector将会匹配所有命名空间的匹配工作负载;如果未配置,selector将会匹配到所有工作负载。

rules

Rule[]

一个可以匹配请求的规则列表。

  • 只要有一条规则匹配到当前请求,当前请求就会执行该授权策略。

  • 如果未配置,将不会匹配到任何请求。

  • 如果action配置为ALLOW,且不配置该字段,表示目标工作负载的默认策略为拒绝。

action

Action

如果一个请求匹配到rules中的规则,则执行该action。如果未配置,默认为ALLOW

provider

ExtensionProvider

actionCUSTOM时,指定使用的自定义授权服务。

WorkloadSelector

WorkloadSelector用于决定哪些工作负载应用当前配置。以下参数为必选。

字段

类型

是否必选

说明

matchLabels

map<string, string>

配置一组或者多组标签来选择策略生效的工作负载。标签的搜索范围仅限于当前资源的配置命名空间。

Rule

Rule通过来源操作其他条件三个维度来匹配请求。

一个请求被匹配到的条件如下。一个空的Rule会匹配到任意请求。

  • 至少满足一条请求来源规则。

  • 至少满足一条请求操作规则。

  • 满足所有的其他条件

Rule中的所有string类型都支持精确匹配、前缀匹配、后缀匹配和存在匹配。

匹配方式

配置示例

示例说明

精确匹配

abc

表示只匹配abc的值。

前缀匹配

abc*

表示匹配以abc开头的字符串且包含abc。

后缀匹配

*abc

表示匹配以abc结尾的字符串且包含abc。

存在匹配

*

表示匹配所有非空值。

Rule字段说明如下。

字段

类型

是否必选

说明

from

From[]

表示一个请求的来源。如果未配置,任意来源都会被允许。

to

To[]

指定一个请求的操作。如果未配置,任意操作都会被允许。

when

Condition[]

指定对于一个请求的其他条件列表。如果未配置,任何情况都会被允许。

Rule.From

From字段包含一个source列表。

字段

类型

是否必选

说明

source

Source

指定一个请求的来源。

Rule.From.Source

Source指定一个请求的来源身份。Source中的不同字段之间是AND的关系。

如下示例中,source配置会匹配到principalsadmin或者devnamespacesprod或者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>,例如example.com/sub-1。该字段要求开启请求认证。如果未配置,任何请求身份都会被允许。

配置为*表示请求必须携带JWT。若不配置,表示请求可以不携带JWT。

notRequestPrincipals

string[]

请求身份的反向匹配列表。

namespaces

string[]

一个命名空间列表。该字段要求开启mTLS。如果未配置,任意命名空间都会被允许。

notNamespaces

string[]

命名空间的反向匹配列表。

ipBlocks

string[]

一个IP Block的列表,来自IP包的源地址。支持单个IP(例如1.2.X.X)和CIDR(例如1.2.X.X/24)。如果未配置,任意IP都会被允许。

notIpBlocks

string[]

IP Block的反向匹配列表。

remoteIpBlocks

string[]

一个IP Block的列表,来自X-Forewarded-For请求头或者代理协议。支持单个IP(例如1.2.X.X)和CIDR(例如1.2.X.X/24)。如果未配置,任意IP都会被允许。

notRemoteIpBlocks

string[]

RemoteIp Block的反向匹配列表。

Rule.To

To字段包含一个operations列表。

字段

类型

是否必选

说明

operation

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规则匹配到该请求,该请求需要遵从这些规则。关于生效的优先级,请参见授权策略介绍