Аўтэнтыфікацыя ў Kubernetes з дапамогай GitHub OAuth і Dex
Уяўляю вашай увазе тутарыял для генерацыі доступаў да Kubernetes-кластару з дапамогай Dex, dex-k8s-authenticator і GitHub.
Лакальны мем з рускамоўнага чата Kubernetes у Тэлеграма
Увядзенне
Мы выкарыстоўваем 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 у нашай арганізацыі могуць бачыць рэсурсы і ўваходзіць у поды, аднак яны не маюць правоў на іх змену.