Поиск по сайту:

Управление доступом на основе ролей (RBAC) в Kubernetes


На этой странице

  1. Предварительные условия
  2. Что будем делать?
  3. Создайте объектные файлы роли, привязки роли, роли кластера, привязки роли кластера.
  4. Создайте объекты Роль, Привязка ролей, Роль кластера, Привязка ролей кластера.
  5. Предоставьте пользователям доступ с помощью файла kubeconfig(config).
    1. Обзор создания файла Kubeconfig

    Управление доступом на основе ролей (RBAC) используется для предоставления доступа к компьютеру или сетевым ресурсам в кластере Kubernetes.

    В этой статье мы разберемся с основами RBAC и создадим объекты Role, ClusterRole, RoleBinding и ClusterRoleBinding.

    Затем мы создадим файл kubeconfig, чтобы предоставить ограниченный доступ конкретному пользователю в выбранном пространстве имен.

    Но прежде чем мы продолжим, давайте сначала разберемся с основами.

    1. Роль или ClusterRole содержит набор разрешений.
    2. Роль устанавливает разрешения в определенном пространстве имен, а ClusterRole — это ресурс, не входящий в пространство имен.
    3. Привязка роли предоставляет разрешения, определенные в роли, пользователю или группе пользователей, тогда как ClusterRoleBinding предоставляет доступ на уровне всего кластера.
    4. Привязка RoleBinding может ссылаться на любую роль в том же пространстве имен. Кроме того, RoleBinding может ссылаться на ClusterRole и привязывать эту ClusterRole к пространству имен RoleBindin.
    5. Файл kubeconfig – это файл, используемый для настройки доступа к Kubernetes из инструмента командной строки kubectl.

    Чтобы узнать подробнее RBAC, посетите официальную документацию Kubernetes здесь.

    Note: Refer screenshots to avoid any confusion before executing the commands. (  = user machine)

    Предпосылки

    1. Кластер Kubernetes по крайней мере с 1 рабочим узлом.
      Если вы хотите научиться создавать кластер Kubernetes, нажмите здесь. Это руководство поможет вам создать кластер Kubernetes с 1 мастером и 2 узлами на инстансах AWS Ubuntu EC2.

    Что мы будем делать?

    1. Создайте объектные файлы роли, привязки роли, роли кластера, привязки роли кластера.
    2. Создайте объекты «Роль», «Привязка роли», «Роль кластера», «Привязка роли кластера» в кластере.
    3. Предоставьте доступ пользователям с помощью файла kubeconfig.
    4. Краткий обзор создания файла 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

    1. Создайте ключ и запрос на подпись сертификата (CSR) с помощью openssl.
    2. Создайте файл определения объекта CertificateSigningRequest.
    3. Создайте объект CertificateSigningRequest.
    4. Утвердить CSR (CertificateSigningRequest).
    5. Получение сертификата объекта CSR.
    6. Получить сертификат ЦС кластера.
    7. Настройте конфигурацию кластера в файле kubeconfig.
    8. Настройте пользователя.
    9. Создайте контекст.
    10. Создайте пространство имен для пользователя.
    11. Укажите контекст в файле kubeconfig.
    12. Передайте пользователю kubeconfig.
    13. Проверьте разрешения с помощью файла конфигурации пользователей.
    14. Назначить роль пользователю
    15. Еще раз проверьте разрешения, используя файл конфигурации пользователей.

    Заключение

    В этой статье мы рассмотрели основы Role, RoleBinding и ClusterRole, ClusterRoleBinding, мы также создали эти объекты в нашем кластере. Затем мы создали файл конфигурации, который позволяет определенному пользователю выполнять операции в определенном пространстве имен. Мы увидели, как RBAC может помочь нам ограничить доступ к кластеру Kubernetes.