You need to enable JavaScript to run this app. OPA Docker授权插件配置docker exec权限时API路径规则不生效咨询
优惠活动
大模型
产品
解决方案
定价
更多

OPA Docker授权插件配置docker exec权限时API路径规则不生效咨询

OPA Docker授权插件配置docker exec权限规则不生效排查

部署背景

已按照OPA Docker授权插件官方文档要求部署环境,前期规则运行均正常,在尝试为docker exec操作配置自定义Docker API权限时出现异常。

问题复现

在authz.rego中添加如下规则段:

allow {
    user_id := input.Headers["Authz-User"]
    users[user_id].readOnly
    input.path[0] == "/v1.41/containers/busybox/exec"
    input.Method == "POST"
}

以测试用户Bob身份执行docker exec -it busybox sh命令时,规则返回拒绝错误。通过journalctl -u docker.service查询到的Docker服务日志如下:

level=error msg="AuthZRequest for POST /v1.41/containers/busybox/exec returned error: authorization denied by plugin openpolicyagent/opa-docker-authz-v2:0.4: request rejected by administrative policy"

异常特征

  • 注释掉规则中input.path相关判断段后,用户的基础读写权限规则可正常生效,证明规则基础逻辑运行无问题
  • 只要添加严格的API路径匹配限制,规则就会直接判定拒绝
  • 先后尝试过多种路径写法变体,均无法生效,尝试的写法包括:
    input.path == ["/v1.41/containers/busybox/exec"]
    input.path = ["/v1.41/containers/busybox/exec"]
    input.path = ["/v1.41*"]
    input.path = ["/v1.41/*"]
    input.path = ["/v1.41%"]
    input.path = ["/v1.41/%"]
    

根因定位

input.path的实际结构与预期存在偏差:OPA Docker Authz插件传入的input.path是API请求路径按斜杠拆分后的字符串数组,并非将完整路径作为单个数组元素存储。
以实际请求POST /v1.41/containers/busybox/exec为例,其对应的input.path数组结构为:

["", "v1.41", "containers", "busybox", "exec"]

所有将完整路径作为数组单个元素的匹配写法,都无法命中实际的数组结构条件,最终导致规则判定拒绝。

修正方案

匹配指定容器(busybox)的exec权限规则

按拆分后的数组结构逐段匹配路径:

allow {
    user_id := input.Headers["Authz-User"]
    users[user_id].readOnly
    input.path[1] == "v1.41"
    input.path[2] == "containers"
    input.path[3] == "busybox"
    input.path[4] == "exec"
    input.Method == "POST"
}

匹配任意容器的exec权限规则

去掉指定容器名称的匹配条件,仅通过路径段位置匹配任意容器的exec请求:

allow {
    user_id := input.Headers["Authz-User"]
    users[user_id].readOnly
    input.path[1] == "v1.41"
    input.path[2] == "containers"
    input.path[4] == "exec"
    input.Method == "POST"
}

兼容多API版本的匹配写法

如果需要适配不同版本的Docker API,无需硬编码版本号,可通过字符串匹配特征校验路径段:

allow {
    user_id := input.Headers["Authz-User"]
    users[user_id].readOnly
    # 匹配所有以v开头的API版本段
    startswith(input.path[1], "v")
    input.path[2] == "containers"
    input.path[4] == "exec"
    input.Method == "POST"
}

内容的提问来源于stack exchange,提问作者Victor EStalin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 01:36:03