Управление доступом на основе ролей (RBAC) в Kubernetes
На этой странице
- Предварительные условия
- Что будем делать?
- Создайте объектные файлы роли, привязки роли, роли кластера, привязки роли кластера.
- Создайте объекты Роль, Привязка ролей, Роль кластера, Привязка ролей кластера.
- Предоставьте пользователям доступ с помощью файла kubeconfig(config).
- Обзор создания файла Kubeconfig
Управление доступом на основе ролей (RBAC) используется для предоставления доступа к компьютеру или сетевым ресурсам в кластере Kubernetes.
В этой статье мы разберемся с основами RBAC и создадим объекты Role, ClusterRole, RoleBinding и ClusterRoleBinding.
Затем мы создадим файл kubeconfig, чтобы предоставить ограниченный доступ конкретному пользователю в выбранном пространстве имен.
Но прежде чем мы продолжим, давайте сначала разберемся с основами.
- Роль или ClusterRole содержит набор разрешений.
- Роль устанавливает разрешения в определенном пространстве имен, а ClusterRole — это ресурс, не входящий в пространство имен.
- Привязка роли предоставляет разрешения, определенные в роли, пользователю или группе пользователей, тогда как ClusterRoleBinding предоставляет доступ на уровне всего кластера.
- Привязка RoleBinding может ссылаться на любую роль в том же пространстве имен. Кроме того, RoleBinding может ссылаться на ClusterRole и привязывать эту ClusterRole к пространству имен RoleBindin.
- Файл kubeconfig – это файл, используемый для настройки доступа к Kubernetes из инструмента командной строки kubectl.
Чтобы узнать подробнее RBAC, посетите официальную документацию Kubernetes здесь.
Note: Refer screenshots to avoid any confusion before executing the commands. ( = user machine)
Предпосылки
- Кластер Kubernetes по крайней мере с 1 рабочим узлом.
Если вы хотите научиться создавать кластер Kubernetes, нажмите здесь. Это руководство поможет вам создать кластер Kubernetes с 1 мастером и 2 узлами на инстансах AWS Ubuntu EC2.
Что мы будем делать?
- Создайте объектные файлы роли, привязки роли, роли кластера, привязки роли кластера.
- Создайте объекты «Роль», «Привязка роли», «Роль кластера», «Привязка роли кластера» в кластере.
- Предоставьте доступ пользователям с помощью файла kubeconfig.
- Краткий обзор создания файла kubeconfig.
Создайте объектные файлы роли, привязки роли, роли кластера, привязки роли кластера.
Создайте файл, чтобы создать роль в пространстве имен «по умолчанию», которую можно использовать для предоставления доступа к модулям на получение, просмотр и список.
vim my-role.yml
kind: Role apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: namespace: default name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list"]
Создайте новый файл, чтобы создать привязку RoleBinding , которая разрешает роль \pod-reader\ пользователю \jane\ в пространстве имен \default\.
vim my-role-binding.yml
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: read-pods namespace: default subjects: - kind: User name: jane apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io
Создайте файл, чтобы создать ClusterRole, который можно использовать для предоставления доступа к секретам для получения, просмотра и списка в любом конкретном пространстве имен или во всех пространствах имен в зависимости от того, как он связан.
vim my-cluster-role.yml
kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: secret-reader rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "watch", "list"]
Создайте новый файл, чтобы создать привязку ClusterRoleBinding, которая позволит любому пользователю в группе \manager\ читать секреты в любом пространстве имен.
vim my-cluster-role-binding.yml
kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: read-secrets-global subjects: - kind: Group name: manager apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: secret-reader apiGroup: rbac.authorization.k8s.io
Создайте объекты Роль, Привязка ролей, Роль кластера, Привязка ролей кластера.
Получите список существующих ролей и ролей кластера из кластера.
kubectl get roles
kubectl get clusterroles
Получите список существующих привязок RoleBindings и ClusterRoleBindings из кластера.
kubectl get rolebinding
kubectl get clusterrolebinding
Теперь создайте Role, RoleBinding и ClusterRole ClusterRoleBinding, используя файлы, которые мы создали на предыдущих шагах.
kubectl create -f my-role.yml
kubectl create -f my-role-binding.yml
kubectl create -f my-cluster-role.yml
kubectl create -f my-cluster-role-binding.yml
С помощью следующих команд проверьте, созданы ли объекты.
kubectl get roles | grep pod-reader
kubectl get rolebinding | grep read-pods
kubectl get clusterroles | grep secret-reader
kubectl get clusterrolebinding | grep read-secrets-global
На приведенном выше снимке экрана видно, что Роль, Ролевая привязка и ClusterRole, ClusterRoleBinding были созданы.
Предоставьте доступ пользователям с помощью файла kubeconfig(config).
Теперь в этом разделе мы создадим файл конфигурации, которым можно будет поделиться с пользователем. Здесь, чтобы проверить этот сценарий, мы создадим пользователя «bob» на сервере Linux и разделим этот файл конфигурации с пользователем «bob». Затем мы попытаемся выполнить операции, которые разрешены и запрещены для этого пользователя. Мы свяжем роль администратора ClusterRole с пользователем bob, который предоставит доступ ко всем объектам в пространстве имен bob.
На мастер-нодах создайте ключ и запрос на подпись сертификата (CSR) с помощью openssl.
pwd
mkdir user-bob
cd user-bob/
openssl req -new -newkey rsa:4096 -nodes -keyout bob-k8s.key -out bob-k8s.csr -subj "/CN=bob/O=devops"
cat bob-k8s.csr | base64 | tr -d '\n'
Создайте файл определения объекта CertificateSigningRequest, содержащий CSR, созданный на предыдущем шаге. В приведенном ниже файле добавьте вывод команды \cat bob-k8s.csr | base64 | tr -d \n\ к свойству \request\.
vim k8s-csr.yaml
apiVersion: certificates.k8s.io/v1beta1 kind: CertificateSigningRequest metadata: name: bob-k8s-access spec: groups: - system:authenticated request: # replace output of: cat bob-k8s.csr | base64 | tr -d '\n' usages: - client auth
cat k8s-csr.yaml
Создайте объект CertificateSigningRequest в Kubernetes, содержащий CSR, который мы создали на предыдущем шаге.
kubectl get csr
kubectl create -f k8s-csr.yaml
kubectl get csr
Теперь мы хотим одобрить объект CSR (CertificateSigningRequest), который мы создали на предыдущем шаге.
kubectl get csr
kubectl certificate approve bob-k8s-access
kubectl get csr
На приведенном выше снимке экрана видно, что CSR был утвержден, выдан.
Получите сертификат, доступный в поле «status.certificate» объекта CSR.
ls -lt
kubectl get csr bob-k8s-access -o jsonpath='{.status.certificate}' | base64 --decode > bob-k8s-access.crt
ls -lt
cat bob-k8s-access.crt
Получите сертификат CA кластера, который является следующим требованием для файла kubeconfig Боба, и сохраните его в файле \k8s-ca.crt\.
ls -lt
kubectl config view -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' --raw | base64 --decode - > k8s-ca.crt
ls -lt
cat k8s-ca.crt
Настройте конфигурацию кластера в файле kubeconfig Боба. Все эти данные будут добавлены из нашего существующего kubeconfig с помощью приведенной ниже команды.
ls -lt
kubectl config set-cluster $(kubectl config view -o jsonpath='{.clusters[0].name}') --server=$(kubectl config view -o jsonpath='{.clusters[0].cluster.server}') --certificate-authority=k8s-ca.crt --kubeconfig=bob-k8s-config --embed-certs
ls -lt
cat bob-k8s-config
Настройте пользователя, который будет импортировать ключ и сертификат Боба в файл конфигурации.
ls -lt
kubectl config set-credentials bob --client-certificate=bob-k8s-access.crt --client-key=bob-k8s.key --embed-certs --kubeconfig=bob-k8s-config
ls -lt
cat bob-k8s-config
Создайте контекст для конфигурационного файла Bobs, используя следующую команду.
ls -lt
kubectl config set-context bob --cluster=$(kubectl config view -o jsonpath='{.clusters[0].name}') --namespace=bob --user=bob --kubeconfig=bob-k8s-config
ls -lt
cat bob-k8s-config
Создайте пространство имен для Боба
kubectl get ns
kubectl create ns bob
kubectl get ns -o wide
kubectl label ns bob user=bob env=sandbox
kubectl get ns -o wide
Укажите контекст, который Боб будет использовать для своих команд kubectl.
cat bob-k8s-config
kubectl config use-context bob --kubeconfig=bob-k8s-config
cat bob-k8s-config
Скопируйте \bob-k8s-config\ с главного узла в файл \.kube/config\ в домашнем каталоге Боба и протестируйте kubeconfig Боба, запустив kubectl version.
vim .kube/config #All the output of "cat bob-k8s-config" command ran on the master node and save it to /home/bob/.kube/config on the user machine.
kubectl version #Execute this on the user machine
Проверьте разрешения, выполнив следующие команды на компьютере пользователя.
kubectl get nodes
kubectl get pods
kubectl get ns
kubectl get deployments
kubectl get all
На приведенном выше снимке экрана видно, что пользователь «Боб» не может выполнять какие-либо операции, поскольку ему не предоставлен доступ.
Назначьте Бобу кластерную роль администратора по умолчанию, чтобы он мог создавать большинство типов объектов Kubernetes в своем пространстве имен. Эта роль \bob-admin\ даст административный доступ пользователю \Bob\ в пространстве имен \bob\, используя ClusterRole \admin\.
Выполните следующую команду на главном узле.
kubectl create rolebinding bob-admin --namespace=bob --clusterrole=admin --user=bob
kubectl get rolebinding
kubectl get clusterrole | grep admin
Получите пространства имен, созданные для Боба.
Теперь выполните все следующие команды с пользовательского компьютера.
kubectl get ns
kubectl get ns bob
На приведенном выше снимке экрана видно, что пользователь «Боб» не может перечислить ресурсы «пространства имен».
Создайте модуль в пространстве имен \bob\, установленном в качестве пространства имен по умолчанию в файле kubeconfig Bobs.
kubectl run nginx --image=nginx
kubectl get pods
kubectl get pods -o wide
Проверьте текущее пространство имен, установленное в качестве пространства имен по умолчанию.
kubectl config get-contexts
На приведенном выше снимке экрана вы можете видеть, что «Боб» может создать под в пространстве имен «боб», поскольку мы привязали роль «администратора» к пользователю «Боб» для «боб». пространство имен.
Попробуйте создать модуль в пространстве имен «по умолчанию», на которое у Боба нет никаких разрешений. Поскольку мы разрешили пользователю Боб создавать объекты только в пространстве имен боб, пользователь Боб не сможет создавать какие-либо ресурсы в любом другом пространстве имен, кроме боб.
kubectl run nginx-2 --image=nginx --namespace=default
Проверьте пространство имен, установленное в качестве пространства имен по умолчанию в файле kubeconfig. Это показывает, что пространство имен bob установлено как пространство имен по умолчанию в файле конфигурации.
kubectl config view --minify | grep namespace:
Сводка по созданию файла Kubeconfig
- Создайте ключ и запрос на подпись сертификата (CSR) с помощью openssl.
- Создайте файл определения объекта CertificateSigningRequest.
- Создайте объект CertificateSigningRequest.
- Утвердить CSR (CertificateSigningRequest).
- Получение сертификата объекта CSR.
- Получить сертификат ЦС кластера.
- Настройте конфигурацию кластера в файле kubeconfig.
- Настройте пользователя.
- Создайте контекст.
- Создайте пространство имен для пользователя.
- Укажите контекст в файле kubeconfig.
- Передайте пользователю kubeconfig.
- Проверьте разрешения с помощью файла конфигурации пользователей.
- Назначить роль пользователю
- Еще раз проверьте разрешения, используя файл конфигурации пользователей.
Заключение
В этой статье мы рассмотрели основы Role, RoleBinding и ClusterRole, ClusterRoleBinding, мы также создали эти объекты в нашем кластере. Затем мы создали файл конфигурации, который позволяет определенному пользователю выполнять операции в определенном пространстве имен. Мы увидели, как RBAC может помочь нам ограничить доступ к кластеру Kubernetes.