2

我已经按照说明部署了 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"
}

但是当我尝试运行以下 bash 命令时它仍然给我错误:docker exec -it busybox sh按照说明在Bob测试用户下。

journalctl -u docker.service提供以下错误: 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部分时,它作为完整的 RW 用户工作,因此该规则有效,但严格提及 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/%"]

还希望获得有关如何允许exec对任何容器进行操作的建议,而不仅仅是指定的容器。

提前致谢!

4

1 回答 1

1

查看提供给 OPA 的输入映射,您应该找到input.Path,input.PathPlaininput.PathArr:

input := map[string]interface{}{
    "Headers":    r.RequestHeaders,
    "Path":       r.RequestURI,
    "PathPlain":  u.Path,
    "PathArr":    strings.Split(u.Path, "/"),
    "Query":      u.Query(),
    "Method":     r.RequestMethod,
    "Body":       body,
    "User":       r.User,
    "AuthMethod": r.UserAuthNMethod,
}

没有input.path可用的小写字母,但使用任何其他替代方案都应该有效。

于 2021-02-23T04:55:52.430 回答