Управление доступом в Kubernetes
Реклама
 Kubernetes — это решение, превращающее Linux сервера в кластер, и, как Linux является многопользовательской, многозадачной операционной системой, так и Kubernetes позволяет множеству пользователей и приложений работать в одном кластере безопасно разделяя его ресурсы
 
 На нашем вебинаре Вы узнаете как настраивать права доступа в Kubernetes на примерах практических, полезных задач
 
 
Техническое задание
 Создать учетную запись пользователя с необходимыми правами и файл конфигурации для подключения младшего системного администратора к Web ресурсам Kubernetes
 
 Создать учтённую запись для сервиса с необходимыми правами для запуска приложений в Kubernetes
 
 
Запись вебинара
Подготовка к вебинару
user1@client1:~$ rm user1*
user1@client1:~$ rm -r .kube/
kube1:~# rm -r users/
 
Шаг 1. Что у нас есть, для начала
 Cloud native distributed block storage for Kubernetes 
longhorn 
 
- 
 
- 
 
 
Шаг 2. Создание учетной записи
Вариант 2.1 Использование сертификатов
user1@client1:~$ cat user1.req | base64 -w0
kube1:~/users# kubectl explain csr.spec.usages
kube1:~/users# cat user1.req.yaml
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: user1
spec:
  request: LS0t...S0tCg==
  signerName: kubernetes.io/kube-apiserver-client
  expirationSeconds: 8640000  # 100 * one day
  usages:
#  - digital signature
#  - key encipherment
  - client auth
kube1:~/users# kubectl apply -f user1.req.yaml
kube1:~/users# kubectl describe csr/user1
kube1:~/users# kubectl certificate approve user1
kube1:~/users# kubectl get csr
kube1:~/users# kubectl get csr/user1 -o yaml
kube1:~/users# kubectl get csr/user1 -o jsonpath="{.status.certificate}" | base64 -d | tee user1.crt
user1@client1:~$ scp root@kube1:users/user1.crt .
 
Вариант 2.2 Использование ServiceAccount
Шаг 2.3 Создание файла конфигурации kubectl
user1@client1:~$ kubectl config set-cluster cluster.local --insecure-skip-tls-verify=true --server=https://192.168.13.221:6443
  ИЛИ
root@my-debian:~# kubectl config set-cluster cluster.local --certificate-authority=/run/secrets/kubernetes.io/serviceaccount/ca.crt
user1@client1:~$ cat .kube/config
user1@client1:~$ kubectl config set-credentials user1 --client-certificate=user1.crt --client-key=user1.key --embed-certs=true
  ИЛИ
user1@client1:~$ kubectl config set-credentials user1 --token=...................................
  ИЛИ
root@my-debian:~# kubectl config set-credentials user1 --token=$(cat /run/secrets/kubernetes.io/serviceaccount/token)
user1@client1:~$ kubectl config get-users
user1@client1:~$ kubectl config set-context default-context --cluster=cluster.local --user=user1
user1@client1:~$ kubectl config use-context default-context
user1@client1:~$ kubectl auth whoami
user1@client1:~$ kubectl get pods
Error from server (Forbidden) или ...
 
Шаг 3. Использование Role и RoleBinding
Предоставление доступа к services/proxy в Namespace
 Cloud native distributed block storage for Kubernetes 
longhorn 
 
kube1:~# kubectl api-resources -o wide | less
APIVERSION = <group> + "/" + <version of the API>
kube1:~/users# cat lh-svc-proxy-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: longhorn-system
  name: lh-svc-proxy-role
rules:
- apiGroups: [""]
  resources: ["services/proxy"]
  verbs: ["get"]
kube1:~/users# cat user1-lh-svc-proxy-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: user1-lh-svc-proxy-rolebinding
  namespace: longhorn-system
subjects:
- kind: User
  name: user1
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: lh-svc-proxy-role
  apiGroup: rbac.authorization.k8s.io
kube1:~/users# kubectl apply -f lh-svc-proxy-role.yaml,user1-lh-svc-proxy-rolebinding.yaml
student@client1:~$ kubectl proxy
student@client1:~$ curl http://localhost:8001/api/v1/namespaces/longhorn-system/services/longhorn-frontend:80/proxy/
student@client1:~$ curl http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
kube1:~/users# kubectl delete -f lh-svc-proxy-role.yaml,user1-lh-svc-proxy-rolebinding.yaml
 
Предоставление полного доступа к Namespace
kube1:~/users# cat ns-full-access.yaml
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: ns-full-access
  namespace: my-ns
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["*"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: ns-full-access-rolebinding
  namespace: my-ns
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: cko
  #kind: User
  #name: user1
roleRef:
  kind: Role
  name: ns-full-access
  apiGroup: rbac.authorization.k8s.io
#roleRef:
  #apiGroup: rbac.authorization.k8s.io
  #kind: ClusterRole
  #name: admin
kube1:~/users# kubectl apply -f ns-full-access.yaml
 
Поиск предоставленных ролей для учетной записи
kube1:~/users# kubectl get rolebindings --all-namespaces -o=json | jq '.items[] | select(.subjects[]?.name == "user1")'
kube1:~/users# kubectl get rolebindings --all-namespaces -o=json | jq '.items[] | select(.subjects[]?.name == "cko")'
kube1:~/users# kubectl delete -f ns-full-access.yaml
 
Шаг 4. Использование ClusterRole и ClusterRoleBinding
Предоставление доступа к services/port-forward в Cluster
kube1:~/users# cat svc-pfw-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
#kind: Role
metadata:
  name: svc-pfw-role
#  namespace: my-pgcluster-ns
rules:
- apiGroups: [""]
  resources: ["services"]
  verbs: ["get"]
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]
- apiGroups: [""]
  resources: ["pods/portforward"]
  verbs: ["create"]
kube1:~/users# cat user1-svc-pfw-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
#kind: RoleBinding
metadata:
  name: user1-svc-pfw-rolebinding
#  namespace: my-pgcluster-ns
subjects:
- kind: User
  name: user1
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
#  kind: Role
  name: svc-pfw-role
  apiGroup: rbac.authorization.k8s.io
kube1:~/users# kubectl apply -f svc-pfw-role.yaml,user1-svc-pfw-rolebinding.yaml
student@client1:~$ kubectl port-forward -n my-pgcluster-ns services/my-pgcluster-rw 5432:5432
student@client1:~$ psql postgres://keycloak:strongpassword@127.0.0.1:5432/keycloak
kube1:~/users# kubectl delete -f svc-pfw-role.yaml,user1-svc-pfw-rolebinding.yaml
 
Предоставление полного доступа к Kubernetes Cluster
kube1:~/users# kubectl get clusterroles | less
kube1:~/users# kubectl get clusterrole cluster-admin -o yaml
kube1:~/users# kubectl get clusterrolebindings | less
kube1:~/users# kubectl get clusterrolebindings admin -o yaml
kube1:~/users# kubectl get clusterrolebindings cluster-admin -o yaml
kube1:~/users# cat user1-cluster-admin.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: user1-cluster-admin
subjects:
- kind: User
  name: user1
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
kube1:~/users# kubectl apply -f user1-cluster-admin.yaml
student@client1:~$ kubectl get nodes
 
Поиск предоставленных кластерных ролей для учетной записи
kube1:~/users# kubectl get clusterrolebindings -o=json | jq '.items[] | select(.subjects[]?.name == "kubeadm:cluster-admins")'
kube1:~/users# kubectl get clusterrolebindings -o=json | jq '.items[] | select(.subjects[]?.name == "user1")'
kube1:~/users# kubectl delete -f user1-cluster-admin.yaml
 
Шаг 5. Использование JSON Web Token (JWT) для доступа в Kubernetes
Шаг 6. Использование Service Accounts в приложениях
kube1:~/users# kubectl describe pod my-debian | grep -i account
kube1:~/users# kubectl auth can-i get pods --as=system:serviceaccount:default:default
kube1:~/users# cat sa-default-cluster-admin.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: user1-cluster-admin
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
kube1:~/users# kubectl apply -f sa-default-cluster-admin.yaml
kube1:~/users# kubectl exec -ti pods/my-debian -- bash
root@my-debian:/# apt update && apt install kubectl
 
Вопросы?
Домашнее задание
 Куда и через сколько исчезает “kubectl get csr” после “approve” ?