【问题标题】:Proxy K8S app delegating authentication of requests from other pods代理 K8S 应用程序委托对来自其他 pod 的请求进行身份验证
【发布时间】:2019-09-15 04:13:43
【问题描述】:

背景

我有一个 K8S 集群,其中包含许多不同的 pod,它们有自己特定的服务帐户、集群角色和集群角色绑定,因此它们可以直接使用 K8S REST API 执行各种读/写请求。可以发出一些复杂的请求,我想做一个函数来包装复杂的逻辑。但是,集群中的各种服务是用多种(即 6 种以上)编程语言编写的,并且(目前)似乎还没有一种简单的方法可以让所有这些服务直接重用这些代码。

我正在考虑创建一个“代理”微服务,它公开自己的 REST API,并代表客户端发出必要的请求并处理“复杂逻辑”。


问题

唯一的问题是,在当前的部署模型下,客户端可以请求代理微服务执行客户端本身无权发出的 HTTP 请求。


问题

对于一个 pod 是否有一种简单/直接的方式,例如,识别客户端 pod,并执行某种查询/result-of-policy 操作(即通过将身份验证委托给 K8S 集群身份验证机制本身)确定它是否应该接受来自客户端 pod 的请求?


【问题讨论】:

    标签: rest security authentication kubernetes api-design


    【解决方案1】:

    Kubernetes Authentication 模型表示特定用户或服务帐户如何在 k8s 集群中获得授权,但是 Authorization 方法确定是否来自集群访问者的初始请求,旨在对集群资源/对象执行一些操作,有足够的权限使之成为可能。

    由于您在整个集群中为每个 Pod 使用了特定的服务帐户并授予它们特定的 RBAC 规则,因此可以使用 SelfSubjectAccessReview API 来检查对 k8s REST API 的请求和确定客户端的 Pod 服务帐户是否具有对目标的 Pod 命名空间执行任何操作的适当权限。

    这可以通过使用kubectl auth can-i subcommand 提交用于模拟用户的基本信息来实现。

    我假设您还可以在 HTTP 请求模式中查询 k8s 授权 API 组,然后解析 JSON/YAML 格式的结构化数据,如下例所示:

    常规的kubectl auth can-i 命令检查default SA 是否可以检索default 命名空间中的Pod 数据:

    kubectl auth can-i get pod --as system:serviceaccount:default:default

    在 Bearer Token 身份验证中使用 JSON 类型的内容通过 HTTP 调用 k8s REST API 的等效方法:

    curl -k \
        -X POST \
        -d @- \
        -H "Authorization: Bearer $MY_TOKEN" \
        -H 'Accept: application/json' \
        -H "Impersonate-User: system:serviceaccount:default:default" \
        -H 'Content-Type: application/json' \
        https://<API-Server>/apis/authorization.k8s.io/v1/selfsubjectaccessreviews <<'EOF'
    {
      "kind": "SelfSubjectAccessReview",
      "apiVersion": "authorization.k8s.io/v1",
      "spec":{"resourceAttributes":{"namespace":"default","verb":"get","resource":"pods"}}
    }
    EOF
    

    输出:

    ....“状态”:{ “允许”:是的, "reason": "RBAC: RoleBinding 允许 ....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      相关资源
      最近更新 更多