授权策略

Istio 授权策略在网格中的工作负载上启用访问控制。

授权策略支持 CUSTOM、DENY 和 ALLOW 操作以进行访问控制。当 CUSTOM、DENY 和 ALLOW 操作同时用于工作负载时,首先评估 CUSTOM 操作,然后评估 DENY 操作,最后评估 ALLOW 操作。评估由以下规则确定

  1. 如果有任何与请求匹配的 CUSTOM 策略,则进行评估,如果评估结果为拒绝,则拒绝请求。
  2. 如果有任何与请求匹配的 DENY 策略,则拒绝请求。
  3. 如果工作负载没有 ALLOW 策略,则允许请求。
  4. 如果有任何与请求匹配的 ALLOW 策略,则允许请求。
  5. 拒绝请求。

Istio 授权策略还支持 AUDIT 操作以决定是否记录请求。AUDIT 策略不会影响请求是否被允许或拒绝访问工作负载。请求将仅根据 CUSTOM、DENY 和 ALLOW 操作来允许或拒绝。

如果工作负载上存在与请求匹配的 AUDIT 策略,则请求将在内部标记为应进行审计。必须配置和启用单独的插件才能实际执行审计决策并完成审计行为。如果未启用此类支持插件,则不会对请求进行审计。

以下是 Istio 授权策略的示例。

它将 action 设置为 ALLOW 以创建允许策略。默认操作为 ALLOW,但明确在策略中指定是有益的。

它允许来自以下来源的请求:

  • 服务帐户 cluster.local/ns/default/sa/sleep
  • 命名空间 test

访问具有以下属性的工作负载:

  • GET 方法,路径前缀为 /info,或
  • POST 方法,路径为 /data

前提是请求具有由 https://127.0.0.1 发行的有效 JWT 令牌。

任何其他请求都将被拒绝。

apiVersion: security.istio.io/v1
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://127.0.0.1"]

以下示例将 action 设置为 DENY 以创建拒绝策略。它拒绝来自 dev 命名空间的请求,这些请求针对 foo 命名空间中所有工作负载的 POST 方法。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: httpbin
  namespace: foo
spec:
  action: DENY
  rules:
  - from:
    - source:
        namespaces: ["dev"]
    to:
    - operation:
        methods: ["POST"]

以下示例将 action 设置为 DENY 以创建拒绝策略。它拒绝 foo 命名空间中所有工作负载的端口 8080 上所有使用 POST 方法的请求。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: httpbin
  namespace: foo
spec:
  action: DENY
  rules:
  - to:
    - operation:
        methods: ["POST"]
        ports: ["8080"]

当此规则应用于 TCP 流量时,method 字段(以及所有基于 HTTP 的属性)无法处理。对于 DENY 规则,缺少的属性被视为匹配。这意味着上述示例中,端口 8080 上的所有 TCP 流量都将被拒绝。如果我们删除 ports 匹配项,则所有 TCP 流量都将被拒绝。因此,建议始终将 DENY 策略限定到特定端口,尤其是在使用 HTTP 属性时 针对 TCP 端口的授权策略

以下授权策略将 action 设置为 AUDIT。它将审计对路径前缀为 /user/profile 的所有 GET 请求。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  namespace: ns1
  name: anyname
spec:
  selector:
    matchLabels:
      app: myapi
  action: AUDIT
  rules:
  - to:
    - operation:
        methods: ["GET"]
        paths: ["/user/profile/*"]

授权策略范围(目标)由“metadata/namespace”和可选的 selector 确定。

  • “metadata/namespace”指示策略应用于哪个命名空间。如果设置为根命名空间,则策略将应用于网格中的所有命名空间。
  • 工作负载 selector 可用于进一步限制策略的应用范围。

例如,以下授权策略应用于 foo 命名空间中的所有工作负载。它不允许任何操作,并有效地拒绝对 foo 命名空间中工作负载的所有请求。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
 name: allow-nothing
 namespace: foo
spec:
  {}

以下授权策略允许对 foo 命名空间中工作负载的所有请求。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
 name: allow-all
 namespace: foo
spec:
 rules:
 - {}

以下授权策略应用于 bar 命名空间中包含标签 app: httpbin 的工作负载。它不允许任何操作,并有效地拒绝对所选工作负载的所有请求。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: allow-nothing
  namespace: bar
spec:
  selector:
    matchLabels:
      app: httpbin

以下授权策略应用于网格中所有命名空间中包含标签 version: v1 的工作负载。(假设根命名空间配置为 istio-system)。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
 name: allow-nothing
 namespace: istio-system
spec:
 selector:
   matchLabels:
     version: v1

以下示例演示了如何使用 实验性注释 istio.io/dry-run 设置授权策略,以便在不实际执行的情况下试运行策略。

试运行注释允许您在将授权策略应用于生产流量之前更好地了解其影响。这有助于降低因不正确的授权策略而导致生产流量中断的风险。有关更多信息,请参阅 试运行任务

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: dry-run-example
  annotations:
    "istio.io/dry-run": "true"
spec:
  selector:
    matchLabels:
      app: httpbin
  action: DENY
  rules:
  - to:
    - operation:
        paths: ["/headers"]

AuthorizationPolicy

AuthorizationPolicy 启用对工作负载的访问控制。

字段类型描述必需
selectorWorkloadSelector

可选。选择器决定将授权策略应用于何处。选择器将与与授权策略位于同一命名空间中的工作负载匹配。如果授权策略位于根命名空间中,则选择器还将与所有命名空间中的工作负载匹配。

如果选择器和 targetRef 未设置,则选择器将匹配所有工作负载。

对于给定的策略,最多只能设置 selectortargetRefs 之一。

targetRefsPolicyTargetReference[]

可选。targetRefs 指定应将策略应用于的一组资源。指定的定向资源将决定策略应用于哪些工作负载。

目前,支持以下资源附件类型

  • 同一命名空间中的 kind: Gateway,带有 group: gateway.networking.k8s.io
  • 同一命名空间中的 kind: Service,带有 group: ""group: "core"。此类型仅支持路径点。

如果未设置,则根据选择器定义应用策略。选择器和 targetRefs 最多只能设置一个。

注意:如果您在使用 targetRefs 字段的多版本环境中使用 Istio 版本早于 1.22,强烈建议您使用 istio.io/rev 标签将策略固定到运行 1.22+ 的版本。这是为了防止在升级过程中,连接到旧的控制平面(不知道 targetRefs 字段)的代理将策略错误地解释为命名空间范围。

注意:路径点代理需要使用此字段才能使策略生效;selector 策略将被忽略。

rulesRule[]

可选。一组用于匹配请求的规则。当至少一条规则匹配请求时,就会发生匹配。

如果未设置,则匹配将永远不会发生。这等同于如果操作为 ALLOW,则对目标工作负载设置拒绝默认值。

actionAction

可选。如果请求与规则匹配,则要采取的操作。如果未指定,则默认值为 ALLOW。

providerExtensionProvider (oneof)

指定 CUSTOM 操作的详细配置。必须仅与 CUSTOM 操作一起使用。

规则

规则匹配来自一组源的请求,这些请求执行一组操作,这些操作受一组条件的约束。当至少一个源、一个操作和所有条件匹配请求时,就会发生匹配。空规则始终匹配。

规则中的任何字符串字段都支持精确匹配、前缀匹配、后缀匹配和存在匹配

  • 精确匹配:abc 将匹配值 abc
  • 前缀匹配:abc* 将匹配值 abcabcd
  • 后缀匹配:*abc 将匹配值 abcxabc
  • 存在匹配:* 将在值不为空时匹配。
字段类型描述必需
fromFrom[]

可选。from 指定请求的来源。

如果未设置,则允许任何来源。

toTo[]

可选。to 指定请求的操作。

如果未设置,则允许任何操作。

whenCondition[]

可选。when 指定请求的一组附加条件。

如果未设置,则允许任何条件。

来源

Source 指定请求的源标识。源中的字段使用 AND 连接。

例如,以下源将在主体为 admindev 且命名空间为 prodtest 且 IP 不为 203.0.113.4 时匹配。

principals: ["admin", "dev"]
namespaces: ["prod", "test"]
notIpBlocks: ["203.0.113.4"]
字段类型描述必需
principalsstring[]

可选。从对等证书派生的对等标识列表。对等标识的格式为 "<TRUST_DOMAIN>/ns/<NAMESPACE>/sa/<SERVICE_ACCOUNT>",例如 "cluster.local/ns/default/sa/productpage"。此字段需要启用 mTLS,与 source.principal 属性相同。

如果未设置,则允许任何主体。

notPrincipalsstring[]

可选。对等标识的否定匹配列表。

requestPrincipalsstring[]

可选。从 JWT 派生的请求标识列表。请求标识的格式为 "<ISS>/<SUB>",例如 "example.com/sub-1"。此字段需要启用请求身份验证,与 request.auth.principal 属性相同。

如果未设置,则允许任何请求主体。

notRequestPrincipalsstring[]

可选。请求标识的否定匹配列表。

namespacesstring[]

可选。从对等证书派生的命名空间列表。此字段需要启用 mTLS,与 source.namespace 属性相同。

如果未设置,则允许任何命名空间。

notNamespacesstring[]

可选。命名空间的否定匹配列表。

ipBlocksstring[]

可选。从 IP 数据包的源地址填充的 IP 块列表。支持单个 IP(例如 203.0.113.4)和 CIDR(例如 203.0.113.0/24)。这与 source.ip 属性相同。

如果未设置,则允许任何 IP。

notIpBlocksstring[]

可选。IP 块的否定匹配列表。

remoteIpBlocksstring[]

可选。从 X-Forwarded-For 标头或代理协议填充的 IP 块列表。要使用此字段,您必须在安装 Istio 时或使用入口网关上的注释配置 meshConfig 下的 gatewayTopologynumTrustedProxies 字段。请参阅此处的文档:配置网关网络拓扑。支持单个 IP(例如 203.0.113.4)和 CIDR(例如 203.0.113.0/24)。这与 remote.ip 属性相同。

如果未设置,则允许任何 IP。

notRemoteIpBlocksstring[]

可选。远程 IP 块的否定匹配列表。

操作

Operation 指定请求的操作。操作中的字段使用 AND 连接。

例如,以下操作将在主机具有后缀 .example.com 且方法为 GETHEAD 且路径不具有前缀 /admin 时匹配。

hosts: ["*.example.com"]
methods: ["GET", "HEAD"]
notPaths: ["/admin*"]
字段类型描述必需
hostsstring[]

可选。HTTP 请求中指定的主机列表。匹配不区分大小写。有关此字段的推荐用法,请参阅 安全最佳实践

如果未设置,则允许任何主机。必须仅与 HTTP 一起使用。

notHostsstring[]

可选。HTTP 请求中指定的主机的否定匹配列表。匹配不区分大小写。

portsstring[]

可选。连接中指定的端口列表。

如果未设置,则允许任何端口。

notPortsstring[]

可选。连接中指定的端口的否定匹配列表。

methodsstring[]

可选。HTTP 请求中指定的方法列表。对于 gRPC 服务,这始终为 POST

如果未设置,则允许任何方法。必须仅与 HTTP 一起使用。

notMethodsstring[]

可选。HTTP 请求中指定的方法的否定匹配列表。

pathsstring[]

可选。在 HTTP 请求中指定的路径列表。有关路径规范化的详细信息,请参见 授权策略规范化。对于 gRPC 服务,这将是 /package.service/method 形式的完全限定名。

如果列表中的路径包含 {*}{**} 路径模板运算符,它将被解释为 Envoy Uri 模板。为了成为有效的路径模板,路径不能包含 *{}(除了支持的运算符之外)。路径段中使用路径模板运算符不允许其他字符。

  • {*} 匹配单个 glob,它不能扩展到路径段之外。
  • {**} 匹配零个或多个 glob。如果路径包含 {**},它必须是最后一个运算符。

示例

  • /foo/{*} 匹配 /foo/bar 但不匹配 /foo/bar/baz
  • /foo/{**}/ 匹配 /foo/bar//foo/bar/baz.txt/foo//,但不匹配 /foo/bar
  • /foo/{*}/bar/{**} 匹配 /foo/buzz/bar//foo/buzz/bar/baz
  • /*/baz/{*} 不是有效的路径模板,因为它包含 *(除了支持的运算符之外)。
  • /**/baz/{*} 不是有效的路径模板,因为它包含 **(除了支持的运算符之外)。
  • /{**}/foo/{*} 不是有效的路径模板,因为 {**} 不是最后一个运算符。
  • /foo/{*}.txt 无效,因为路径段中包含除 {*} 之外的其他字符。

如果未设置,则允许任何路径。只能与 HTTP 一起使用。

notPathsstring[]

可选。路径的负匹配列表。

条件

条件指定其他必需的属性。

字段类型描述必需
key字符串

Istio 属性的名称。请参见 支持属性的完整列表

valuesstring[]

可选。属性的允许值列表。注意:必须至少设置 valuesnotValues 之一。

notValuesstring[]

可选。属性值的负匹配列表。注意:必须至少设置 valuesnotValues 之一。

AuthorizationPolicy.ExtensionProvider

字段类型描述必需
name字符串

指定扩展提供程序的名称。可用提供程序列表在 MeshConfig 中定义。注意,目前每个工作负载最多允许 1 个扩展提供程序。不同的工作负载可以使用不同的扩展提供程序。

Rule.From

From 包含来源列表。

字段类型描述必需
source来源

Source 指定请求的来源。

Rule.To

To 包含操作列表。

字段类型描述必需
operation操作

Operation 指定请求的操作。

AuthorizationPolicy.Action

Action 指定要采取的操作。

Name描述
ALLOW

仅当请求与规则匹配时才允许请求。这是默认类型。

DENY

如果请求与任何规则匹配,则拒绝请求。

AUDIT

如果请求与任何规则匹配,则审核请求。

CUSTOM

CUSTOM 操作允许扩展处理用户请求,如果匹配的规则计算结果为 true。扩展程序独立且在本地 ALLOW 和 DENY 操作之前进行评估。当一起使用时,如果所有操作都返回允许,则请求被允许,换句话说,扩展程序不能绕过 ALLOW 和 DENY 操作做出的授权决定。扩展程序的行为由 MeshConfig 中声明的命名提供程序定义。授权策略通过指定提供程序的名称来引用扩展程序。扩展程序的一个用例示例是与自定义外部授权系统集成,将其授权决定委托给它。

以下授权策略适用于入口网关,如果请求路径具有前缀 /admin/,则将授权检查委托给名为 my-custom-authz 的命名扩展程序。

apiVersion: security.istio.io/v1
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/*"]
这些信息是否有用?
您有什么改进建议吗?

感谢您的反馈!