В настоящее время Kubernetes де-факто является стандартом для оркестрации контейнеров, и лично я использую Kubernetes в production уже более двух лет.
Будучи DevOps инженерами, мы тесно сотрудничаем с разработчиками и используем одни и те же инструменты такие, как: CI-CD, VCS, laC, мониторинг, логирование, оркестрацию контейнеров и т.д. Kubernetes также является одним из таких инструментов, который тоже используется во время разработки, развёртывания и отладки, устранения неполадок и мониторинга приложений. Как все знают, это требование DevOps культуры.
Именно поэтому работая в команде, есть необходимость создавать токены, логины и пароли, настраивать конфигурации или делиться текущими настройками для доступа к необходимым кластерам. Но как только вы поделитесь с ними всеми необходимыми данными, вероятнее всего, вы потеряете контроль над данными и это может критическим образом повлиять на систему безопасности, даже если ваши кластеры работают в частной сети или VPN.
Сейчас я покажу как избежать этой проблемы, используя метод аутентификации OpenID Connect (OIDC) и кластеры Kubernetes вместе, используя этот гайд.
Обратите внимание на порядок действий:
- Установка KOPS кластера
- Настройка G Suite в качестве поставщика OIDC
- Настройка Kubernetes API сервера
- Настройка прав в кластере
- Настройка kubeconfig
- Настройка kubelogin
- Проверка доступа к кластеру
- Процессы 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 запросов.
Идентификационная платформа Google
Мы будем использовать Google в качестве идентификационной платформы. Откройте Google Cloud Platform здесь и войдите в систему. После чего выберите опцию Create a new project, чтобы открыть такое окно:
После создания проекта нажмите ENABLE APIS AND SERVICES, чтобы включить Admin API.
Найдите и выберите "Admin SDK", а затем включите его.
Итак, мы создали новый проект и включили API. Теперь нам нужно настроить GSuite как OpenID Connector.
Перед тем, как пользователи пройдут аутентификацию, всплывающее окно предоставит выбор, хотят ли они разрешить доступ к личной информации и предоставить им ссылку на условия предоставления услуг и политику конфиденциальности.
Давайте настроим такое окно, кликнув APls & Services > OAuth
Если вы хотите аутентифицировать своих пользователей с нескольких различных доменных имен, выберите тип приложения Public. А пока продолжим работу с типом приложения Internal.
Чтобы обезопасить свой(-и) кластер(ы) kubernetes, необходимо добавить свое(-и) доменные имена/имя в список Authorised domains. Здесь можно добавить сразу несколько доменных имен. Давайте добавим automateops.co.uk и кликнем Сохранить.
После нажатия кнопки сохранения вы увидите следующий экран. Далее, для того, чтобы открыть доступ к APIs, из меню Create credentials выбираем OAuth client ID.
Выберите тип приложения Other, задайте название и кликните Создать.
3. Настройка Kubernetes API сервера
Пользователи могут получить доступ к API, используя kubectl
, клиентские библиотеки или путем выполнения REST запросов. Для доступа к API могут быть авторизованы как реальные пользователи, так и сервисные аккаунты Kubernetes. Когда запрос поступает в API, он проходит несколько этапов, показанных на следующей диаграмме:
После того, как TLS установлен, HTTP-запрос переходит к этапу аутентификации. Этот процесс отображен на диаграмме в шаге 1.
Если запрос не может быть аутентифицирован, он отклонится с HTTP кодом 401. Но при положительном сценарии пользователь будет аутентифицирован под специальнымименем
и под этим именем можно будет проходить дальнейшие шаги. Некоторые аутентификаторы также могут предоставить пользователю членство в группах, но не все.
Хотя Kubernetes и используетимена пользователя
для принятия решения касаемо его авторизации, он не хранит информацию опользователе
, его имена или другую информацию в хранилище объектов.
После краткого обзора Kubernetes API сервера, давайте настроим kube-apiserver.
Мы уже установили кластер Kubernetes через KOPS, но перед настройкой kube-api, нам необходимо задать учетные данные OAuth. Найти информацию о oidclssuerURL можно на облачной платформе Google Cloud Platform. Как показано на следующем изображении, нажмите Credentials в меню слева и выберите OIDC CLIENT ID из списка, который мы только что создали.
Выполните команду 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.
<b>kubectl describe</b> pod -n kube-system <b>kube-apiserver</b>-<ip>.<region>.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: <your 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 нет веб-интерфейса для запуска процесса аутентификации. Здесь нет браузера или интерфейса для сбора учетных данных, поэтому вам необходимо сначала пройти аутентификацию в системе управления доступами.
Вот почему нам нужно установить плагин 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 будет наилучшей альтернативой.
И главное — безопасность!)