[Перевод] Разбираем в деталях: Технология единого входа (SSO) в Kubernetes с использованием OpenID Connection через G Suite

В настоящее время Kubernetes де-факто является стандартом для оркестрации контейнеров, и лично я использую Kubernetes в production уже более двух лет.

Будучи DevOps инженерами, мы тесно сотрудничаем с разработчиками и используем одни и те же инструменты такие, как: CI-CD, VCS, laC, мониторинг, логирование, оркестрацию контейнеров и т.д. Kubernetes также является одним из таких инструментов, который тоже используется во время разработки, развёртывания и отладки, устранения неполадок и мониторинга приложений. Как все знают, это требование DevOps культуры.


vrodooxddbjpooi96jxhj8t7sqk.png

Именно поэтому работая в команде, есть необходимость создавать токены, логины и пароли, настраивать конфигурации или делиться текущими настройками для доступа к необходимым кластерам. Но как только вы поделитесь с ними всеми необходимыми данными, вероятнее всего, вы потеряете контроль над данными и это может критическим образом повлиять на систему безопасности, даже если ваши кластеры работают в частной сети или VPN.

Сейчас я покажу как избежать этой проблемы, используя метод аутентификации OpenID Connect (OIDC) и кластеры Kubernetes вместе, используя этот гайд.

Обратите внимание на порядок действий:


  1. Установка KOPS кластера
  2. Настройка G Suite в качестве поставщика OIDC
  3. Настройка Kubernetes API сервера
  4. Настройка прав в кластере
  5. Настройка kubeconfig
  6. Настройка kubelogin
  7. Проверка доступа к кластеру
  8. Процессы On-boarding и Off-boarding

1. Установка KOPS кластера

KOPS (Kubernetes Operations) помогает создавать, удалять, обновлять и обеспечивать поддержку производительности кластера Kubernetes с высокой доступностью из командной строки.


Создание KOPS кластера

Установку KOPS можно выполнить с помощью этого гайда. Ниже попробуем разобраться в основных шагах.

1 — Зарегистрируйте домен: Если у вас уже есть доменное имя, то используйте его. Если нет — то зарегистрируйте.

2 — Зайдите в учетную запись AWS: Если у вас уже есть учетная запись AWS, можете использовать её или создать бесплатный аккаунт.

3 — Создайте пользователя AWS IAM user: создайте пользователя с именем kops-admin, используя этот гайд, после чего дайте ему права доступа администратора — AdministratorAccess, используя этот гайд.

4 — Установите и настройте aws-cli на локальном устройстве, используя этот гайд.

5 — Создайте подзону DNS zone на Route53: Для создания KOPS кластера нам понадобится домен верхнего уровня или поддомен. Пока что воспользуемся поддоменом. Чтобы создать такой поддомен, используйте этот гайд по AWS.

После создания поддомена на стороне регистратора нужно указать NS записи сервера имен (NS).

6 — Чтобы создать хранилище S3 для KOPS, используйте этот гайд.

7 — Установите KOPS клиент и kubectl на вашем устройстве по этому гайду.

8 — Установите KOPS кластер Kubernetes, используя следующие команды:

kops create cluster dev.automateops.co.uk \
  --node-count 1 \
  --zones us-west-2a \
  --node-size t2.medium \
  --master-size t2.medium \
  --master-zones us-west-2a,us-west-2b,us-west-2c \
  --networking calico \
  --topology private \
  --bastion="true" \
  --state=s3://dev.autotameops.co.uk-state-store \
  --kubernetes-version=1.14.6 --yes

2. Настройка поставщика OIDC

OpenID Connect — это простой уровень идентификации поверх протокола OAuth 2.0. Он позволяет клиенту проверить личность конечного пользователя на основе процесса аутентификации, выполняемой сервером авторизации, а также получать базовую информацию о конечном пользователе с возможностью взаимодействия, в том числе и при помощи REST запросов.

foy_sxoxdal-tyco-gg_jrrbxok.png


Идентификационная платформа Google

Мы будем использовать Google в качестве идентификационной платформы. Откройте Google Cloud Platform здесь и войдите в систему. После чего выберите опцию Create a new project, чтобы открыть такое окно:

1lhtpx1d2lkvpiqxmixctfrjvx8.jpeg

После создания проекта нажмите ENABLE APIS AND SERVICES, чтобы включить Admin API.

qp8gstlp-wlqqxkivcsymu0qdoc.png

Найдите и выберите «Admin SDK», а затем включите его.

adhdysmbb5oerozz0pc12srrz6c.png
jacya3bzuorbsijithl-3uwqoim.png

Итак, мы создали новый проект и включили API. Теперь нам нужно настроить GSuite как OpenID Connector.

Перед тем, как пользователи пройдут аутентификацию, всплывающее окно предоставит выбор, хотят ли они разрешить доступ к личной информации и предоставить им ссылку на условия предоставления услуг и политику конфиденциальности.

Давайте настроим такое окно, кликнув APls & Services > OAuth

33ledfyyvhfmub8hsbo_s1k-s_8.png

Если вы хотите аутентифицировать своих пользователей с нескольких различных доменных имен, выберите тип приложения Public. А пока продолжим работу с типом приложения Internal.

2syawuvkz56xbnij8_4wbdebx10.png

Чтобы обезопасить свой (-и) кластер (ы) kubernetes, необходимо добавить свое (-и) доменные имена/имя в список Authorised domains. Здесь можно добавить сразу несколько доменных имен. Давайте добавим automateops.co.uk и кликнем Сохранить.

n6yhe5qyudzpf8xqvnxqwmbinsc.jpeg

После нажатия кнопки сохранения вы увидите следующий экран. Далее, для того, чтобы открыть доступ к APIs, из меню Create credentials выбираем OAuth client ID.

rq6dl8-hf1pey7gq80g3z-2pc6i.png

Выберите тип приложения Other, задайте название и кликните Создать.

nldow06gbedeydqwo6mvcy3dwim.png


3. Настройка Kubernetes API сервера


Пользователи могут получить доступ к API, используя kubectl, клиентские библиотеки или путем выполнения REST запросов. Для доступа к API могут быть авторизованы как реальные пользователи, так и сервисные аккаунты Kubernetes. Когда запрос поступает в API, он проходит несколько этапов, показанных на следующей диаграмме:

deynqrxurjiptu7ne61bbfjv4j4.png


После того, как TLS установлен, HTTP-запрос переходит к этапу аутентификации. Этот процесс отображен на диаграмме в шаге 1.

Если запрос не может быть аутентифицирован, он отклонится с HTTP кодом 401. Но при положительном сценарии пользователь будет аутентифицирован под специальным именем и под этим именем можно будет проходить дальнейшие шаги. Некоторые аутентификаторы также могут предоставить пользователю членство в группах, но не все.

Хотя Kubernetes и использует имена пользователя для принятия решения касаемо его авторизации, он не хранит информацию о пользователе, его имена или другую информацию в хранилище объектов.

После краткого обзора Kubernetes API сервера, давайте настроим kube-apiserver.

Мы уже установили кластер Kubernetes через KOPS, но перед настройкой kube-api, нам необходимо задать учетные данные OAuth. Найти информацию о oidclssuerURL можно на облачной платформе Google Cloud Platform. Как показано на следующем изображении, нажмите Credentials в меню слева и выберите OIDC CLIENT ID из списка, который мы только что создали.

laiezux-akdh530hn1od_qqgu7c.png
ecxplolfakcqfrna1v4qawcvhmk.jpeg

Выполните команду kops edit cluster и добавьте следующие параметры.

spec:
  kubeAPIServer:
    oidcIssuerURL: https://accounts.google.com
    oidcClientID: YOUR_CLIENT_ID
    oidcUsernameClaim: email

Сохраните и выполните следующие команды, чтобы применить изменения в кластере.

export KOPS_STATE_STORE="s3://dev.automatesops.co.uk-state-store"
kops update cluster --yes
kops rolling-update cluster --yes

P.S: После успешного завершения rolling-update процесса, вы увидите флаги oidc в подах kube-apiserver.

kubectl describe pod -n kube-system kube-apiserver-..compute.internal
--oidc-client-id=YOUR_CLIENT_ID 
--oidc-issuer-url=https://accounts.google.com
--oidc-username-claim=email

4. Настройка прав в кластере

Как уже упоминалось ранее, в шаге 3, нам необходимо задать роли RBAC для авторизации. Для получения более подробной информации о правах RBAC вы можете перейти сюда.

Лично я использую RBAC-Manager для управления правами Kubernetes кластера. Установка RBAC-Manager очень проста:

kubectl apply -f https://raw.githubusercontent.com/FairwindsOps/rbac-manager/master/deploy/all.yaml

После установки RBAC-Manager мы создадим 3 группы для разрешений пользователей:


  • cluster-admins
  • web-developers
  • api-developers
apiVersion: rbacmanager.reactiveops.io/v1beta1
kind: RBACDefinition
metadata:
  name: rbac-manager-users
rbacBindings:
  - name: cluster-admins
    subjects:
      - kind: User
        name: halid@automateops.co.uk
      - kind: User
        name: manesh@automateops.co.uk
    clusterRoleBindings:
      - clusterRole: cluster-admin
  - name: web-developers
    subjects:
      - kind: User
        name: sarah@automateops.co.uk
      - kind: User
        name: oliver@automateops.co.uk
    roleBindings:
      - clusterRole: edit
        namespace: web
      - clusterRole: view
        namespace: api
  - name: api-developers
    subjects:
      - kind: User
        name: daniel@automateops.co.uk
      - kind: User
        name: sophia@automateops.co.uk
    roleBindings:
      - clusterRole: edit
        namespace: api
      - clusterRole: view
        namespace: web
kubectl apply -f permissions.yaml

5. Настройка kubeconfig

У вас уже есть файл kuberconfig в разделе ~/.kube/config

Добавьте следующую информацию в kubeconfig:

users:
- name: google
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1beta1
      args:
      - oidc-login
      - get-token
      - --oidc-issuer-url=https://accounts.google.com
      - --oidc-client-id=YOUR_CLIENT_ID
      - --oidc-client-secret=YOUR_CLIENT_SECRET
      - --oidc-extra-scope=email
      - --oidc-extra-scope=profile
      command: kubectl

Ваш kubeconfig должен выглядеть так:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: 
    server: https://api.dev.automateops.co.uk
  name: dev.automateops.co.uk
contexts:
- context:
    cluster: dev.automateops.co.uk
    user: google
  name: dev.automateops.co.uk
current-context: dev.automateops.co.uk
kind: Config
preferences: {}
users:
- name: google
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1beta1
      args:
      - oidc-login
      - get-token
      - --oidc-issuer-url=https://accounts.google.com
      - --oidc-client-id=YOUR_CLIENT_ID
      - --oidc-client-secret=YOUR_CLIENT_SECRET
      - --oidc-extra-scope=email
      - --oidc-extra-scope=profile
      command: kubectl

Вы можете поделиться файлом kubeconfig для On-boarding.


6. Настройка kubelogin

У Kubernetes нет веб-интерфейса для запуска процесса аутентификации. Здесь нет браузера или интерфейса для сбора учетных данных, поэтому вам необходимо сначала пройти аутентификацию в системе управления доступами.

sqyt0x32ovs6ddydndb50ikuuls.png

Вот почему нам нужно установить плагин kubectl. Когда вы запускаете kubectl, kubelogin открывает браузер, и вы можете зайти в систему управления доступами. Затем kubelogin получает токен от этой системы и kubectl получает доступ к Kubernetes APIs с помощью этого токена.

Вы можете установить kubelogin, как показано ниже. Для получения более подробной информации нажмите здесь.

# Homebrew
brew install int128/kubelogin/kubelogin

# Krew
kubectl krew install oidc-login

# GitHub Releases
curl -LO https://github.com/int128/kubelogin/releases/download/v1.15.0/kubelogin_linux_amd64.zip
unzip kubelogin_linux_amd64.zip
ln -s kubelogin kubectl-oidc_login

7. Проверка доступа к кластеру

При запуске команды kubectl с теми или иными аргументами страница входа Google sign-in откроется автоматически. Если у вас есть права на кластер, которые мы задали в шаге 3, вы получите доступ к ресурсам сразу после входа в систему, как показано ниже.

kubectl get nodes
Open http://localhost:8000 for authentication
NAME                                    STATUS    ROLES     AGE       VERSION
ip-172-20-1-1.us-west-2.compute.internal   Ready     node      122m       v1.14.6
ip-172-20-1-2.us-west-2.compute.internal   Ready     node      123m      v1.14.6

8. Процессы On-boarding и Off-boarding

В разных отделах компаний постоянно происходит смена сотрудников (люди увольняются или же меняют подразделения, приходят новые), именно поэтому необходимо каждый раз обновлять права доступа кластеров при on-boarding и off-boarding процессах.

On-boarding: Когда появляется новый сотрудник, например, в команде разработки, вы можете просто поделиться kuberconfig, который мы уже подготовили на 5-ом шаге.

Off-boarding: Но когда сотрудник покидает компанию, вам необходимо обновить конфигурацию RBAC в Kubernetes кластерах, которую мы уже настроили в шаге 4.


В заключении

Подводя итог, если вы ищете технологию единого входа SSO для Kubernetes, OpenID Connector будет наилучшей альтернативой.

И главное — безопасность!)

© Habrahabr.ru