如何让单个用户可以访问多个名称空间,并为每个名称空间使用单独的证书

问题描述 投票:1回答:1

我正在尝试为各种用户设置一些基本的授权和身份验证,以访问共享的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 rbac
1个回答
1
投票

Kubernetes中的CA是一个群集范围的CA(非命名空间),因此您将无法创建绑定到特定命名空间的证书。

system:authenticatedsystem:unauthenticated是Kubernetes的内置小组,以确定RoleClusterRole是否经过认证。而你can't directly manager groups or users in Kubernetes。您必须配置备用群集身份验证方法才能利用用户和组。例如,static token fileOpenID

然后,您可以将身份提供者中定义的用户或组限制为不允许他们创建另一个RoleRoleRoleBinding,这样他们就无法访问其他名称空间,只有集群管理员才能访问决定特定用户所属的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 TokenRoleBinding基于服务帐户。

© www.soinside.com 2019 - 2024. All rights reserved.