Kubernetes集群中命名空间之间的服务访问默认没有限制,例如开发环境命名空间中的服务可以调用生产环境中服务。您可以使用ASM零安全体系,动态配置策略,实现禁止A命名空间下的全部服务访问B命名空间下的服务,从而降低风险。本文以demo-frontend和demo-server命名空间为例,介绍如何使用授权策略实现对跨命名空间下服务访问的控制。

前提条件

已添加集群到ASM实例。具体操作,请参见添加集群到ASM实例

步骤一:注入Sidecar代理

为命名空间注入Sidecar代理,便于对该命名空间下的服务进行授权管理。

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

步骤二:创建测试服务

在demo-frontend命名空间下创建发起请求的sleep服务,在demo-server命名空间下创建被访问的httpbin服务。

  1. 获取集群KubeConfig并通过kubectl工具连接集群
  2. 在demo-frontend命名空间下创建sleep服务。
    1. 使用以下内容,创建sleep.yaml
      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服务。
      kubectl apply -f sleep.yaml -n demo-frontend
  3. 在demo-server命名空间下创建httpbin服务。
    1. 使用以下内容,创建httpbin.yaml
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: httpbin
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: httpbin
        labels:
          app: httpbin
          service: httpbin
      spec:
        ports:
        - name: http
          port: 8000
          targetPort: 80
        selector:
          app: httpbin
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: httpbin
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: httpbin
            version: v1
        template:
          metadata:
            labels:
              app: httpbin
              version: v1
          spec:
            serviceAccountName: httpbin
            containers:
            - image: docker.io/kennethreitz/httpbin
              imagePullPolicy: IfNotPresent
              name: httpbin
              ports:
              - containerPort: 80
    2. 执行以下命令,创建httpbin服务。
      kubectl apply -f httpbin.yaml -n demo-server
  4. 验证测试服务是否成功注入Sidecar。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏,单击集群
    3. 集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页左侧导航栏,选择工作负载 > 容器组
    5. 容器组页面单击sleep服务的容器组名称。
      容器页签下可以看到istio-proxy,说明sleep服务注入Sidecar成功。
    6. 重复执行以上步骤,可以看到httpbin服务注入Sidecar成功。

步骤三:创建对等身份认证

创建对等身份认证,便于授权策略使用TLS对服务进行授权。

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网格详情页面左侧导航栏,选择网格安全中心 > 对等身份认证
  5. 对等身份认证页面单击创建双向mTLS模式
  6. 设置命名空间为demo-frontend,输入名称,设置mTLS模式为STRICT模式,然后单击创建
  7. 重复执行以上步骤,为demo-server命名空间启用双向对等身份认证。

步骤四:验证使用授权策略实现对跨命名空间服务访问的控制

通过修改授权策略的动作,您可以禁止或允许demo-frontend命名空间下的服务访问demo-server下的服务,实现对跨命名空间服务访问的控制。

  1. 创建授权策略,禁止来自demo-frontend命名空间的访问请求。
    1. 登录ASM控制台
    2. 在左侧导航栏,选择服务网格 > 网格管理
    3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
    4. 在网格详情页面左侧导航栏,选择网格安全中心 > 授权策略,然后在右侧页面,单击创建
    5. 设置授权策略参数,然后单击创建
      参数说明
      名称输入授权策略的名称。
      策略类型设置策略类型拒绝
      命名空间工作负载生效页签,设置命名空间demo-server
      生效范围工作负载生效页签,设置生效范围命名空间生效
      添加请求来源添加请求来源区域,打开命名空间(Namespaces)开关,设置值为demo-frontend
  2. 访问httpbin服务。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏,单击集群
    3. 集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页左侧导航栏,选择工作负载 > 容器组
    5. 容器组页面单击sleep容器右侧操作列下的终端,单击容器:sleep
    6. 在容器组终端中执行以下命令,访问httpbin服务。
      curl -I httpbin.demo-server.svc.cluster.local:8000 
      预期输出:
      HTTP/1.1 403 Foribidden
      返回以上结果,说明访问httpbin服务失败,demo-frontend命名空间下的服务访问demo-server下的服务失败。
  3. 修改授权策略动作为ALLOW,允许来自demo-frontend命名空间的访问请求。
    1. 登录ASM控制台
    2. 在左侧导航栏,选择服务网格 > 网格管理
    3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
    4. 在网格详情页面左侧导航栏,选择网格安全中心 > 授权策略
    5. 授权策略页面单击目标策略右侧操作列下的YAML
    6. 编辑面板修改action参数值为ALLOW,然后单击确定
  4. 在sleep容器组终端中执行以下命令,访问httpbin服务。
    curl -I httpbin.demo-server.svc.cluster.local:8000 
    预期输出:
    HTTP/1.1 200 OK
    返回以上结果,说明访问httpbin服务成功,demo-frontend命名空间下的服务可以正常访问demo-server下的服务。

    可以看到,创建动作为Deny的授权策略后,demo-frontend命名空间下的服务访问demo-server下的服务失败,然后修改授权策略动作为ALLOW,demo-frontend命名空间下的服务访问demo-server下的服务成功,说明通过授权策略控制跨命名空间服务访问成功。