【问题标题】:Istio AuthorizationPolicy rules questionsIstio AuthorizationPolicy 规则问题
【发布时间】:2020-06-19 06:42:20
【问题描述】:

我一直在测试 istio (1.6) 授权策略,并想确认以下几点:

  1. 我可以使用如下所示的 k8s 服务名称,其中httpbin.bar 是部署/工作负载 httpbin 的服务名称:
   - to:
     - operation:
         hosts: ["httpbin.bar"]
  1. 我有以下规则;仅允许从 foo 命名空间中的服务帐户 sleep 访问 httpbin.bar 服务。
---
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: whitelist-httpbin-bar
  namespace: bar
  action: ALLOW 
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/foo/sa/sleep"]
  - to:
    - operation:
        hosts: ["httpbin.bar"]

我设置了 2 个服务; httpbin.barprivatehttpbin.bar。我的假设是它会阻止对privatehttpbin.bar 的访问,但事实并非如此。附带说明一下,我故意避免添加 selector.matchLabels,因为据我所知,该规则只适用于 httpbin.bar

文档状态:

当至少一个源、操作和条件与请求匹配时,就会发生匹配。

根据here

我解释说 AND 逻辑将适用于 sourceoperation

如果我能找出这可能不起作用的原因或者我的理解是否需要更正,我将不胜感激。

【问题讨论】:

    标签: kubernetes istio


    【解决方案1】:

    使用 AuthorizationPolicy 对象,命名空间栏中有两条规则:

    • 允许来自foo命名空间的任何请求;使用服务帐户 sleep 访问任何服务。
    • 允许对httpbin服务的任何请求;来自任何命名空间,使用任何服务帐号。

    所以这是一个 OR,你正在申请。

    如果你想和 AND 被应用;意思是允许来自命名空间foo 的任何请求与服务帐户sleep 与服务httpbin 对话,在命名空间栏中,您需要应用以下规则:

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: whitelist-httpbin-bar
      namespace: bar
      rules:
      - from:
        - source:
            principals: ["cluster.local/ns/foo/sa/sleep"]
        to:                     # <- remove the dash (-) from here
        - operation:
            hosts: ["httpbin.bar"]
    

    【讨论】:

    • 这是一个不错的发现。
    • hmm 似乎它应该有效,但它没有。除非它这样做,但 hosts: ["httpbin.bar"] 不被尊重,所以它总是失败。我也未能将action: ALLOW 添加到我现在更新的原始问题中。
    • @sachin 我遇到了同样的问题。 Istio 团队帮助了我,它开始为我工作
    • @kaizenCoder 您需要明确向httpbin.bar 发出请求或传递主机标头。如果您从同一个命名空间向httpbin 发出请求,它将失败。
    • 事实证明它尊重Host 标头,但它需要包含端口,例如:hosts: ["httpbin.bar:8000"]
    【解决方案2】:

    关于第一点你可以通过k8s服务名指定主机名,所以host字段可以接受httpbin.bar。

    关于第二点, 根据here

    授权策略范围(目标)由 “元数据/命名空间”和一个可选的“选择器”。

    “元数据/命名空间”告诉策略应用哪个命名空间。如果设置 对于根命名空间,该策略适用于网格中的所有命名空间。

    所以授权策略whitelist-httpbin-bar适用于命名空间foo中的工作负载。但是您要授权的服务httpbinprivatehttpbin位于bar命名空间中。所以您的授权策略不限制访问这些服务。

    如果没有针对工作负载的 ALLOW 策略,则允许请求。

    上述标准使请求成为有效的。

    希望这会有所帮助。

    【讨论】:

    • 感谢您确认第一季度。在第二季度,命名空间实际上是bar。我在这里错误地将其添加为foo(我更新了问题)。如果我按照您所说的去做,它应该可以工作,但是如果我添加selector.matchLabels 以匹配httbin 工作负载,此时它会阻止privatehttpbin,我似乎只能让它工作。
    • @kaizenCoder 对不起,我可能在第一点上错了。主机字段可以在其他资源中采用 k8s 值,但我不知道它是否在授权策略中被接受。
    • 我认为您必须为用例指定工作负载选择器。
    猜你喜欢
    • 2021-02-26
    • 2021-04-18
    • 2018-10-23
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    相关资源
    最近更新 更多