kubernetes - 如何让单个用户访问多个命名空间,每个命名空间都有单独的证书

标签 kubernetes rbac

我正在尝试为各种用户设置一些基本的授权和身份验证以访问共享的 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:authenticatedsystem:unauthenticated是 Kubernetes 中的内置组,用于识别 RoleClusterRole已通过身份验证。而你 can't directly manager groups or users in Kubernetes .您必须配置替代集群身份验证方法以利用用户和组。例如,static token fileOpenID

然后,您可以将身份提供程序中定义的用户或组限制为 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/

相关文章:

kubernetes - helm install istio 返回禁止错误

kubernetes - Minikube:尝试创建特权容器时,Restricted PodSecurityPolicy 不受限制

kubernetes - 具有扩展权限的 K8s RBAC 服务帐户

docker - Kubernetes 负载均衡器外部 IP 待定

Kubernetes 容器环境

docker - 无法使用 NodePort 服务从另一个 pod 访问 pod

kubernetes - 通过 Kubernetes 服务的基本网络在 Minikube 中不起作用

php - 有没有办法用 yii\rbac\PhpManager 刷新 Yii2 中缓存的 rbac 项?

azure - 如何在 Azure 中为另一个租户中的用户使用 RBAC

Kubernetes RBAC cluster-admin 无密读权限