Istio授权策略以排除同一命名空间中的某些应用

Istio授权策略以排除同一命名空间中的某些应用,istio,istio-gateway,Istio,Istio Gateway,我需要在名称空间“default”中设置一个授权策略。这应该检查头DENY access中是否不存在JWT令牌。因此,我设置了一个策略“不允许任何内容”,如下所示。这将拒绝标头中没有有效令牌的所有请求。我想从此规则中排除同一命名空间中的某些应用。允许访问的应用程序需要位于同一命名空间中。我可以创建这样的规则吗。任何关于这方面的建议都会有所帮助。尝试了几件事,但都没有成功 kind: “AuthorizationPolicy” metadata: name: “allow-nothing” nam

我需要在名称空间“default”中设置一个授权策略。这应该检查头DENY access中是否不存在JWT令牌。因此,我设置了一个策略“不允许任何内容”,如下所示。这将拒绝标头中没有有效令牌的所有请求。我想从此规则中排除同一命名空间中的某些应用。允许访问的应用程序需要位于同一命名空间中。我可以创建这样的规则吗。任何关于这方面的建议都会有所帮助。尝试了几件事,但都没有成功

kind: “AuthorizationPolicy”
metadata:
name: “allow-nothing”
namespace: default
spec:
selector:
matchLabels:
istio: ingressgateway
action: DENY
rules:

from:
source:
notRequestPrincipals: ["*"]
编辑

这是我应用的更改:
notHosts
notMethods
notpath
到操作中

kind: "AuthorizationPolicy"
metadata:
  name: "deny-all"
  namespace: istio-system
spec:
  selector:
    matchLabels:
      istio: ingressgateway 
  action: DENY
  rules:
  - from:
    - source:
        notRequestPrincipals: ["*"]
  - to:
    - operation:
        notHosts: ["localhost"]
        notPaths: ["/ns/mypath"]
        notMethods: ["GET"]
当我应用此策略时,仍会触发
DENY
操作。请注意,在请求中,我没有请求主体。这些是入口网关日志

[2021-05-22T06:42:34.106Z] "GET /ns/mypath HTTP/1.1" 403 - rbac_access_denied_matched_policy[ns[istio-system]-policy[deny-all]-rule[0]] - "-" 0 19 0 - "w.x.y.z" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36" "7b4eb6d0-bdc0-943f-ad81-292b65809639" "localhost" "-" - - a.b.c.d:8080 w.x.y.z:34974 - -

您可以尝试使用
规则.to.operation
中的
notosts
notMethods
notpath
来实现这一点

比如说

apiVersion: security.istio.io/v1beta1
kind: “AuthorizationPolicy”
metadata:
  name: “allow-nothing”
  namespace: default
spec:
  selector:
    matchLabels:
      istio: ingressgateway
    action: DENY
rules:
- from:
  - source:
      notRequestPrincipals: ["*"]
- to:
  - operation:
      notHosts: ["*.example.com"]
      not_paths: ["/admin"]

应拒绝对除主机以外的所有主机的通信,后缀为
.example.com
/admin
路径。

部分
rbac\u访问被拒绝\u匹配\u策略[ns[istio system]-策略[deny all]-规则[0]
表示您的通信与
拒绝所有
策略相匹配

现在,为了调查原因,您需要更多关于正在发生的事情的信息。第一步是启用调试日志,至少对于
rbac
istioctl pc日志--level“rbac:debug”$POD\u NAME.$NAMESPACE
。如果您想获得更多日志,可以省略
rbac:debug
部分,但您将获得大量的额外日志(并非所有日志都有用,但其中一些日志很有用,例如
jwt:debug、http:debug、http2:debug
可能有用)

启用此类日志后,我要检查的内容很少:

  • 目标pod源pod获取什么信息?源吊舱真的能够识别自己吗?您可能会看到一行代码,如
    2021-05-14T13:35:24.759773Z调试特使rbac检查连接:requestedServerName:…,sourceIP:a.a.a.a:33142,directRemoteIP:a.a.a:33142,remoteIP:a.a.a.a:33142,localAddress:b.b.b:8443,ssl:none,dynamicMetadata:
    。您必须注意细节:例如,这里的元数据信息是空的,没有使用ssl。因此,实际上不可能确定正在使用哪个源主体,您可能会实际遇到故障。(这可能是原因:如果你想得到真正的答案,允许这样的日志:))。要解决此类问题,需要启用MTL
  • 这有点笼统,可能与您的用例不太相关,但我认为这仍然值得一提(因为这是一个非常基本且经常被忽略的东西):一般来说,检查您正在执行的策略以及istio sidecar如何处理流量。如果您使用的是基于HTTP的策略,请确保流量被视为基于HTTP的策略。通常,HTTP策略应用于被视为普通TCP的流量上,它们将不匹配。检查

谢谢您的回复。这不会仍然检查请求中的请求prinicpals,如果未找到,则拒绝。我尝试了这个策略,但它仍然显示“RBAC访问被拒绝”,只是为了进一步解释。我编辑了我的原始问题,以表明我所做的更改。我在rules.to.operation中添加了notHosts、notMethods和NotPath,如上所述。请检查是否正确。是否可以检查此规则被激活的原因。我是否可以获取更多调试信息。当然,请查看@Mark answer,它向您展示了如何获取更多调试信息。