OPA Docker授权插件配置docker exec权限时API路径规则不生效咨询
部署背景
已按照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

