diff --git a/tool/tsh/common/kube.go b/tool/tsh/common/kube.go index 0141046c9b6fb..1eef564c847b6 100644 --- a/tool/tsh/common/kube.go +++ b/tool/tsh/common/kube.go @@ -788,7 +788,18 @@ func (c *kubeCredentialsCommand) issueCert(cf *CLIConf) error { // via the RBAC rules, but we also need to make sure that the user has // access to the cluster with at least one kubernetes_user or kubernetes_group // defined. - if err := checkIfCertsAreAllowedToAccessCluster(k, c.kubeCluster); err != nil { + // This is a safety check in order to print a better message to the user even + // before hitting Teleport Kubernetes Proxy. + // We only enforce this check for root clusters, since we don't have knowledge + // of the RBAC role mappings for remote clusters. + rootClusterName, err := tc.RootClusterName(cf.Context) + if err != nil { + return trace.Wrap(err) + } + if err := checkIfCertsAreAllowedToAccessCluster(k, + rootClusterName, + c.teleportCluster, + c.kubeCluster); err != nil { return trace.Wrap(err) } // Cache the new cert on disk for reuse. @@ -819,7 +830,14 @@ func (c *kubeCredentialsCommand) checkLocalProxyRequirement(profile *profile.Pro // defined. If not, it returns an error. // This is a safety check in order to print a better message to the user even // before hitting Teleport Kubernetes Proxy. -func checkIfCertsAreAllowedToAccessCluster(k *client.Key, kubeCluster string) error { +func checkIfCertsAreAllowedToAccessCluster(k *client.Key, rootCluster, teleportCluster, kubeCluster string) error { + // This is a safety check in order to print a better message to the user even + // before hitting Teleport Kubernetes Proxy. + // We only enforce this check for root clusters, since we don't have knowledge + // of the RBAC role mappings for remote clusters. + if rootCluster != teleportCluster { + return nil + } for k8sCluster, cert := range k.KubeTLSCerts { if k8sCluster != kubeCluster { continue diff --git a/tool/tsh/common/kube_proxy.go b/tool/tsh/common/kube_proxy.go index 8eed002742e2c..1fb6d34430a27 100644 --- a/tool/tsh/common/kube_proxy.go +++ b/tool/tsh/common/kube_proxy.go @@ -491,7 +491,20 @@ func issueKubeCert(ctx context.Context, tc *client.TeleportClient, proxy *client return tls.Certificate{}, trace.Wrap(err) } - if err := checkIfCertsAreAllowedToAccessCluster(key, kubeCluster); err != nil { + // Make sure the cert is allowed to access the cluster. + // At this point we already know that the user has access to the cluster + // via the RBAC rules, but we also need to make sure that the user has + // access to the cluster with at least one kubernetes_user or kubernetes_group + // defined. + rootClusterName, err := tc.RootClusterName(ctx) + if err != nil { + return tls.Certificate{}, trace.Wrap(err) + } + if err := checkIfCertsAreAllowedToAccessCluster( + key, + rootClusterName, + teleportCluster, + kubeCluster); err != nil { return tls.Certificate{}, trace.Wrap(err) }