【问题标题】:Istio Authorization polices for memcachedmemcached 的 Istio 授权策略
【发布时间】:2021-04-05 17:12:33
【问题描述】:

我对 Istio 授权策略非常陌生,我需要一些帮助来设置授权策略:

这是场景:

  1. 我有一个名为 namespace1 的命名空间,其中运行了 4 个微服务。对于上下文,我们称它们为 A、B、C、D。并且所有 4 个微服务都启用了 istio-sidecar 注入。

  2. 有一个名为 namespace2 的命名空间,其中运行着 2 个微服务。对于上下文,我们称它们为 E,F。并且两个微服务都启用了 istio-sidecar 注入。

  3. 现在我已经按照Memcached using mcrouter 将 Memcached 服务部署到命名空间 memcached。 Memcached 的所有 pod 也都启用了 istio-sidecar 注入。

现在我有一个场景,我必须只允许从 namespace1 中的 B 和 C 微服务调用 memcached 服务,并拒绝来自 namespace1 中的 A 和 D 的调用以及来自任何其他命名空间的调用。是否可以使用 istio 授权策略来实现这一点?

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
 name: authorization-policy-deny-all
 namespace: memcached
spec:
 selector:
   matchLabels:
     app: activator
 action: DENY
 rules:
 - from:
   - source:
       notNamespaces: ["namespace1"]

这是我能想到的最好的方法,我只允许来自 namepsace1 的调用并拒绝来自所有其他命名空间的调用。我不知道如何拒绝来自命名空间 1 中 A 和 D 微服务的调用。

【问题讨论】:

    标签: istio


    【解决方案1】:

    这是一种可行的设置。

    --- 
    spec: 
      selector:
        matchLabels:
          app: activator
      action: ALLOW
      rules: 
        - from: 
            - source: 
                principals: 
                  - cluster.local/ns/namespace1/sa/memcached--user
    
    • B & C 使用与其他服务不同的服务帐户。假设服务帐户名称为 memcached--user(取决于 B & C 所需的角色,您甚至可能希望为每个服务拥有单独的服务帐户)
    • 定义 AuthorizationPolicy 以允许来自主体的访问,主体是 B & C 使用的服务帐户。
    • 确保已启用 mTLS。如docs 中所述,此字段(主体)需要启用 mTLS。
    • 确保选择器配置正确。

    我希望这可以解决您的问题。

    【讨论】:

    • 我认为每个服务都有自己的服务帐户是“默认”的,所以应该是cluster.local/ns/namespace1/sa/B afaik。毕竟服务有自己的身份,这也是 Istio 的看点之一
    • 如果这些服务的 pod 规范中没有设置 serviceAccountName,则所有服务都将使用“默认”服务帐户。因此,来自 A、B、C、D 证书的主体是“cluster.local/ns/namespace1/sa/default”。 E & F cert 的主体是 ""cluster.local/ns/namespace2/sa/default"
    • 当然,但我不是指“技术”默认值,但在那个 afaik 中,每个服务都应该(通常)有自己的服务帐户。但你是对的,我什至没有在回答中提到这种联系,因为我认为每个服务都有自己的服务帐户是理所当然的。
    • 我明白了。理论上,是的,每个服务/应用程序最好有自己的服务帐户。在实践中,这尤其取决于我们有数千个应用程序,其中大多数应用程序对角色/集群角色有类似的要求以绑定到服务帐户。
    【解决方案2】:

    您还可以使用主体来允许访问。至于来自Istio documentation on Authorization Policy的例子:

    类似的事情应该是可能的:

     - from:
       - source:
           principals: ["cluster.local/ns/namespace1/sa/B","cluster.local/ns/namespace1/sa/C"]
    

    根据文档:

    1. If there are any DENY policies that match the request, deny the request.
    2. If there are no ALLOW policies for the workload, allow the request.
    3. If any of the ALLOW policies match the request, allow the request.
    4. Deny the request.
    

    因此,如果您对 memcached 有 ALLOW 策略,并允许从 B 和 C 访问(规则 3),则应拒绝从其他来源对 memcached 的其他请求(规则 2 不允许访问,因为您有 ALLOW 策略)。

    (未经测试)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      相关资源
      最近更新 更多