我正在尝试为各种用户设置一些基本的授权和身份验证,以访问共享的K8s群集。
要求:多个用户可以访问多个名称空间,并为每个名称空间分别使用一组证书和密钥。
提案:
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不是特定于此命名空间的。如果我只是为不同命名空间中的同一用户创建另一个角色绑定,他将能够进行身份验证。我该如何防止这种情况发生?
Kubernetes中的CA是一个群集范围的CA(非命名空间),因此您将无法创建绑定到特定命名空间的证书。
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
基于服务帐户。