代理K8S应用委派了来自其他Pod的请求的身份验证

时间:2019-04-25 16:52:10

标签: rest security authentication kubernetes api-design


背景

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

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


问题

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


问题

例如,是否有一个简单/简单的方法可用于一个Pod,以识别客户端Pod,并执行某种查询/策略结果操作(即通过将身份验证委派给K8S群集身份验证机制本身)确定它是否应兑现来自客户吊舱的请求?


1 个答案:

答案 0 :(得分:0)

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允许....