在阿里云服务网格ASM中,您可以通过配置零信任安全授权策略,实现对进入ASM的TCP流量的授权管理。本文介绍如何为TCP流量设置授权策略。

前提条件

  • 已创建命名空间。具体操作,请参见管理命名空间。本文以创建foo命名空间为例。
  • 已部署应用到ASM实例的集群中。具体操作,请参见部署应用到ASM实例。本文以在foo命名空间部署tcp-echo和sleep应用为例。
  • 已定义Istio资源。具体操作,请参见定义Istio资源

步骤一:为foo命名空间注入Sidecar代理

为foo命名空间注入Sidecar代理,便于对该命名空间下的服务进行授权管理。具体操作步骤如下:

  1. 新建foo命名空间。
    1. 登录ASM控制台
    2. 在左侧导航栏,选择服务网格 > 网格管理
    3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
    4. 在网格详情页面左侧导航栏选择网格实例 > 全局命名空间,然后在右侧页面单击新建
    5. 新建命名空间面板设置名称foo,然后单击确定
  2. 为foo命名空间注入Sidecar代理。
    1. 全局命名空间页面,单击foo命名空间右侧的自动注入列下的启用Sidecar自动注入
    2. 在弹出的确认对话框中,单击确定

步骤二:部署示例应用

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

  1. 部署被请求的TCP服务。
    1. 使用以下内容,创建tcp-echo.yaml文件。
      当tcp-echo收到请求后,将在请求内容新增hello前缀,作为返回结果。例如,向tcp-echo发送world,将返回hello world
      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. 执行以下命令,部署tcp-echo服务。
      tcp-echo服务部署到foo命名空间,作为被请求的TCP服务。
      kubectl apply -f tcp-echo.yaml -n foo
  2. 部署发起请求的TCP服务。
    1. 使用以下内容,创建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服务。
      将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'
    预期输出:访问9000端口
    由预期输出得到,返回hellow port 9000connection 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'
    预期输出:访问9001端口
    由预期输出得到,返回hellow port 9001connection succeeded,说明sleep请求服务访问TCP服务的9001端口成功。

步骤四:配置授权策略

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

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网格详情页面左侧导航栏选择零信任安全 > 授权策略
  5. 任选以下方式创建授权策略。
    注意 配置TCP授权策略时,不能将请求操作域配置为methods配置为GET。这种配置仅限于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'
      3. 单击创建
    • 方式二:不使用YAML创建授权策略。
      1. 授权策略页面,单击创建
      2. 创建页面,配置如下参数。
        参数 说明
        命名空间 选择foo命名空间。
        名称 设置名称demo
        策略 选择RULES
        动作 选择ALLOW
        请求操作 打开请求操作开关,单击增加请求操作到列表中,单击增加请求操作,设置请求操作域ports9000
        创建授权策略
      3. 单击创建

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

  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'
    预期输出:授权后访问9001端口
    由预期输出得到,返回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'
    预期输出:授权后访问9000端口
    由预期输出得到,返回hellow port 9000connection succeeded,说明sleep请求服务访问TCP服务的9000端口成功。