Управлять кластером Kubernetes с одним пользователем просто.
Когда вы выходите за пределы одного пользователя, вам нужно начать использовать управление доступом на основе ролей (RBAC).
В прошлом я несколько раз углублялся в эту тему, рассказывая о том, как создать пользовательскую изолированную среду Kubernetes в Docker Enterprise
Но как только вы выйдете за пределы пары пользователей и / или команд и нескольких пространств имен для них, вам быстро станет трудно отследить, кто может что делать и где.
И со временем, и все больше и больше людей принимают участие в настройке вашего RBAC, это может стать еще более запутанным.
Вы должны иметь свои определения ресурсов RBAC в управлении исходным кодом, но их нелегко прочитать и сложно визуализировать.
Поробуйте плагин с открытым исходным кодом who-can kubectl от Aqua Security.
Он дает вам возможность показать, кто (субъекты) может делать, что (действия), c чем (ресурсы) и где (пространства имен).
Установите менеджер плагинов Krew
Для плагина who-can для kubectl требуется менеджер плагинов krew.
Если у вас еще не установлен krew, инструкции по его установке можно найти в его репозитории GitHub, https://github.com/kubernetes-sigs/krew/.
Чтобы убедиться, что он установлен правильно, вы можете получить список доступных плагинов от kubectl.
$ kubectl plugin list
The following kubectl-compatible plugins are available:
/home/ken.rider/.krew/bin/kubectl-krew
Установите плагин Who-Can
Если у вас есть менеджер плагинов krew для kubectl, установить плагин who-can довольно легко.
$ kubectl krew install who-can
Настройка RBAC для нашего кластера
У меня есть кластер Kubernetes, который я собрал в Azure с помощью Docker Enterprise.
Существует 3 (не по умолчанию) пространства имен для разработки, тестирования и производства.
У меня также есть команды для разработки, тестирования, эксплуатации и безопасности, которые я создал как администратор кластера.
Я определил набор RoleBindings для каждого из них.
$ kubectl apply -f development-namespace.yaml
namespace/development created
rolebinding.rbac.authorization.k8s.io/dev-team:development-edit created
rolebinding.rbac.authorization.k8s.io/test-team:development-view created
rolebinding.rbac.authorization.k8s.io/ops-team:development-admin created
rolebinding.rbac.authorization.k8s.io/sec-team:development-view created
$ kubectl apply -f test-namespace.yaml
namespace/test created
rolebinding.rbac.authorization.k8s.io/dev-team:test-view created
rolebinding.rbac.authorization.k8s.io/test-team:test-edit created
rolebinding.rbac.authorization.k8s.io/ops-team:test-admin created
rolebinding.rbac.authorization.k8s.io/sec-team:test-view created
$ kubectl apply -f production-namespace.yaml
namespace/production created
rolebinding.rbac.authorization.k8s.io/dev-team:production-view created
rolebinding.rbac.authorization.k8s.io/test-team:production-view created
rolebinding.rbac.authorization.k8s.io/ops-team:production-admin created
rolebinding.rbac.authorization.k8s.io/sec-team:production-view created
Использование who-can
После того, как вы установили who-can, вы увидите, что его использование будет очень простым.
$ kubectl kubectl who-can VERB (TYPE | TYPE/NAME | NONRESOURCEURL) [flags]
Типичный набор действий, которые могут вас заинтересовать, это get
list
watch
create
update
patch
delete
.
Есть еще несколько других действий для определенных типов ресурсов, но, как правило, вы будете наиболее заинтересованы в get
create
delete
.
Типичный набор типов ресурсов, которые могут вас заинтересовать, включают pods
deployments
services
persistentvolumeclaims
configmaps
secrets
Кроме того, с постоянно расширяющимся использованием CustomResourceDefinitions, список типов ресурсов не является бесконечным.
Пример использование Who-Can
Давайте сначала спросим: «Кто может увидеть поды в пространстве имен development?»
$ kubectl who-can get pods -n development
ROLEBINDING NAMESPACE SUBJECT TYPE SA-NAMESPACE
dev-team:development-edit development dev-team Group
ops-team:development-admin development ops-team Group
sec-team:development-view development sec-team Group
test-team:development-view development test-team Group
CLUSTERROLEBINDING SUBJECT TYPE SA-NAMESPACE
cluster-admin system:masters Group
compose compose ServiceAccount kube-system
compose-auth-view compose ServiceAccount kube-system
system:controller:clusterrole-aggregation-controller clusterrole-aggregation-controller ServiceAccount kube-system
system:controller:deployment-controller deployment-controller ServiceAccount kube-system
system:controller:endpoint-controller endpoint-controller ServiceAccount kube-system
system:controller:generic-garbage-collector generic-garbage-collector ServiceAccount kube-system
system:controller:namespace-controller namespace-controller ServiceAccount kube-system
system:controller:persistent-volume-binder persistent-volume-binder ServiceAccount kube-system
system:controller:pvc-protection-controller pvc-protection-controller ServiceAccount kube-system
system:controller:statefulset-controller statefulset-controller ServiceAccount kube-system
system:kube-scheduler system:kube-scheduler User
tiller tiller ServiceAccount kube-system
ucp-kube-system:cni-plugin:cluster-admin cni-plugin ServiceAccount kube-system
ucp-kube-system:kube-dns:cluster-admin kube-dns ServiceAccount kube-system
ucp-kube-system:ucp-metrics:cluster-admin ucp-metrics ServiceAccount kube-system
Теперь давайте спросим: «Кто может создавать поды в пространстве имен development?».
Здесь мы увидим, что только наши группы development и operations могут создавать там поды.
И список учетных записей системных служб короче:
$ kubectl who-can create pods -n development
ROLEBINDING NAMESPACE SUBJECT TYPE SA-NAMESPACE
dev-team:development-edit development dev-team Group
ops-team:development-admin development ops-team Group
CLUSTERROLEBINDING SUBJECT TYPE SA-NAMESPACE
cluster-admin system:masters Group
system:controller:clusterrole-aggregation-controller clusterrole-aggregation-controller ServiceAccount kube-system
system:controller:daemon-set-controller daemon-set-controller ServiceAccount kube-system
system:controller:job-controller job-controller ServiceAccount kube-system
system:controller:persistent-volume-binder persistent-volume-binder ServiceAccount kube-system
system:controller:replicaset-controller replicaset-controller ServiceAccount kube-system
system:controller:replication-controller replication-controller ServiceAccount kube-system
system:controller:statefulset-controller statefulset-controller ServiceAccount kube-system
tiller tiller ServiceAccount kube-system
ucp-kube-system:cni-plugin:cluster-admin cni-plugin ServiceAccount kube-system
ucp-kube-system:kube-dns:cluster-admin kube-dns ServiceAccount kube-system
ucp-kube-system:ucp-metrics:cluster-admin ucp-metrics ServiceAccount kube-system
$ kubectl who-can update '*' -n development
No subjects found with permissions to update * assigned through RoleBindings
CLUSTERROLEBINDING SUBJECT TYPE SA-NAMESPACE
cluster-admin system:masters Group
system:controller:clusterrole-aggregation-controller clusterrole-aggregation-controller ServiceAccount kube-system
system:controller:generic-garbage-collector generic-garbage-collector ServiceAccount kube-system
tiller tiller ServiceAccount kube-system
ucp-kube-system:cni-plugin:cluster-admin cni-plugin ServiceAccount kube-system
ucp-kube-system:kube-dns:cluster-admin kube-dns ServiceAccount kube-system
ucp-kube-system:ucp-metrics:cluster-admin ucp-metrics ServiceAccount kube-system
$ kubectl who-can delete services -n production
ROLEBINDING NAMESPACE SUBJECT TYPE SA-NAMESPACE
ops-team:production-admin production ops-team Group
CLUSTERROLEBINDING SUBJECT TYPE SA-NAMESPACE
cluster-admin system:masters Group
system:controller:clusterrole-aggregation-controller clusterrole-aggregation-controller ServiceAccount kube-system
system:controller:generic-garbage-collector generic-garbage-collector ServiceAccount kube-system
system:controller:namespace-controller namespace-controller ServiceAccount kube-system
system:controller:persistent-volume-binder persistent-volume-binder ServiceAccount kube-system
tiller tiller ServiceAccount kube-system
ucp-kube-system:cni-plugin:cluster-admin cni-plugin ServiceAccount kube-system
ucp-kube-system:kube-dns:cluster-admin kube-dns ServiceAccount kube-system
ucp-kube-system:ucp-metrics:cluster-admin ucp-metrics ServiceAccount kube-system
Резюме
Плагин who-can kubectl от Aqua Security – действительно полезная утилита для вашего набора инструментов Kubernetes.
Настройка контроллера доступа на основе ролей для вашего кластера Kubernetes чрезвычайно важна, но также различна для каждого пользователя.