【问题标题】:Understanding Istio AuthN and authz for kubernetes Pods了解 Kubernetes Pod 的 Istio AuthN 和 authz
【发布时间】:2020-02-17 11:27:36
【问题描述】:

我对将 Istio 与 EKS 一起使用感到有些困惑。我们有 2 个 Spring Boot 微服务,一个是 REST 服务提供者,另一个是消费者。我们想使用 Istio 实现 Authn 和 authz。

为此: 1. 在提供者服务方面:我有一个 VirtualService,一个 Destination Rule(声明 TLS 模式应该是 ISTIO_MUTUAL 用于传入流量),一个 AuthorizationPolicy,它基本上将客户端服务帐户列入白名单。我还有一个 AuthenticationPolicy 如下:

apiVersion: "authentication.istio.io/v1alpha1"
kind: "Policy"
metadata:
  name: $APP_NAME-$FEATURE_NAME-authenticationpolicy
  namespace: $NAME_SPACE
spec:
  targets:
  - name: "$APP_NAME-$FEATURE_NAME"
  peers:
  - mtls:
      mode: STRICT

我的理解是,此政策不允许任何非 mtls 的传入流量。

现在我怀疑如何配置我的客户端 pod 以发送所有 mtls 传出流量。我知道我必须创建一个 ServiceAccount,它使用 Authz 策略在提供商端列入白名单。我更关心我的客户端 pod在这里,因为我不确定如何在 pod 级别启用 mtls。仅供参考,我不想在命名空间级别启用 mtls。我想使用 yaml 文件在 pod 级别启用。

我对 Destination 规则、Authn 和 Authz 策略的使用理解是否正确? Destination rule、Authn 和 Authz 策略必须在服务提供商级别是否正确?客户端只需启用 MTLS 即可成功进行通信?我一直在阅读 Istio 文档,但这是我有疑问的地方

【问题讨论】:

    标签: kubernetes istio amazon-eks


    【解决方案1】:

    我的理解是,此政策不允许任何非 mtls 的传入流量。

    是的,如果您将 tls 模式设置为严格,则必须提供客户端证书,连接处于 TLS 中。


    我在这里更关心我的客户端 pod,因为我不确定如何在 pod 级别启用 mtls。

    有很好的article 关于如何使它工作,特别是部分

    为两个服务之间的单个连接设置 mTLS

    由于 Bookinfo 是 Istio 的 Hello World,我将使用它来解释如何设置从 productpage 到 details 服务的 mTLS,如上图 sn-p 所示。

    这有两个部分:

    安装一个策略来告诉详细信息它想要接收 TLS 流量(仅):

    apiVersion: authentication.istio.io/v1alpha1
    kind: Policy
    metadata:
      name: details-receive-tls
    spec:
      targets:
      - name: details
      peers:
      - mtls: {}
    
    1. 安装 DestinationRule 以告诉客户端(产品页面)使用 TLS 详细信息:
    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
      name: details-istio-mtls
    spec:
      host: details.bookinfo.svc.cluster.local
      trafficPolicy:
        tls:
          mode: ISTIO_MUTUAL
    

    以下是所涉及服务的图形表示,以及前两个配置文档适用的地方。

    现在,当您仔细查看上面的策略时,您将看到对等身份验证的条目

    peers:
    - mtls: {}
    

    这意味着 TLS 验证是严格的,并且 Istio(或者更确切地说是 Pod 中的 Envoy 代理)需要 TLS 流量和有效证书。我们可以传递一个标志来获得许可模式:

    peers:
    - mtls: 
        mode: PERMISSIVE
    

    Destination 规则、Authn 和 Authz 策略必须在服务提供商级别是否正确?

    据我所知是的。

    客户端只需启用 MTLS 即可成功进行通信?

    我不确定,因为 MTLS 在网格内工作,这取决于您的应用程序要求。


    我想使用 yaml 文件在 pod 级别执行此操作。

    有一个指向istio documentation 的关于身份验证的链接,其中包括

    还有一个来自github的

    或者您可以扩展网关的定义以支持双向 TLS。通过删除其秘密并创建一个新的来更改入口网关的凭据。服务器使用 CA 证书来验证其客户端,我们必须使用名称 cacert 来持有 CA 证书。您可以使用 cert-manager 生成客户端证书。


    我找到了一些可能有用的教程,看看吧。


    如果您还有其他问题,请告诉我。

    【讨论】:

      【解决方案2】:

      感谢JT97。这是我实现的

      1) 对于身份验证,我为必须启用 MTLS 的传入请求实现了 Istio STRICT 身份验证策略。 Citadel 应注意识别客户和服务提供商,无论他们是否是他们声称的基于他们的证书的人。

      2) 对于授权,我在客户端创建了一个服务帐户,并在服务器端添加了一个授权策略,以仅将那些我想使用我的 REST 资源(PUT POST 等)的服务帐户列入白名单

      3) 我配置不同的一件事是目标规则。理想情况下,它应该在客户端,客户端说我声明我的提供者目的地的目的地规则是这样的。我所做的是在提供者端声明目的地规则,以便将其传达给 Istio 网格,它已准备就绪使用 ISTIO_MUTUAL。在我看来,在提供者端声明目标规则没有任何区别。

      4.) 我已经在命名空间级别声明了目标规则。现在必须测试来自命名空间外部但在网格内的客户端。

      【讨论】:

      • 您是否正在写答案以继续您的问题?你知道这里有一些规则吗?比如,我的问题是,你在做什么?
      • 嗨,Suren,我已经进一步回答了 JT97 回答的问题。
      • 好吧,这不是你应该做的。您可以在他的答案下发表评论或编辑您的答案,但不能写另一个答案。这不是私人聊天。
      猜你喜欢
      • 2017-10-01
      • 1970-01-01
      • 2019-11-17
      • 2020-02-18
      • 1970-01-01
      • 2021-11-05
      • 2019-09-10
      • 1970-01-01
      • 2020-12-30
      相关资源
      最近更新 更多