create
(создание);get
(получение);delete
(удаление);list
(просмотр списка);update
(обновление).Role
и ClusterRole
. Это просто наборы правил, представляющие набор разрешений. Role
может использоваться только для предоставления доступа к ресурсам внутри пространств имен. ClusterRole
может предоставлять те же разрешения, что и Role
, а также давать доступ к ресурсам, доступных в пределах всего кластера, и так называемым нересурсным endpoint'ам (вроде /healthz
— прим. перев.).Subjects
. Subject (субъект) — это сущность, которая будет выполнять операции в кластере. Ей могут являться пользователи, сервисы или даже группы.RoleBinding
и ClusterRoleBinding
. Как следует из названия, это просто привязка субъекта к Role или ClusterRole.view
: доступ только для чтения, исключает секреты;edit
: перечисленное выше + возможность редактировать большинство ресурсов, исключает роли и привязки ролей;admin
: перечисленное выше + возможность управлять ролями и привязками ролей на уровне пространств имен;cluster-admin
: все возможные привилегии.Roles
и ClusterRoles
, но мы рекомендуем максимально использовать роли, определенные по умолчанию, насколько это позволяет ситуация. Иначе во всем этом можно быстро запутаться.my-project-dev
и my-project-prod
, — а также двух пользователей: jean
и sarah
— с различными ролями в этих пространствах имен:Предполагается, что обычными пользователями управляет внешняя, независимая служба. В ее роли может выступать администратор, распределяющий закрытые ключи, хранилище пользователей вроде Keystone или Google Accounts, или даже файл со списком имен пользователей и паролей. В связи с этим в Kubernetes нет объектов, представляющих обычных пользователей. Обычных пользователей нельзя добавить в кластер через вызов API.
jean
):useradd jean && cd /home/jean
openssl genrsa -out jean.key 2048
CN
— имя пользователя, O
— группа. Можно устанавливать разрешения по группам. Это упростит работу, если, например, у вас много пользователей с одинаковыми полномочиями:# Без группы
openssl req -new -key jean.key \
-out jean.csr \
-subj "/CN=jean"
# С группой под названием $group
openssl req -new -key jean.key \
-out jean.csr \
-subj "/CN=jean/O=$group"
# Если пользователь входит в несколько групп
openssl req -new -key jean.key \
-out jean.csr \
-subj "/CN=jean/O=$group1/O=$group2/O=$group3"
/etc/kubernetes/pki
. Сертификат будет действителен в течение 500 дней:openssl x509 -req -in jean.csr \
-CA /etc/kubernetes/pki/ca.crt \
-CAkey /etc/kubernetes/pki/ca.key \
-CAcreateserial \
-out jean.crt -days 500
.certs
. В нем мы будем хранить открытый и закрытый ключи пользователя:mkdir .certs && mv jean.crt jean.key .certs
kubectl config set-credentials jean \
--client-certificate=/home/jean/.certs/jean.crt \
--client-key=/home/jean/.certs/jean.key
kubectl config set-context jean-context \
--cluster=kubernetes --user=jean
/etc/kubernetes
: переменные certificate-authority-data
и server
должны быть такими же, как в упомянутом файле:apiVersion: v1
clusters:
- cluster:
certificate-authority-data: {Сюда вставьте данные}
server: {Сюда вставьте данные}
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: jean
name: jean-context
current-context: jean-context
kind: Config
preferences: {}
users:
- name: jean
user:
client-certificate: /home/jean/.certs/jean.cert
client-key: /home/jean/.certs/jean.key
.kube
:mkdir .kube && vi .kube/config
chown -R jean: /home/jean/
jean
успешно создан. То же самое проделаем и для пользователя sarah
. Шагов довольно много, и на создание большого количества пользователей может уйти длительное время. Поэтому я написал Bash-скрипты, автоматизирующие процесс: их можно найти в репозитории на GitHub.kubeadm alpha kubeconfig user
.kubectl create namespace my-project-dev
kubectl create namespace my-project-prod
User: Jean
kubectl get nodes
Error from server (Forbidden): nodes is forbidden: User "jean" cannot list resource "nodes" in API group "" at the cluster scope
kubectl get pods -n default
Error from server (Forbidden): pods is forbidden: User "jean" cannot list resource "pods" in API group "" in the namespace "default"
kubectl get pods -n my-project-prod
Error from server (Forbidden): pods is forbidden: User "jean" cannot list resource "pods" in API group "" in the namespace "my-project-prod"
kubectl get pods -n my-project-dev
Error from server (Forbidden): pods is forbidden: User "jean" cannot list resource "pods" in API group "" in the namespace "my-project-dev"
User: Sarah
kubectl get nodes
Error from server (Forbidden): nodes is forbidden: User "sarah" cannot list resource "nodes" in API group "" at the cluster scope
kubectl get pods -n default
Error from server (Forbidden): pods is forbidden: User "sarah" cannot list resource "pods" in API group "" in the namespace "default"
kubectl get pods -n my-project-prod
Error from server (Forbidden): pods is forbidden: User "sarah" cannot list resource "pods" in API group "" in the namespace "my-project-prod"
kubectl get pods -n my-project-dev
Error from server (Forbidden): pods is forbidden: User "sarah" cannot list resource "pods" in API group "" in the namespace "my-project-dev"
ClusterRole
, доступный по умолчанию. Впрочем, также покажем, как создавать свои Role
и ClusterRole
. По сути Role
и ClusterRole
— это всего лишь набор действий (называемых как verbs
, т.е. дословно — «глаголов»), разрешенных для определенных ресурсов и пространств имен. Вот пример YAML-файла:apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
name: list-deployments
namespace: my-project-dev
rules:
- apiGroups: [ apps ]
resources: [ deployments ]
verbs: [ get, list ]
---------------------------------
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: list-deployments
rules:
- apiGroups: [ apps ]
resources: [ deployments ]
verbs: [ get, list ]
kubectl create -f /path/to/your/yaml/file
ClusterRole
по умолчанию (edit
и view
) к нашим пользователям следующим образом:jean
:edit
— в пространстве имен my-project-dev
;view
— в пространстве имен my-project-prod
;sarah
:edit
— в пространстве имен my-project-prod
.jean
мы создадим два RoleBinding'а. Пример YAML-файла, определяющего RoleBinding'и для jean
:apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: jean
namespace: my-project-dev
subjects:
- kind: User
name: jean
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: edit
apiGroup: rbac.authorization.k8s.io
---------------------------------
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: jean
namespace: my-project-prod
subjects:
- kind: User
name: jean
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: view
apiGroup: rbac.authorization.k8s.io
jean
просматривать (view
) my-project-prod
и редактировать (edit
) my-project-dev
. То же самое необходимо сделать с авторизациями для sarah
. Для их активации выполните команду:kubectl apply -f /path/to/your/yaml/file
kubectl apply
вместо kubectl create
. Разница между ними в том, что create
создает объект и больше ничего не делает, а apply
— не только создает объект (в случае, если его не существует), но и обновляет при необходимости.sarah
(edit
в my-project-prod
)my-project-prod
my-project-dev
(1) kubectl get pods -n my-project-prod
No resources found.
(2) kubectl run nginx --image=nginx --replicas=1 -n my-project-prod
deployment.apps/nginx created
(3) kubectl get pods -n my-project-prod
NAME READY STATUS RESTARTS AGE
nginx-7db9fccd9b-t14qw 1/1 Running 0 4s
(4) kubectl get pods -n my-project-dev
Error from server (Forbidden): pods is forbidden: User "sarah" cannot list resource "pods" in API group "" in the namespace "my-project-dev"
(5) kubectl run nginx --image=nginx --replicas=1 -n my-project-dev
Error from server (Forbidden): deployments.apps is forbidden: User "sarah" cannot create resource "deployments" in API group "apps" in the namespace "my-project-dev"
jean
(view
в my-project-prod
и edit
в my-project-dev
)my-project-prod
(1) kubectl get pods -n my-project-prod
NAME READY STATUS RESTARTS AGE
nginx-7db9fccd9b-t14qw 1/1 Running 0 101s
(2) kubectl get deploy -n my-project-prod
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 110s
(3) kubectl delete deploy/nginx -n my-project-prod
Error from server (Forbidden): deployments.extensions "nginx" is forbidden: User "jean" cannot delete resource "deployments" in API group "extensions" in the namespace "my-project-prod"
(4) kubectl get pods -n my-project-dev
No resources found.
(5) kubectl run nginx --image=nginx --replicas=1 -n my-project-dev
deployment.apps/nginx created
(6) kubectl get deploy -n my-project-dev
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 0/1 1 0 13s
(7) kubectl delete deploy/nginx -n my-project-dev
deployment.extensions "nginx" deleted
(8) kubectl get deploy -n my-project-dev
No resources found.
kubectl auth can-i
позволяет выяснить, может ли пользователь выполнить определенное действие:# kubectl auth can-i $action $resource --as $subject
(1) kubectl auth can-i list pods
(2) kubectl auth can-i list pods --as jean
wget https://dl.google.com/go/go1.12.5.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.12.5.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
set -x; cd "$(mktemp -d)" &&
curl -fsSLO "https://storage.googleapis.com/krew/v0.2.1/krew.{tar.gz,yaml}" &&
tar zxvf krew.tar.gz &&
./krew-"$(uname | tr '[:upper:]' '[:lower:]')_amd64" install \
--manifest=krew.yaml --archive=krew.tar.gz
export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
jean
. Прежде всего давайте установим его:kubectl krew install access-matrix
kubectl access-matrix -n my-project-dev --as jean
go get -v github.com/aquasecurity/kubectl-who-can
kubectl-who-can list pods -n default
No subjects found with permissions to list pods assigned through RoleBindings
CLUSTERROLEBINDING SUBJECT TYPE SA-NAMESPACE
cluster-admin system:masters Group
rbac-manager rbac-manager ServiceAccount rbac-manager
system:controller:attachdetach-controller attachdetach-controller ServiceAccount kube-system
system:controller:clusterrole-aggregation-controller clusterrole-aggregation-controller ServiceAccount kube-system
system:controller:cronjob-controller cronjob-controller ServiceAccount kube-system
system:controller:daemon-set-controller daemon-set-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:horizontal-pod-autoscaler horizontal-pod-autoscaler ServiceAccount kube-system
system:controller:job-controller job-controller ServiceAccount kube-system
system:controller:namespace-controller namespace-controller ServiceAccount kube-system
system:controller:node-controller node-controller ServiceAccount kube-system
system:controller:persistent-volume-binder persistent-volume-binder ServiceAccount kube-system
system:controller:pod-garbage-collector pod-garbage-collector ServiceAccount kube-system
system:controller:pvc-protection-controller pvc-protection-controller ServiceAccount kube-system
system:controller:replicaset-controller replicaset-controller ServiceAccount kube-system
system:controller:replication-controller replication-controller ServiceAccount kube-system
system:controller:resourcequota-controller resourcequota-controller ServiceAccount kube-system
system:controller:statefulset-controller statefulset-controller ServiceAccount kube-system
system:coredns coredns ServiceAccount kube-system
system:kube-controller-manager system:kube-controller-manager User
system:kube-scheduler system:kube-scheduler User
jean
и sarah
?», «В какую роль входят все пользователи?», «В какую роль входит вся группа?». Для установки выполните команду:kubectl krew install rbac-lookup
kubectl-rbac_lookup jean
SUBJECT SCOPE ROLE
jean my-project-dev ClusterRole/edit
jean my-project-prod ClusterRole/view
kubectl-rbac_lookup sarah
SUBJECT SCOPE ROLE
sarah my-project-prod ClusterRole/edit
kubectl-rbac_lookup --kind user
SUBJECT SCOPE ROLE
jean my-project-dev ClusterRole/edit
jean my-project-prod ClusterRole/view
sarah my-project-prod ClusterRole/edit
system:anonymous kube-public Role/kubeadm:bootstrap-signer-clusterinfo
system:kube-controller-manager kube-system Role/extension-apiserver-authentication-reader
system:kube-controller-manager kube-system Role/system::leader-locking-kube-controller-manager
system:kube-controller-manager cluster-wide ClusterRole/system:kube-controller-manager
system:kube-proxy cluster-wide ClusterRole/system:node-proxier
system:kube-scheduler kube-system Role/extension-apiserver-authentication-reader
system:kube-scheduler kube-system Role/system::leader-locking-kube-scheduler
system:kube-scheduler cluster-wide ClusterRole/system:kube-scheduler
system:kube-scheduler cluster-wide ClusterRole/system:volume-scheduler
kubectl-rbac_lookup --kind group
SUBJECT SCOPE ROLE
system:authenticated cluster-wide ClusterRole/system:basic-user
system:authenticated cluster-wide ClusterRole/system:discovery
system:authenticated cluster-wide ClusterRole/system:public-info-viewer
system:bootstrappers:kubeadm:default-node-token cluster-wide ClusterRole/system:node-bootstrapper
system:bootstrappers:kubeadm:default-node-token cluster-wide ClusterRole/system:certificates.k8s.io:certificatesigningrequests:nodeclient
system:bootstrappers:kubeadm:default-node-token kube-system Role/kube-proxy
system:bootstrappers:kubeadm:default-node-token kube-system Role/kubeadm:kubelet-config-1.14
system:bootstrappers:kubeadm:default-node-token kube-system Role/kubeadm:nodes-kubeadm-config
system:masters cluster-wide ClusterRole/cluster-admin
system:nodes kube-system Role/kubeadm:kubelet-config-1.14
system:nodes kube-system Role/kubeadm:nodes-kubeadm-config
system:nodes cluster-wide ClusterRole/system:certificates.k8s.io:certificatesigningrequests:selfnodeclient
system:unauthenticated cluster-wide ClusterRole/system:public-info-viewer
kubectl apply -f /path/to/rbac/manager/yaml/file
apiVersion: rbacmanager.reactiveops.io/v1beta1
kind: RBACDefinition
metadata:
name: jose
rbacBindings:
- name: jose
subjects:
- kind: User
name: jose
roleBindings:
- namespace: my-project-prod
clusterRole: edit
- namespace: my-project-dev
clusterRole: edit
К сожалению, не доступен сервер mySQL