打开策略代理 - OPA - 如何使用来自 kubernetes configmap 对象的 --config-file

open policy agent - OPA - How to use --config-file from kubernetes configmap object

我正在尝试如下设置我的 OPA。

  1. OPA 作为 sidecar 安装在 Kubernetes 中
  2. 政策将作为捆绑包进行管理
  3. OPA 政策将通过单独的服务 [Bundle] 存储和提供
  4. 需要使用配置文件配置 OPA 以从外部服务获取策略
  5. 配置文件将作为配置映射存储在 kubernetes 中。
  6. 需要在 --config-file 中使用配置映射

我在 kubernetes 中的配置映射

kubectl create configmap policyconfig --from-file=./config/config.yaml

我的 Sidecar OPA

 - name: opa
          image: openpolicyagent/opa:latest
          args:
            - "run"
            - "--server"
            - "--addr=0.0.0.0:443"
            - "--addr=0.0.0.0:8181"
            - "--config-file=policyconfig"
      volumes:
        - name: policyconfig
          configMap:
            name: policyconfig

让我知道是否可以用这种方式实现

您可以使用 kube-mgmt 作为 sidecar 在 Kubernetes 之上管理 OPA。

kube-mgmt 自动发现存储在 Kubernetes 中的 ConfigMaps 中的策略并将它们加载到 OPA 中。 kube-mgmt 假定 ConfigMap 包含策略,如果 ConfigMap 是:

  1. 在 --policies 选项中列出的命名空间中创建。如果您指定 --policies=* 那么 kube-mgmt 将在所有命名空间中查找策略。
  2. 标有 openpolicyagent。org/policy=rego

https://medium.com/capital-one-tech/policy-enabled-kubernetes-with-open-policy-agent-3b612b3f0203

更新:

根据您当前的设置和要求,您需要添加 volumeMounts 才能使其正常工作

 - name: opa
          image: openpolicyagent/opa:latest
          args:
            - "run"
            - "--server"
            - "--addr=0.0.0.0:443"
            - "--addr=0.0.0.0:8181"
            - "--config-file=policyconfig"
          volumeMounts:
          - name: policyconfig
            mountPath: /config
      volumes:
        - name: policyconfig
          configMap:
            name: policyconfig

或者,您可以使用 Gatekeeper. Which in addition to what kube-mgmt (Gatekeeper 1.0) has it also provides (per this):

  • 一个可扩展的参数化策略库
  • 用于实例化策略库的本机 Kubernetes CRD(又名 "constraints")
  • 用于扩展策略库的原生 Kubernetes CRD(又名“约束 模板")
  • 审计功能

另一个最近使用的工具是 MagTape

看来我也在尝试实现相同的目标 - 通过 Envoy to OPA using bundle API.

我的包-API配置-

  apiVersion: v1
  kind: ConfigMap
  metadata:
    name: policyconfig
  data:
    config.yaml: |
      services:
        - name: controller
          url: https://opa-bundle-bucket1.s3-us-west-1.amazonaws.com/bundles/authz.gz
      bundles:
        envoy/authz:
          service: controller
          resource: authz.gz
          polling:
            min_delay_seconds: 10
            max_delay_seconds: 20
      plugins:
        envoy_ext_authz_grpc:
          addr: :9191
          path: envoy/authz/allow
          dry-run: false
          enable-reflection: false

我在 kubernetes 中的配置映射 - kubectl create configmap policyconfig --from-file=./config/config.yaml

我的 Sidecar OPA -

  - name: opa
  # the latest released image of OPA-Envoy.
  image: openpolicyagent/opa:latest-envoy
  securityContext:
    runAsUser: 1111
  volumeMounts:
  - readOnly: true
    mountPath: /config
    name: policyconfig
  args:
  - "run"
  - "--server"
  - "--addr=localhost:8181"
  - "--diagnostic-addr=0.0.0.0:8282"
  - "--set=plugins.envoy_ext_authz_grpc.addr=:9191"
  - "--set=plugins.envoy_ext_authz_grpc.query=data.envoy.authz.allow"
  - "--set=decision_logs.console=true"
  - "--ignore=.*"
  - "--config-file=/config/config.yaml"
    volumes:
    - name: policyconfig
    configMap:
      name: policyconfig

预期行为:- Envoy 将调用 OPA,OPA 将请求发送到 bundle-server 以获取最新的策略和数据。

实际行为:- Envoy 正在调用 OPA,但无法下载 OPA 策略。

Let me know what I am doing wrong here.