我正在尝试为各种用户设置一些基本的授权和身份验证以访问共享的 K8s 集群。
要求:多个用户可以使用一组单独的证书和 key 访问多个命名空间。
提议:
openssl genrsa -out $PRIV_KEY 2048
# Generate CSR
openssl req -new -key $PRIV_KEY -out $CSR -subj "/CN=$USER"
# Create k8s CSR
K8S_CSR=user-request-$USER-$NAMESPACE_NAME-admin
cat <<EOF >./$K8S_CSR.yaml
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: $K8S_CSR
spec:
groups:
- system:authenticated
request: $(cat $CSR | base64 | tr -d '\n')
usages:
- digital signature
- key encipherment
- client auth
EOF
kubectl create -n $NAMESPACE_NAME -f $K8S_CSR.yaml
# Approve K8s CSR
kubectl certificate approve $K8S_CSR
# Fetch User Certificate
kubectl get csr $K8S_CSR -o jsonpath='{.status.certificate}' | base64 -d > $USER-$NAMESPACE_NAME-admin.crt
# Create Admin Role Binding
kubectl create rolebinding $NAMESPACE_NAME-$USER-admin-binding --clusterrole=admin --user=$USER --namespace=$NAMESPACE_NAME
问题:
用户 cert 和/或 pkey 不特定于此命名空间。
如果我只是在不同的命名空间中为同一用户创建另一个角色绑定(bind),他将能够进行身份验证。我该如何防止这种情况发生?
最佳答案
Kubernetes 中的 CA 是集群范围的 CA(未命名空间),因此您将无法创建绑定(bind)到特定命名空间的证书。system:authenticated
和 system:unauthenticated
是 Kubernetes 中的内置组,用于识别 Role
或 ClusterRole
已通过身份验证。而你 can't directly manager groups or users in Kubernetes .您必须配置替代集群身份验证方法以利用用户和组。例如,static token file或 OpenID
然后,您可以将身份提供程序中定义的用户或组限制为 Role
这不允许他们创建另一个 Role
或 RoleBinding
,这样他们就无法让自己访问其他命名空间,只有集群管理员才能决定使用哪个 RoleBindings
特定用户所属的(或命名空间)。
例如,在您的 Role
:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: mynamespace
name: myrole
rules:
- apiGroups: ["extensions", "apps"]
resources: ["deployments"] <== never include role, clusterrole, rolebinding, and clusterrolebinding.
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
另一种选择是限制基于 Service Account Token通过
RoleBinding
到服务帐户。
关于kubernetes - 如何让单个用户访问多个命名空间,每个命名空间都有单独的证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55403927/