WEBKT

使用 Istio 在 Kubernetes 中实现微服务安全:mTLS 认证与授权策略实战

16 0 0 0

使用 Istio 在 Kubernetes 中实现微服务安全:mTLS 认证与授权策略实战

为什么需要 mTLS?

Istio 如何实现 mTLS?

实践:使用 Istio 开启 mTLS

总结

深入学习

使用 Istio 在 Kubernetes 中实现微服务安全:mTLS 认证与授权策略实战

在云原生架构中,微服务已经成为构建复杂应用的主流方式。然而,随着微服务数量的增加,服务间的安全问题也日益突出。如何在 Kubernetes 集群中保障微服务的安全,成为了一个重要的挑战。Service Mesh 技术,如 Istio,为我们提供了一种有效的解决方案。

本文将深入探讨如何利用 Istio 实现微服务的安全通信,重点介绍 Mutual TLS (mTLS) 认证和授权策略的配置和使用。我们将通过具体的示例,帮助你理解 Istio 的安全机制,并将其应用到实际的生产环境中。

为什么需要 mTLS?

传统的 TLS 认证只验证服务器的身份,客户端并不会被验证。在微服务架构中,服务间的通信往往发生在受信任的网络内部,但仍然存在被攻击的风险。mTLS 认证则要求客户端和服务端都提供证书进行验证,从而确保通信双方的身份都是可信的,极大地提高了安全性。

Istio 如何实现 mTLS?

Istio 通过 Sidecar 代理模式来实现 mTLS。每个微服务实例都会被注入一个 Envoy 代理,所有进出服务的流量都会经过 Envoy 代理。Envoy 代理负责处理 TLS 握手、证书验证等安全相关的操作,而微服务本身则无需关心这些细节。

Istio 提供了两种 mTLS 模式:

  • Permissive 模式: 允许服务同时接受 mTLS 和 plaintext 连接。这种模式适用于 mTLS 迁移阶段,可以平滑地将服务从 plaintext 升级到 mTLS。
  • Strict 模式: 只允许 mTLS 连接。这种模式安全性更高,但需要确保所有服务都支持 mTLS。

实践:使用 Istio 开启 mTLS

下面,我们通过一个简单的示例来演示如何在 Istio 中开启 mTLS。假设我们有两个微服务:service-aservice-bservice-a 需要调用 service-b

  1. 确保 Istio 已安装并启用 Sidecar 自动注入。

    istioctl install --set profile=demo -y
    kubectl label namespace default istio-injection=enabled
  2. 部署 service-aservice-b

    这里我们使用简单的 Deployment 和 Service 定义:

    # service-a.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: service-a
    spec:
    selector:
    matchLabels:
    app: service-a
    template:
    metadata:
    labels:
    app: service-a
    spec:
    containers:
    - name: service-a
    image: your-registry/service-a:latest # 替换为你的镜像
    ports:
    - containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: service-a
    spec:
    selector:
    app: service-a
    ports:
    - port: 80
    targetPort: 8080
    # service-b.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: service-b
    spec:
    selector:
    matchLabels:
    app: service-b
    template:
    metadata:
    labels:
    app: service-b
    spec:
    containers:
    - name: service-b
    image: your-registry/service-b:latest # 替换为你的镜像
    ports:
    - containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: service-b
    spec:
    selector:
    app: service-b
    ports:
    - port: 80
    targetPort: 8080

    使用 kubectl apply -f service-a.yamlkubectl apply -f service-b.yaml 部署服务。

  3. 配置 Istio 的 PeerAuthentication 策略,开启 mTLS。

    PeerAuthentication 策略用于配置服务端的 mTLS 模式。我们可以针对整个 namespace 开启 mTLS,也可以针对特定的服务开启 mTLS。

    # peer-authentication.yaml
    apiVersion: security.istio.io/v1beta1
    kind: PeerAuthentication
    metadata:
    name: default
    namespace: default # 替换为你的 namespace
    spec:
    mtls:
    mode: STRICT # 或者 PERMISSIVE

    使用 kubectl apply -f peer-authentication.yaml 应用策略。

    mode 设置为 STRICT 后,service-b 将只接受来自 service-a 的 mTLS 连接。如果 service-a 尝试使用 plaintext 连接,将会被 Envoy 代理拒绝。

  4. (可选)配置 Istio 的 RequestAuthentication 策略,进行 JWT 验证。

    RequestAuthentication 策略用于验证客户端提供的 JWT (JSON Web Token)。我们可以根据 JWT 中的 claim 来进行细粒度的访问控制。

    首先,需要在 service-a 中添加 JWT 认证逻辑,例如使用 Auth0、Okta 等身份认证服务颁发 JWT。然后,配置 RequestAuthentication 策略来验证 JWT:

    # request-authentication.yaml
    apiVersion: security.istio.io/v1beta1
    kind: RequestAuthentication
    metadata:
    name: jwt-example
    namespace: default # 替换为你的 namespace
    spec:
    selector:
    matchLabels:
    app: service-b # 针对 service-b 进行 JWT 验证
    jwtRules:
    - issuer: "https://your-issuer.com" # 替换为你的 issuer
    jwksUri: "https://your-issuer.com/.well-known/jwks.json" # 替换为你的 jwksUri

    使用 kubectl apply -f request-authentication.yaml 应用策略。

  5. 配置 Istio 的 AuthorizationPolicy 策略,进行授权控制。

    AuthorizationPolicy 策略用于定义访问控制规则。我们可以根据请求的来源、目标、HTTP 方法、headers 等信息来决定是否允许访问。

    例如,我们可以配置一个 AuthorizationPolicy 策略,只允许来自 service-a 的请求访问 service-b/admin 接口:

    # authorization-policy.yaml
    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
    name: service-b-admin
    namespace: default # 替换为你的 namespace
    spec:
    selector:
    matchLabels:
    app: service-b # 针对 service-b 应用策略
    rules:
    - from:
    - source:
    principals: ["cluster.local/ns/default/sa/service-a"] # 只允许来自 service-a 的请求
    to:
    - operation:
    methods: ["GET"]
    paths: ["/admin"]

    使用 kubectl apply -f authorization-policy.yaml 应用策略。

总结

通过本文的介绍,你了解了如何使用 Istio 在 Kubernetes 中实现微服务的安全通信。mTLS 认证确保了服务间的身份验证,而授权策略则提供了细粒度的访问控制。结合 JWT 验证,我们可以构建一个安全可靠的微服务架构。

在实际应用中,你需要根据具体的业务需求来配置 Istio 的安全策略。例如,可以根据服务的敏感程度来选择不同的 mTLS 模式,可以根据用户的角色来定义不同的访问权限。通过灵活地配置 Istio 的安全功能,可以有效地保护你的微服务应用。

深入学习

希望本文能够帮助你更好地理解和应用 Istio 的安全功能,为你的微服务应用保驾护航。

安全老司机 IstioKubernetesService Mesh

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/10182