我正在尝试为各种用户设置一些基本的授权和身份验证,以访问共享的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并非特定于此命名空间。 如果我只是在不同名称空间中为同一用户创建另一个角色绑定,则他将能够进行身份验证。如何防止这种情况发生?
答案 0 :(得分:1)
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"]
另一种选择是根据RoleBinding
将Service Account Token限制为服务帐户。