使用ASM授权策略试运行模式

对授权策略配置失误可能会引起非预期的访问被拒绝或放行。您可以使用ASM授权策略试运行模式,在不影响正式环境的情况下验证授权策略的正确性和可靠性,降低生产环境出现问题的风险,确保授权策略的顺利部署和运行。

前提条件

背景信息

ASM授权策略支持为网格中的工作负载提供命名空间和工作负载级别的访问权限控制。由于授权策略属于流量管控能力,对授权策略的配置失误可能引起非预期的访问被拒绝或放行,这对网格管理人员的工作带来了很大挑战。一旦授权策略配置失误,可能导致正常业务访问被拒绝或应当被阻止的访问被放行。为此,ASM提供了授权策略试运行模式来解决此类问题。对授权策略启用试运行选项可以使授权策略在应用后并不实际阻止或放行流量,而是仅对策略的执行输出日志。网格管理人员可以通过该日志来判断对应策略的执行结果是否符合预期,并可以参考日志将策略调整至完全符合预期后,再关闭试运行模式,使授权策略真正生效。

本文示例将部署sleep和httpbin两个测试应用,整体流程如下:在sleep应用中通过curl访问httpbin应用,验证连通性后,在ASM中配置一个拒绝特定请求的授权策略并开启试运行模式,然后发起可以匹配授权策略拒绝条件的请求。此时因为已启用试运行模式,所以该请求不会被拒绝,同时Sidecar会输出试运行的执行日志,供网格管理人员确认该授权策略的执行情况。确认无误后,关闭该授权策略的试运行模式,使授权策略生效。

步骤一:部署测试应用sleep和httpbin并测试连通性

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

    展开查看sleep.yaml

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: sleep
      namespace: foo
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sleep
      namespace: foo
      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. 使用kubectl连接到集群,执行以下命令,在foo命名空间部署sleep应用。

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

    kubectl apply -f sleep.yaml -n foo
  3. 使用以下内容,创建httpbin.yaml文件。

    展开查看httpbin.yaml

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: httpbin
      namespace: foo
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      namespace: foo
      labels:
        app: httpbin
        service: httpbin
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 80
      selector:
        app: httpbin
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
      namespace: foo
    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. 执行以下命令,在foo命名空间部署httpbin应用。

    kubectl apply -f httpbin.yaml -n foo
  5. 执行以下命令,测试sleep应用和httpbin应用之间的连通性。

    for i in {1..20}; do kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl http://httpbin.foo:8000/headers -s -o /dev/null -w "%{http_code}\n"; done

    预期输出:

    200
    200
    200
    ...

    可以看到从sleep应用所在的Pod中执行curl命令访问httpbin应用20次,返回值均为200,表明网络连接正常。

步骤二:创建授权策略并启用试运行模式

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

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

  3. 创建页面,进行如下配置,然后单击创建

    创建授权策略

步骤三:观察授权策略效果

  1. 执行以下命令,再次从sleep应用中访问httpbin应用。

    for i in {1..20}; do kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl http://httpbin.foo:8000/headers -s -o /dev/null -w "%{http_code}\n"; done

    预期输出:

    200
    200
    200
    ...

    可以看到由于授权策略启用了试运行模式,所以请求仍然可以成功。

  2. 执行以下命令,将httpbin应用的Sidecar的RBAC日志级别调整为Debug。

    kubectl exec "$(kubectl get pod -l app=httpbin -n foo -o jsonpath={.items..metadata.name})" -c istio-proxy -n foo -- curl -X POST 127.0.0.1:15000/logging?rbac=debug

    预期输出:

      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0active loggers:
      ...
      rbac: debug
      ...
    100  1028    0  1028    0     0  1003k      0 --:--:-- --:--:-- --:--:-- 1003k
  3. 执行以下命令,从httpbin应用的Sidecar中筛选授权策略输出的试运行日志。

    kubectl logs "$(kubectl -n foo -l app=httpbin get pods -o jsonpath={.items..metadata.name})" -c istio-proxy -n foo | grep "shadow denied"

    可以看到输出的拦截日志如下。

    2023-12-20T03:58:47.107915Z     debug   envoy rbac external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:130        shadow denied, matched policy ns[foo]-policy[test]-rule[0]     thread=32
    2023-12-20T03:58:48.800098Z     debug   envoy rbac external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:130        shadow denied, matched policy ns[foo]-policy[test]-rule[0]     thread=33
    2023-12-20T03:58:50.420179Z     debug   envoy rbac external/envoy/source/extensions/filters/http/rbac/rbac_filter.cc:130        shadow denied, matched policy ns[foo]-policy[test]-rule[0]     thread=32

步骤四:关闭试运行模式

当您通过日志判断授权策略的执行结果符合预期后,可以关闭试运行模式,使授权策略真正生效。

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

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

  3. 授权策略页面,找到步骤二创建的授权策略,在试运行模式列下关闭开关,然后在确认对话框,单击确认,关闭试运行模式。

  4. 使用以下命令,再次发起请求测试。

    for i in {1..20}; do kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- curl http://httpbin.foo:8000/headers -s -o /dev/null -w "%{http_code}\n"; done

    预期输出:

    403
    403
    403
    ...

    可以看到因为授权策略已经生效,请求被拒绝,返回403代码。

  5. 测试完毕后,执行以下命令,恢复Sidecar的日志级别为Warning。

    kubectl exec "$(kubectl get pod -l app=httpbin -n foo -o jsonpath={.items..metadata.name})" -c istio-proxy -n foo -- curl -X POST 127.0.0.1:15000/logging?rbac=warning

    预期输出:

      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0active loggers:
      ...
      rbac: warning
      ...
    100  1028    0  1028    0     0  1003k      0 --:--:-- --:--:-- --:--:-- 1003k

相关文档