您可以使用授权策略对服务网格中的工作负载进行访问控制。本文介绍如何使用授权策略实现访问控制。

前提条件

步骤一:在ACK集群中部署示例应用

  1. 为default命名空间开启自动注入。具体操作,请参见启用自动注入
  2. 通过kubectl连接集群。具体操作,请参见通过kubectl工具连接集群
  3. 使用以下内容,创建名为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
  4. 执行以下命令,创建httpbin应用。
    kubectl apply -f httpbin.yaml
  5. 执行以下命令,验证Pod是否正常运行。
    kubectl get pod |grep httpbin

    预期输出:

    httpbin-66cdbdb6c5-vhsh6          2/2     Running   0          11s

步骤二:保留请求方客户端源IP

说明 可以使用两种方式保留请求客户端源IP:
  • 使用externalTrafficPolicy: Local保留请求方客户端源IP,在AuthorizationPolicy中使用ipBlocks设置授权策略。推荐使用此方式。
  • 使用X-Forwarded-For HTTP标头或代理协议保留请求方客户端源IP,在AuthorizationPolicy中使用remoteIpBlocks设置授权策略。
  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网格详情页面左侧导航栏单击ASM网关
  5. 单击ingressgateway操作列下的YAML
  6. 编辑面板的文本框中输入externalTrafficPolicy: Local,然后单击确定
    源IP
  7. 在ACK集群中执行以下命令,为入口网关打开RBAC调试日志。
    kubectl exec -it -n istio-system <istio-ingressgateway Pod名称> -- curl -X POST localhost:15000/logging?rbac=debug
  8. 在ACK集群中执行以下命令,获得请求客户端IP地址。
    CLIENT_IP=$(kubectl get pods -n istio-system -o name -l istio=ingressgateway | sed 's|pod/||' | while read -r pod; do kubectl logs "$pod" -n istio-system | grep remoteIP; done | tail -1 | awk -F, '{print $3}' | awk -F: '{print $2}' | sed 's/ //') && echo "$CLIENT_IP"

步骤三:在ASM中设置路由规则

通过配置网关规则虚拟服务实现任意请求都可访问httpbin应用。

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 创建网关规则
    1. 在网格详情页面左侧导航栏选择流量管理 > 网关规则,然后在右侧页面单击新建
    2. 新建面板设置命名空间为default,将以下内容复制到文本框中,然后单击确定
      apiVersion: networking.istio.io/v1alpha3
      kind: Gateway
      metadata:
        name: httpbin-gateway
      spec:
        selector:
          istio: ingressgateway
        servers:
        - port:
            number: 80
            name: http
            protocol: HTTP
          hosts:
          - "*"
  5. 创建虚拟服务
    1. 在网格详情页面左侧导航栏选择流量管理 > 虚拟服务,然后在右侧页面单击新建
    2. 新建面板设置命名空间为default,将以下内容复制到文本框中,然后单击确定
      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: httpbin
      spec:
        hosts:
        - "*"
        gateways:
        - httpbin-gateway
        http:
        - route:
          - destination:
              host: httpbin
              port:
                number: 8000
  6. 执行以下命令,验证是否可以正常访问httpbin应用。
    curl "<入口网关的IP地址>:<入口网关的端口>"/headers -s -o /dev/null -w "%{http_code}\n"
    说明 关于入口网关IP地址获取方式,请参见 定义Istio资源

    预期输出:

    200

    返回结果为200,说明访问成功。

步骤四:设置授权策略

设置授权策略实现指定的IP访问应用

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网格详情页面左侧导航栏选择零信任安全 > 授权策略,然后在右侧页面单击新建
  5. 新建面板设置命名空间为istio-system,将以下内容复制到文本框中,然后单击确定
    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: ingress-policy
      namespace: istio-system
    spec:
      selector:
        matchLabels:
          app: istio-ingressgateway
      action: ALLOW
      rules:
      - from:
        - source:
            ipBlocks: ["1.2.3.4", "5.6.7.0/24"]

    设置actionALLOW,设置ipBlocks["1.2.3.4", "5.6.7.0/24"],表示只有1.2.3.4和5.6.7.0/24可以访问httpbin应用。

  6. 执行以下命令,使用请求客户端访问httpbin应用,验证1.2.3.4和5.6.7.0/24之外的IP地址是否可以访问httpbin应用。
    curl "<入口网关的IP地址>:<入口网关的端口>"/headers -s -o /dev/null -w "%{http_code}\n"

    预期输出:

    403

    返回结果为403,请求客户端访问应用失败。说明1.2.3.4和5.6.7.0/24之外的IP地址无法访问httpbin应用。

设置授权策略实现请求客户端访问应用

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网格详情页面左侧导航栏选择零信任安全 > 授权策略,然后在右侧页面单击新建
  5. 新建面板设置命名空间为istio-system,将以下内容复制到文本框中,然后单击确定
    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: ingress-policy
      namespace: istio-system
    spec:
      selector:
        matchLabels:
          app: istio-ingressgateway
      action: ALLOW
      rules:
      - from:
        - source:
            ipBlocks: ["1.2.3.4", "5.6.7.0/24", "$CLIENT_IP"]

    设置actionALLOW,设置ipBlocks["1.2.3.4", "5.6.7.0/24", "$CLIENT_IP"],表示只有1.2.3.4、5.6.7.0/24和CLIENT_IP可以访问httpbin应用。

  6. 执行以下命令,验证请求客户端IP地址是否可以访问httpbin应用。
    curl "<入口网关的IP地址>:<入口网关的端口>"/headers -s -o /dev/null -w "%{http_code}\n"

    预期输出:

    200

    返回结果为200,请求客户端可以访问应用。

设置授权策略实现指定IP不可以访问应用

  1. 登录ASM控制台
  2. 在左侧导航栏,选择服务网格 > 网格管理
  3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
  4. 在网格详情页面左侧导航栏选择零信任安全 > 授权策略,然后在右侧页面单击新建
  5. 新建面板设置命名空间为istio-system,将以下内容复制到文本框中,然后单击确定
    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: ingress-policy
      namespace: istio-system
    spec:
      selector:
        matchLabels:
          app: istio-ingressgateway
      action: DENY
      rules:
      - from:
        - source:
            ipBlocks: ["1.2.3.4", "5.6.7.0/24", "$CLIENT_IP"]

    设置actionDENY,设置ipBlocks["1.2.3.4", "5.6.7.0/24", "$CLIENT_IP"],表示1.2.3.4、5.6.7.0/24和CLIENT_IP不可以访问httpbin应用。

  6. 执行以下命令,验证请求客户端IP地址是否可以访问httpbin应用。
    curl "<入口网关的IP地址>:<入口网关的端口>"/headers -s -o /dev/null -w "%{http_code}\n"

    预期输出:

    403

    返回结果为403,请求客户端访问应用失败。