控制OPA Sidecar代理注入的范围

开放策略代理(OPA)插件通过为应用注入OPA Sidecar代理来定义访问控制策略。当您需要对特定命名空间的应用程序进行精细化授权和访问控制时,可以启用OPA注入范围控制功能,仅添加了opa-istio-injection=enabled标签的命名空间下的Pod会注入OPA Sidecar代理,实现更细粒度的访问控制。

前提条件

  • 已添加集群到ASM实例,且ASM实例为1.12.4.19及以上版本。具体操作,请参见添加集群到ASM实例

  • 已创建default和develop命名空间。具体操作,请参见管理命名空间与配额

  • 已在default命名空间下部署Nginx应用,在develop命名空间下部署Sleep应用。更多信息,请参见创建无状态工作负载Deployment

    展开查看如何创建Nginx和Sleep应用

    1. 使用以下内容,创建nginx.yaml和sleep.yaml。

      nginx.yaml

      apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
      kind: Deployment
      metadata:
        name: nginx-deployment
      spec:
        selector:
          matchLabels:
            app: nginx
        replicas: 1
        template:
          metadata:
            labels:
              app: nginx
              sidecarset-injected: "true"
          spec:
            containers:
            - name: nginx
              image: nginx:1.14.2
              ports:
              - containerPort: 80
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: nginx
      spec:
        ports:
          - name: http
            port: 80
            protocol: TCP
            targetPort: 80
        selector:
          app: nginx
        type: ClusterIP

      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", "infinity"]
              imagePullPolicy: IfNotPresent
              volumeMounts:
              - mountPath: /etc/sleep/tls
                name: secret-volume
            volumes:
            - name: secret-volume
              secret:
                secretName: sleep-secret
                optional: true
      ---
    2. 执行以下命令,在default命名空间下部署Nginx应用,在develop命名空间下部署Sleep应用。

      kubectl apply -f nginx.yaml -n default
      kubectl apply -f sleep.yaml -n develop

步骤一:启用OPA插件和注入范围控制

本文启用OPA插件和注入范围控制后,为default命名空间添加opa-istio-injection=enabled标签,develop命名空间则不添加opa-istio-injection=enabled标签,查看Nginx应用和Sleep应用是否都注入OPA Sidecar代理,从而验证控制OPA Sidecar代理注入范围是否成功。

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

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

  3. OPA策略页面,选中启用开放策略代理OPA插件启用OPA注入范围控制,单击开启OPA功能,在提示对话框,单击确定

步骤二:为命名空间添加标签

下文介绍如何在ACK控制台上为default命名空间添加opa-istio-injection=enabled标签。您也可以通过kubectl工具连接集群,执行kubectl label namespace default opa-istio-injection=enabled --overwrite命令,为命名空间添加标签。关于连接集群的具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择命名空间与配额

  3. 命名空间页面,单击default命名空间右侧操作列下的编辑

  4. 编辑命名空间对话框,设置标签名称为opa-istio-injection,值为enabled,单击添加,然后单击确定

步骤三:重启应用

通过删除Pod的方式使应用重启。重启应用后,会自动注入OPA Sideacr代理。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 容器组

  3. 容器组页面顶部,设置命名空间default,单击Nginx应用Pod右侧操作列下的更多 > 删除,在提示对话框,单击确定

    如果应用下有多个Pod,您需要删除多个Pod,使应用重启。Pod状态显示为Running,说明Pod重启成功。

  4. 重复执行以上操作,重启develop命名空间下Sleep应用的Pod。

步骤四:验证控制OPA注入范围是否成功

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 容器组

  3. 容器组页面,查看Nginx和Sleep应用是否注入OPA Sidecar代理。

    • 设置命名空间default,单击Nginx应用的名称,在容器页签下可以看到opa-istio,说明Nginx应用注入OPA Sidecar代理。注入OPA

    • 设置命名空间develop,单击Sleep应用的名称,在容器页签下没有看到opa-istio,说明Sleep应用未注入OPA Sidecar代理。sleep

    通过以上操作,可以看到启用OPA注入范围控制功能后,添加opa-istio-injection=enabled标签的命名空间下的应用注入了OPA Sidecar代理,没有添加opa-istio-injection=enabled标签的命名空间下的应用未注入了OPA Sidecar代理,说明控制OPA注入范围成功。