为TCP流量设置授权策略

当您需要精细控制服务间的TCP流量访问时,可以为TCP流量设置授权策略,管理服务之间的交互权限,确保只有经过授权的请求才能访问特定服务,提高服务的安全性和可靠性。

前提条件

步骤一:部署示例应用

部署tcp-echo作为被请求的TCP服务,sleep作为发起请求的TCP服务。

  1. 部署被请求的TCP服务。

    1. 使用以下内容,创建tcp-echo.yaml文件。

      当tcp-echo收到请求后,将在请求内容新增hello前缀,作为返回结果。例如,向tcp-echo发送world,将返回hello world

      展开查看tcp-echo.yaml

      apiVersion: v1
      kind: Service
      metadata:
        name: tcp-echo
        labels:
          app: tcp-echo
          service: tcp-echo
      spec:
        ports:
        - name: tcp
          port: 9000
        - name: tcp-other
          port: 9001
        selector:
          app: tcp-echo
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: tcp-echo
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: tcp-echo
            version: v1
        template:
          metadata:
            labels:
              app: tcp-echo
              version: v1
          spec:
            containers:
            - name: tcp-echo
              image: docker.io/istio/tcp-echo-server:1.2
              imagePullPolicy: IfNotPresent
              args: [ "9000,9001,9002", "hello" ]
              ports:
              - containerPort: 9000
              - containerPort: 9001
    2. 使用kubectl连接到集群,执行以下命令,将tcp-echo服务部署到foo命名空间,作为被请求的TCP服务。

      关于如何使用kubectl连接到集群,请参见获取集群KubeConfig并通过kubectl工具连接集群

      kubectl apply -f tcp-echo.yaml -n foo
  2. 部署发起请求的TCP服务。

    1. 使用以下内容,创建sleep.yaml文件。

      展开查看sleep.yaml

      #Sleep service
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: sleep
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: sleep
        labels:
          app: sleep
          service: sleep
      spec:
        ports:
        - port: 80
          name: http
        selector:
          app: sleep
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: sleep
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: sleep
        template:
          metadata:
            labels:
              app: sleep
          spec:
            terminationGracePeriodSeconds: 0
            serviceAccountName: sleep
            containers:
            - name: sleep
              image: curlimages/curl
              command: ["/bin/sleep", "3650d"]
              imagePullPolicy: IfNotPresent
              volumeMounts:
              - mountPath: /etc/sleep/tls
                name: secret-volume
            volumes:
            - name: secret-volume
              secret:
                secretName: sleep-secret
                optional: true
      ---
    2. 执行以下命令,将sleep服务部署到foo命名空间,用于发起TCP请求。

      kubectl apply -f sleep.yaml -n foo

步骤二:验证授权前,请求是否成功

  1. 执行以下命令,验证sleep请求服务能否访问TCP服务的9000端口。

    kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9000" | nc tcp-echo 9000' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'

    预期输出:

    hello port 9000
    connection succeeded

    预期输出表明sleep请求服务访问TCP服务的9000端口成功。

  2. 执行以下命令,验证sleep请求服务能否访问TCP服务的9001端口。

    kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9001" | nc tcp-echo 9001' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'

    预期输出:

    hello port 9001
    connection succeeded

    预期输出表明sleep请求服务访问TCP服务的9001端口成功。

步骤三:配置授权策略

配置可以访问TCP服务的9000端口的授权策略,具体操作步骤如下。

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格安全中心 > 授权策略

  3. 任选以下方式创建授权策略。

    重要

    配置TCP授权策略时,不能打开HTTP方法(Methods)开关。这种配置仅限于HTTP请求使用,不符合TCP的ALLOW规则,为无效配置。服务网格将忽略无效的ALLOW规则,导致请求被拒绝,返回connection rejected

    方式一:使用YAML创建授权策略

    1. 授权策略页面,单击使用YAML创建

    2. 创建页面,选择命名空间foo,选择任意场景模版,将以下YAML模板粘贴到YAML区域,然后单击创建

      kind: AuthorizationPolicy
      apiVersion: security.istio.io/v1beta1
      metadata:
        name: demo
        namespace: foo
      spec:
        action: ALLOW
        rules:
          - to:
              - operation:
                  ports:
                    - '9000'

    方式二:通过图形化界面创建授权策略

    1. 授权策略页面,单击创建

    2. 创建页面,配置相关信息,然后单击创建

      配置项

      说明

      名称

      本示例为demo

      策略类型

      选择允许

      命名空间

      工作负载生效页签,选择foo命名空间。

      生效范围

      选择命名空间生效

      请求匹配规则

      添加请求目标区域,打开端口(Ports)开关,设置值为9000

步骤四:验证授权后,请求是否成功

  1. 执行以下命令,验证sleep请求服务能否访问TCP服务的9001端口。

    kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9001" | nc tcp-echo 9001' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'

    预期输出:

    connection rejected

    预期输出表明sleep请求服务访问TCP服务的9001端口失败。

  2. 执行以下命令,验证sleep请求服务能否访问TCP服务的9000端口。

    kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9000" | nc tcp-echo 9000' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'

    预期输出:

    hello port 9000
    connection succeeded

    预期输出表明sleep请求服务访问TCP服务的9000端口成功。

相关文档