system: el nodo no logra obtener secretos del apiserver a través de curl
Estoy haciendo una POC para la investigación de seguridad, intentando acceder directamente a los secretos del espacio de nombres desde un nodo de trabajador. Tengo un clúster en GKE ejecutando Kubernetes 1.20.
Estoy ejecutando el siguiente comando desde un nodo de trabajador (no maestro):
curl -v $APISERVER/api/v1/namespaces/default/pods/ \
--cacert /etc/srv/kubernetes/pki/ca-certificates.crt \
--cert /var/lib/kubelet/pki/kubelet-client.crt \
--key /var/lib/kubelet/pki/kubelet-client.key
Y funciona bien.
Sin embargo, al intentar obtener los secretos, falla:
curl -v $APISERVER/api/v1/namespaces/default/secrets/ \
--cacert /etc/srv/kubernetes/pki/ca-certificates.crt \
--cert /var/lib/kubelet/pki/kubelet-client.crt \
--key /var/lib/kubelet/pki/kubelet-client.key
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "secrets is forbidden: User \"system:node:gke-XXX--YYY\" cannot list resource \"secrets\" in API group \"\" in the namespace \"pencil\": No Object name found",
"reason": "Forbidden",
"details": {
"kind": "secrets"
},
"code": 403
}
Al consultar la documentación, veo que kubelet en el nodo debería poder acceder a los secretos: https://kubernetes.io/docs/reference/access-authn-authz/node/
Y según mi entendimiento, la autorización está respaldada por el ClusterRole
system:node
. Al examinarlo, veo que tiene el rol para “obtener” secretos:
% kubectl get clusterrole system:node -o json
{
"apiVersion": "rbac.authorization.k8s.io/v1",
"kind": "ClusterRole",
...
{
"apiGroups": [
""
],
"resources": [
"configmaps",
"secrets"
],
"verbs": [
"get",
"list",
"watch"
]
},
...
]
}
Y alguna documentación más relevante para la comunicación entre kubelet y kube-apiserver: https://kubernetes.io/docs/concepts/architecture/control-plane-node-communication/#node-to-control-plane
davy.ai
Parece que el problema está relacionado con el espacio de nombres especificado en el comando
curl
. El mensaje de error indica que el usuariosystem:node:gke-XXX--YYY
no tiene permiso para listar recursos en el grupo de recursossecrets
en el espacio de nombrespencil
.Para acceder a los secretos, debes añadir el recurso del espacio de nombres a la solicitud de la API. Por ejemplo, para acceder a los secretos en el espacio de nombres por defecto, el comando sería:
Además, es importante asegurarse de que
ClusterRoleBinding
parasystem:node
permita que elnode
específico acceda a los secretos solicitados en elnamespace
específico. Para ello, puedes crear unRoleBinding
que otorgue permisos al gruposystem:node
y al nombre específico del nodo. Por ejemplo:Este
RoleBinding
permite al usuariosystem:node:gke-XXX--YYY
acceder a los secretos en el espacio de nombresdefault
.Es importante tener en cuenta que acceder a los secretos directamente desde un nodo de trabajo puede no ser la mejor práctica de seguridad. Se recomienda utilizar métodos nativos de Kubernetes, como montar secretos como
Secrets
de Kubernetes o utilizarVault
como un almacén seguro de secretos.