Введение ¶
Для того, чтобы авторизоваться в Kubernetes через kubeconfig для доступа через kubectl, как правило, используют ServiceAccounts. Их просто проще создать, но это совсем неправильно. Токены от ServiceAccount доступны любому, кто может читать секреты в пространстве имён, где создан ServiceAccount, а значит от Вашего имени можно произвести диверсию. Небезопасненько…
Можно создать сертификат, подписать в кластере и ходить как User. Вот это уже отлично, никто не может от Вашего имени ничего сделать, потому что приватную часть мы, естественно, генерировали локально и ни с кем не делились. Как это сделать, я тут заодно напишу, раз разобрался.
Недавно, таки дошли руки попробовать Authentik, а заодно попробовал привязать к нему кластер через настройку API сервера. Оказалось, это даже проще, местами, чем возится с сертификатами для пользователя. Вот об этом всём и разскажу
Доступ через ServiceAccount ¶
Создаём ServiceAccount.
|
|
Раньше, до Kubernetes 1.22, автоматически генерировался токен, сейчас его нужно создавать отдельно. Можно сгенерировать временный.
|
|
Можно, по-старинке, получить постоянный, создав для него секрет.
|
|
И вот мы его уже можем прописать в kubeconfig и использовать.
|
|
Создание пользователя ¶
Тут придётся заморочится. Нужно создать сертификат, запрос на подпись, подписать, забрать публичную часть и вот только теперь мы приплыли. Скрипт я свой прилагаю, а описывать это всё не хочу. Горит именно о OIDC рассказать, так что воспринимайте это как приятный бонус 😄
Как пользоваться:
- Пишем своё имя в переменную NAME
- Пишем имя компании в переменную GROUP
- Меняем CLUSTERROLE если очень хочется
- Запускаем и читаем инструкцию на экране
|
|
Google OIDC ¶
Настраиваем OAuth consent screen
Создаём OAuth2 креды тип Web application, Authorized redirect URIs - в списке ниже.
1 2 3 4
http://127.0.0.1:18000 http://127.0.0.1:8000 http://localhost:18000 http://localhost:8000
В итоге получили Client ID и Client Secret
Отлично, теперь нужно поставить kubectl oidc-login плагин.
После установки, пробуем, чтобы у нас всё работало.
|
|
Если всё в порядке, то у Вас открылся браузер, залогинились под кем-то и в консоли появилась большая красивая инструкция. Типо такой.
|
|
Теперь просто следуем тому, что написано выше и перезапускаем API сервер разок.
Authentik ¶
Штука отличная! Из прямых аналогов, стоит отметить Okta и Keycloak. Все 3 продукта великолепные, на Okta вообще часто равняются как на эталон. Другое либо лучше, либо хуже, но всегда по сравнению с Okta 😄
Ставил я Authentik из официального чарта. Он у меня запущен локально, а сертификат нужен. Получил certbot-ом используя DNS проверку. После этого делаем следующее.
Applications > Providers
Создаём провайдер Kubernetes типа OAuth2/OIDC
- Client type: Confidential
- Client ID: запоминаем
- Client Secret: запоминаем
- Redirect URIs:
http://(127.0.0.1|localhost):1?8000(/.*)?
Application > Applications
Создаем приложение Kubernetes и выбираем провайдером то, что создали в пункте 1.
System
В пользователях создаём пользователей (как неожиданно, неправда ли?), тут же создаём группы. Я сделал kubernetes:admin и kubernetes:restricted. Первым будет выдаваться cluster-admin роль в самом Kubernetes, а вторым - что-то readonly. Не забываем добавить пользователей в соответсвующие группы.
System > Certificates
Вот тут не уверен, просто не проверял без этого. Я загрузил сюда сертификат, который получил ранее certbot-ом, а потом этот сертификат выбрал в Application > Providers > Kubernetes > Edit > Signing Key. Kubernetes не ругался, может можно тут и self-signed было стандартный использовать, не знаю, в общем. Попробуете сами.
Customization > Property Mappings
Создаём вот с такими параметрами
Name: Kubernetes
Scope name: kubernetes
Expression
1 2 3 4 5 6 7 8 9 10
all_groups = [ "kubernetes:admin", "kubernetes:restricted" ] return dict( groups=[ group for group in all_groups if ak_is_group_member(request.user, name=group) ] )
Таким образом, для тех кто запросит этот скоуп, Authentik будет дописывать группы, в которых состоит пользователь, перебирая только кубовские.
Проверяем kube-oidc-login
1 2 3 4 5
kubectl oidc-login setup \ --oidc-issuer-url=https://authentik.example.com/application/o/kubernetes/ \ --oidc-client-id='YOUR CLIENT ID' \ --oidc-client-secret='YOUR CLIENT SECRET' \ --oidc-extra-scope=kubernetes
Всё там заводится, следуем дальше инструкциям.
Выделяем права на группу в Kubernetes
Authentik передаст список групп, теперь нужно чтобы Kubernetes на это обратил внимание. Добавляем к API серверу вот такие аргументы.
1 2
--oidc-groups-claim=groups --oidc-groups-prefix=oidc:
Теперь, можно создать, к примеру, такие ресурсы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: oidc:kubernetes:admin roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: oidc:kubernetes:admin --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: this-name-is-custom roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: view subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: oidc:kubernetes:restricted