Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Setting authorization mode to RBAC by default #1904

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions pkg/localkube/apiserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ func StartAPIServer(lk LocalkubeServer) func() error {

config.Authentication.ClientCert.ClientCA = lk.GetCAPublicKeyCertPath()

config.Authorization.Mode = "RBAC"

config.SecureServing.ServerCert.CertKey.CertFile = lk.GetPublicKeyCertPath()
config.SecureServing.ServerCert.CertKey.KeyFile = lk.GetPrivateKeyCertPath()
config.Admission.PluginNames = []string{
Expand Down
7 changes: 7 additions & 0 deletions pkg/minikube/bootstrapper/localkube/localkube.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package localkube
import (
"fmt"
"strings"
"time"

"k8s.io/minikube/pkg/minikube/assets"
"k8s.io/minikube/pkg/minikube/bootstrapper"
Expand All @@ -29,6 +30,7 @@ import (
"github.com/docker/machine/libmachine"
"github.com/docker/machine/libmachine/state"
"github.com/pkg/errors"
"k8s.io/minikube/pkg/util"
)

type LocalkubeBootstrapper struct {
Expand Down Expand Up @@ -97,6 +99,11 @@ func (lk *LocalkubeBootstrapper) StartCluster(kubernetesConfig bootstrapper.Kube
if err != nil {
return errors.Wrapf(err, "Error running ssh command: %s", startCommand)
}
// try to elevate kube-system privileges so that the dashboard (among other
// components) can execute queries
if err := util.RetryAfter(100, elevateKubeSystemPrivileges, time.Millisecond*500); err != nil {
return errors.Wrap(err, "timed out waiting to elevate kube-system RBAC privileges")
}
return nil
}

Expand Down
37 changes: 37 additions & 0 deletions pkg/minikube/bootstrapper/localkube/privileges.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package localkube

import (
"github.com/pkg/errors"
"k8s.io/apimachinery/pkg/apis/meta/v1"
rbacv1beta1 "k8s.io/client-go/pkg/apis/rbac/v1beta1"
"k8s.io/minikube/pkg/minikube/service"
)

func elevateKubeSystemPrivileges() error {
k8s := service.K8sClientGetter{}
client, err := k8s.GetRBACV1Beta1Client()
if err != nil {
return err
}
clusterRoleBinding := &rbacv1beta1.ClusterRoleBinding{
ObjectMeta: v1.ObjectMeta{
Name: "minikube-rbac",
},
Subjects: []rbacv1beta1.Subject{
{
Kind: "ServiceAccount",
Name: "default",
Namespace: "kube-system",
},
},
RoleRef: rbacv1beta1.RoleRef{
Kind: "ClusterRole",
Name: "cluster-admin",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct me if i'm wrong, but I believe most RBAC-enabled clusters are not setup to give the kube-system:default service account cluster-admin privileges. Is it maybe safer to grant these privileges in the addons and services that need them, or perhaps create a new minikube-default service account to use in pods that would only exist in minikube?

},
}

if _, err := client.ClusterRoleBindings().Create(clusterRoleBinding); err != nil {
return errors.Wrap(err, "creating clusterrolebinding")
}
return nil
}
27 changes: 25 additions & 2 deletions pkg/minikube/service/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import (
meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
rbacv1beta1typed "k8s.io/client-go/kubernetes/typed/rbac/v1beta1"
"k8s.io/client-go/pkg/api/v1"
"k8s.io/client-go/tools/clientcmd"

Expand All @@ -52,7 +53,9 @@ func init() {
k8s = &K8sClientGetter{}
}

func (*K8sClientGetter) GetCoreClient() (corev1.CoreV1Interface, error) {
// getClientset returns the root Kubernetes Clientset from the default loaded
// configuration
func (*K8sClientGetter) getClientset() (*kubernetes.Clientset, error) {
loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
configOverrides := &clientcmd.ConfigOverrides{}
kubeConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, configOverrides)
Expand All @@ -64,7 +67,27 @@ func (*K8sClientGetter) GetCoreClient() (corev1.CoreV1Interface, error) {
if err != nil {
return nil, errors.Wrap(err, "Error creating new client from kubeConfig.ClientConfig()")
}
return client.Core(), nil
return client, nil
}

// GetRBACV1Beta1Client returns an RbacV1beta1Interface from the default Kubernetes
// Clientset
func (k *K8sClientGetter) GetRBACV1Beta1Client() (rbacv1beta1typed.RbacV1beta1Interface, error) {
clientset, err := k.getClientset()
if err != nil {
return nil, err
}
return clientset.RbacV1beta1(), nil
}

// GetCoreClient returns a CoreV1Interface from the default Kubernetes
// Clientset
func (k *K8sClientGetter) GetCoreClient() (corev1.CoreV1Interface, error) {
clientset, err := k.getClientset()
if err != nil {
return nil, err
}
return clientset.Core(), nil
}

type ServiceURL struct {
Expand Down