我在新创建的 Kubernetes 服务帐户中遇到了奇怪的行为。看来他们的令牌在我们的集群中提供了无限的访问权限。
如果我创建一个新的命名空间,在该命名空间内创建一个新的服务帐户,然后在新的 kube 配置中使用该服务帐户的令牌,我就能够在集群中执行所有操作。
# SERVER is the only variable you'll need to change to replicate on your own cluster
SERVER=https://k8s-api.example.com
NAMESPACE=test-namespace
SERVICE_ACCOUNT=test-sa
# Create a new namespace and service account
kubectl create namespace "${NAMESPACE}"
kubectl create serviceaccount -n "${NAMESPACE}" "${SERVICE_ACCOUNT}"
SECRET_NAME=$(kubectl get serviceaccount "${SERVICE_ACCOUNT}" --namespace=test-namespace -o jsonpath='{.secrets[*].name}')
CA=$(kubectl get secret -n "${NAMESPACE}" "${SECRET_NAME}" -o jsonpath='{.data.ca\.crt}')
TOKEN=$(kubectl get secret -n "${NAMESPACE}" "${SECRET_NAME}" -o jsonpath='{.data.token}' | base64 --decode)
# Create the config file using the certificate authority and token from the newly created
# service account
echo "
apiVersion: v1
kind: Config
clusters:
- name: test-cluster
cluster:
certificate-authority-data: ${CA}
server: ${SERVER}
contexts:
- name: test-context
context:
cluster: test-cluster
namespace: ${NAMESPACE}
user: ${SERVICE_ACCOUNT}
current-context: test-context
users:
- name: ${SERVICE_ACCOUNT}
user:
token: ${TOKEN}
" > config
将 ^ 作为 shell 脚本运行会产生config
在当前目录中。问题是,使用该文件,我可以读取和编辑集群中的所有资源。我希望新创建的服务帐户没有任何权限,除非我通过 RBAC 明确授予它们。
# All pods are shown, including kube-system pods
KUBECONFIG=./config kubectl get pods --all-namespaces
# And I can edit any of them
KUBECONFIG=./config kubectl edit pods -n kube-system some-pod
我没有向新创建的服务帐户添加任何角色绑定,因此我希望它能够收到所有访问被拒绝的响应kubectl
使用新生成的配置进行查询。
下面是嵌入在 test-sa 服务帐户的 JWT 的示例config
:
{
"iss": "kubernetes/serviceaccount",
"kubernetes.io/serviceaccount/namespace": "test-namespace",
"kubernetes.io/serviceaccount/secret.name": "test-sa-token-fpfb4",
"kubernetes.io/serviceaccount/service-account.name": "test-sa",
"kubernetes.io/serviceaccount/service-account.uid": "7d2ecd36-b709-4299-9ec9-b3a0d754c770",
"sub": "system:serviceaccount:test-namespace:test-sa"
}
需要考虑的事项...
- 据我所知,集群中似乎启用了 RBAC
rbac.authorization.k8s.io/v1
and
rbac.authorization.k8s.io/v1beta1
在输出中kubectl api-versions | grep rbac
如建议的这个帖子 https://stackoverflow.com/questions/51238988/how-to-check-whether-rbac-is-enabled-using-kubectl#51239531。值得注意的是kubectl cluster-info dump | grep authorization-mode
正如同一问题的另一个答案中所建议的,不显示输出。这是否表明 RBAC 实际上并未启用?
- 我的用户有
cluster-admin
角色权限,但我不希望这些权限继承到用它创建的服务帐户。
- 我们在 GKE 上运行集群。
- 据我所知,集群中没有任何非正统的 RBAC 角色或绑定会导致这种情况。我可能会遗漏某些内容,或者通常不知道会导致此问题的 K8s RBAC 配置。
我的假设是否正确,即新创建的服务帐户应该具有极其有限的集群访问权限,并且如果没有将许可的角色绑定附加到新服务帐户,则上述场景应该不可能实现?对这里发生的事情有什么想法,或者我可以限制 test-sa 的访问的方法吗?