Istio安全性( 四 )


授权Istio的授权功能为网格中的工作负载提供了网格 , 命名空间和工作负载范围的访问控制 。 这种控制级别具有以下优点:

  • 工作负载到工作负载和最终用户工作负载授权 。
  • 一个简单的API:它包括一个简单的AuthorizationPolicy CRD , 它易于使用和维护 。
  • 灵活的语义:运维可以在Istio属性上定义自定义条件 , 并使用DENY和ALLOW动作 。
  • 高性能:Istio授权在Envoy上本地执行 。
  • 高兼容性:本机支持gRPC , HTTP , HTTPS和HTTP2 , 以及任何普通的TCP协议 。
架构每个Envoy代理都运行一个授权引擎 , 该引擎在运行时对请求进行授权 。 当请求到达代理时 , 授权引擎会根据当前的授权策略评估请求上下文 , 并返回授权结果 ALLOW 或 DENY。 运维使用.yaml文件指定Istio授权策略 。
Istio安全性文章插图
隐式启用您无需明确启用Istio的授权功能 。 只需将授权策略应用于工作负载即可实施访问控制 。 对于未应用授权策略的工作负载 , Istio不会强制执行允许所有请求的访问控制 。
授权策略支持ALLOW和DENY动作 。 拒绝策略优先于允许策略 。 如果将任何允许策略应用于工作负载 , 则默认情况下将拒绝对该工作负载的访问 , 除非策略中的规则明确允许 。 当您将多个授权策略应用于同一工作负载时 , Istio会将它们附加应用 。
授权策略要配置授权策略 , 请创建AuthorizationPolicy自定义资源 。 授权策略包括选择器 , 操作和规则列表:
  • 选择器字段指定策略的目标
  • 操作字段指定是允许还是拒绝请求
  • 规则指定何时触发动作
    • 规则中的from字段指定请求的来源
    • 规则中的to字段指定请求的操作
    • when字段指定应用规则所需的条件
以下示例显示了一个授权策略 , 该策略允许两个源( cluster.local/ns/default/sa/sleep 服务帐户和dev名称空间)访问foo命名空间中具有 app:httpbin 和 version:v1 标签的工作负载 , 并且请求必须携带合法JWT token 。
apiVersion: security.istio.io/v1beta1kind: AuthorizationPolicymetadata: name: httpbin namespace: foospec: selector:matchLabels:app: httpbinversion: v1 action: ALLOW rules: - from:- source:principals: ["cluster.local/ns/default/sa/sleep"]- source:namespaces: ["dev"]to:- operation:methods: ["GET"]when:- key: request.auth.claims[iss]values: [""]以下示例显示了一个授权策略 , 如果源不是foo名称空间 , 该策略将拒绝请求:
apiVersion: security.istio.io/v1beta1kind: AuthorizationPolicymetadata: name: httpbin-deny namespace: foospec: selector:matchLabels:app: httpbinversion: v1 action: DENY rules: - from:- source:notNamespaces: ["foo"]拒绝策略优先于允许策略 。 如果匹配允许策略的请求与拒绝策略匹配 , 则可以拒绝这些请求 。Istio首先评估拒绝政策 , 以确保允许政策不会绕过拒绝政策 。
策略目标
您可以通过元数据/命名空间字段和可选的选择器字段来指定策略的范围或目标 。 策略适用于元数据/命名空间字段中的命名空间 。 如果将其值设置为根名称空间 , 则该策略将应用于网格中的所有命名空间 。 根命名空间的值是可配置的 , 默认值是 istio-system。 如果设置为任何其他命名空间 , 则该策略仅适用于指定的命名空间 。
您可以使用选择器字段来进一步限制策略以应用于特定工作负载 。 选择器使用标签选择目标工作负载 。 选择器包含{key:value}对的列表 , 其中key是标签的名称 。 如果未设置 , 则授权策略将与授权策略应用于同一命名空间中的所有工作负载 。
例如 , 允许读取策略允许使用默认命名空间中的 app:products 标签通过“ GET”和“ HEAD”访问工作负载 。
apiVersion: security.istio.io/v1beta1kind: AuthorizationPolicymetadata:name: allow-readnamespace: defaultspec:selector:matchLabels:app: productsaction: ALLOWrules:- to:- operation:methods: ["GET", "HEAD"]值匹配
授权策略中的大多数字段都支持以下所有匹配模式: