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

时间:2019-03-28 17:46:04

标签: kubernetes rbac

我正在尝试为各种用户设置一些基本的授权和身份验证,以访问共享的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并非特定于此命名空间。 如果我只是在不同名称空间中为同一用户创建另一个角色绑定,则他将能够进行身份验证。如何防止这种情况发生?

1 个答案:

答案 0 :(得分:1)

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

system:authenticatedsystem:unauthenticated是Kubernetes中的内置组,用于标识RoleClusterRole是否已通过身份验证。然后您can't directly manager groups or users in Kubernetes。您将必须配置替代的群集身份验证方法以利用用户和组。例如,static token fileOpenID

然后,您可以将身份提供者中定义的用户或组限制为Role,该用户或组不允许他们创建另一个RoleRoleBinding,这样他们就不能能够授予自己访问其他命名空间的权限,只有集群管理员才能确定特定用户属于哪个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"]

另一种选择是根据RoleBindingService Account Token限制为服务帐户。