Аутентифікація в Kubernetes за допомогою GitHub OAuth та Dex
До вашої уваги туториал для генерації доступів до Kubernetes-кластеру за допомогою Dex, dex-k8s-authenticator та GitHub.
Локальний мем з російськомовного чату Kubernetes Telegram
Запровадження
Ми використовуємо Kubernetes для створення динамічних оточення команд розробників і QA. Таким чином ми хочемо надати їм доступ до кластера як для дашборду, так і для kubectl. На відміну від того ж OpenShift, ванільний Kubernetes не має нативної автентифікації, тому ми використовуємо для цього сторонні засоби.
GitHub - просто тому, що ми використовуємо GitHub в нашій компанії
Ми намагалися використовувати Google OIDC, але, на жаль, нам не вдалося завести їх із групами, тому інтеграція з GitHub нас цілком влаштувала. Без мапінгу груп не вдасться створити RBAC-політики, засновані на групах.
Отже, як працює наш процес авторизації в Kubernetes у візуальному поданні:
Процес авторизації
Трохи докладніше та за пунктами:
Користувач входить до dex-k8s-authenticator (login.k8s.example.com)
dex-k8s-authenticator перенаправляє запит у Dex (dex.k8s.example.com)
Dex перенаправляє на сторінку авторизації в GitHub
GitHub генерує необхідну інформацію про авторизацію та повертає її в Dex
Dex передає отриману інформацію в dex-k8s-authenticator
Користувач отримує OIDC token від GitHub
dex-k8s-authenticator додає токен у kubeconfig
kubectl передає токен у KubeAPIServer
KubeAPIServer на основі переданого токена повертає доступи до kubectl
Користувач отримує доступи від kubectl
підготовчі дії
Само собою у нас вже встановлено Kubernetes-кластер (k8s.example.com), а також встановлений HELM. Також у нас є організація у GitHub (super-org).
Якщо у вас немає HELM, встановлюється він дуже просто.
Спершу нам необхідно налаштувати GitHub.
Переходимо на сторінку налаштувань організації, (https://github.com/organizations/super-org/settings/applications) і створюємо новий додаток (Authorized OAuth App):
Будьте уважні з посиланнями, важливо не втратити сліші.
У відповідь на заповнену форму, GitHub згенерує Client ID и Client secret, збережіть їх у надійному місці, вони нам знадобляться (ми наприклад використовуємо склеп для зберігання секретів):
Переходимо на сторінку логіна (https://login.k8s.example.com) і авторизуємося за допомогою GitHub-акаунту:
Сторінка авторизації
Сторінка авторизації перенаправлена на GitHub
Слідуємо згенерованій інструкції для отримання доступів
Після копіпасти з веб-сторінки ми можемо використовувати kubectl для управління ресурсами кластера:
kubectl get po
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 3d
kubectl delete po mypod
Error from server (Forbidden): pods "mypod" is forbidden: User "[email protected]" cannot delete pods in the namespace "default"
І це працює, всі користувачі GitHub у нашій організації можуть бачити ресурси та входити в поди, однак вони не мають прав на їхню зміну.