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



Background

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

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

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

<小时 />

问题

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

<小时 />

Kubernetes 身份验证模型表示一种如何在 k8s 集群中授权特定用户或服务帐户的方式,但是授权方法确定来自集群访问者的初始请求(旨在对集群资源/对象执行某些操作)是否具有足够的权限来实现这一点。

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

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

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

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

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

通过 HTTP 调用 k8s REST API 的等效方法,在持有者令牌身份验证中使用 JSON 类型的内容:

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:由角色绑定允许....

最新更新