Dex — это служба идентификации, которая использует OpenID Connect для аутентификации в Kubernetes. Он подключается к сторонним поставщикам удостоверений, таким как Active Directory, LDAP и GitHub. Хотя сервер API Kubernetes поддерживает только одного поставщика удостоверений и эмитента токенов OIDC, использование Dex позволяет использовать удостоверения от различных поставщиков при аутентификации в Kubernetes.
Это приложение по умолчанию устанавливается в кластерах управления Giant Swarm, а также готово к развертыванию в кластерах рабочих нагрузок.
В дополнение к самому Dex это приложение предоставляет Dex K8s Authenticator, который помогает настроить kubectl
для кластеров, аутентифицированных через Dex.
Есть несколько способов установить это приложение.
Вы предоставляете свою конфигурацию через собственный файл values.yaml
. Ниже приведен пример использования соединителя для Azure Active Directory. Дополнительные примеры разъемов можно найти ниже.
isWorkloadCluster : true
services :
kubernetes :
api :
caPem : |
-----BEGIN CERTIFICATE-----
M...=
-----END CERTIFICATE-----
oidc :
expiry :
signingKeys : 6h
idTokens : 30m
customer :
connectors :
- id : customer
connectorName : test
connectorType : microsoft
connectorConfig : |-
clientID: <CLIENT-ID-SET-IN-YOUR-IdP>
clientSecret: <CLIENT-SECRET-SET-IN--YOUR-IdP>
tenant: <TENANT-SET-SET-IN--YOUR-IdP>
redirectURI: https://dex.<CLUSTER>.<BASEDOMAIN>/callback
Некоторые примечания:
.service.kubernetes.api.caPem
— это сертификат CA вашего кластера рабочей нагрузки в формате PEM. В Giant Swarm вы можете получить этот сертификат с помощью команды входа в систему kubectl gs при создании клиентского сертификата для кластера рабочей нагрузки. В конечном итоге он оказывается в форме, закодированной Base46, в вашем файле конфигурации kubectl. Сертификат CA требуется для аутентификатора Dex K8s.
redirectURI
в конфигурации вашего соединителя должен содержать правильное имя хоста для собственного входа Dex. В форме по умолчанию он содержит имя кластера рабочей нагрузки (замените <CLUSTER>
фактическим именем) и базовый домен (замените <BASEDOMAIN>
соответствующим базовым доменом).
Если вы настраиваете более одного соединителя, обязательно установите уникальный id
для каждого из них. Имейте в виду, что в этой версии Dex настроен префикс всех имен групп пользователей с идентификатором соединителя. Таким образом, если id
вашего соединителя — customer
, членство в группе devops
будет отображаться как customer:devops
.
Пример конфигурации соединителя для Keycloak:
- id : customer
connectorName : test
connectorType : oidc
connectorConfig : |-
clientID: <CLIENT-ID-SET-IN-YOUR-IdP>
clientSecret: <CLIENT-SECRET-SET-IN--YOUR-IdP>
insecureEnableGroups: true
scopes:
- email
- groups
- profile
issuer: https://<IDP_ENDPOINT>/auth/realms/master
redirectURI: https://dex.<CLUSTERID>.<BASEDOMAIN>/callback
Пример конфигурации коннектора для GitHub:
- id : customer
connectorName : test
connectorType : github
connectorConfig : |-
clientID: <CLIENT-ID-SET-IN-YOUR-IdP>
clientSecret: <CLIENT-SECRET-SET-IN--YOUR-IdP>
loadAllGroups: false
teamNameField: slug
orgs:
- name: <GITHUB_ORG_NAME>
teams:
- <GITHUB_TEAM_SLUG>
redirectURI: https://dex.<CLUSTERID>.<BASEDOMAIN>/callback
Примечание:
<GITHUB_ORG_NAME>
— это название вашей организации GitHub. Например, часть myorg
в https://github.com/myorg
.<GITHUB_TEAM_SLUG>
— это часть URL-адреса команды, представляющая название команды. Например, часть my-team
в https://github.com/orgs/myorg/teams/my-team
. Приложение устанавливается в кластерах рабочих нагрузок через нашу платформу приложений. Прежде чем сделать это, создайте следующий ресурс ConfigMap
в пространстве имен, названном в честь этого кластера рабочей нагрузки, чтобы предоставить содержимое файла values.yaml
.
apiVersion : v1
kind : ConfigMap
metadata :
name : dex-app-user-values
namespace : <CLUSTER>
data :
values : |
<content of values.yaml>
Затем вы либо устанавливаете приложение через наш веб-интерфейс, либо создаете ресурс приложения в следующем формате:
apiVersion : application.giantswarm.io/v1alpha1
kind : App
metadata :
labels :
app.kubernetes.io/name : dex-app
name : dex-app
namespace : <CLUSTER>
spec :
catalog : giantswarm-playground
name : dex-app
namespace : dex
userConfig :
configMap :
name : <CONFIGMAPNAME>
namespace : <CLUSTER>
Примечания:
<CONFIGMAPNAME>
необходимо заменить именем ресурса ConfigMap, показанным выше.<CLUSTER>
заменяется именем вашего кластера рабочей нагрузки.В результате вы должны увидеть Dex, развернутый в вашем кластере рабочей нагрузки.
Приложение Dex предоставляет веб-интерфейс, доступный через https. Таким образом, он создает входной доступ, который необходимо настроить с помощью сертификата TLS, подписанного центром сертификации, которому браузеры должны доверять. Приложение состоит из нескольких компонентов, которые также должны иметь возможность внутреннего взаимодействия друг с другом через https. Таким образом, центру сертификации, подписывающему сертификаты, также должны доверять отдельные компоненты приложения.
В случае использования специального центра сертификации его необходимо предоставить отдельным компонентам приложения и установить как доверенный, иначе компоненты не смогут взаимодействовать друг с другом, и приложение может работать не так, как ожидалось. В зависимости от настройки кластера этого можно добиться, предоставив дополнительный набор значений в конфигурации приложения:
ingress :
tls :
letsencrypt : false
caPemB64 : " base64-encoded CA certificate "
ingress :
tls :
letsencrypt : false
trustedRootCA :
name : " name-of-the property-in-the-secret "
secretName : " name-of-the-custom-ca-secret "
letsencrypt
будет создан секрет под названием dex-tls
который будет распространяться со значениями в кодировке b64, предоставленными пользователем. Альтернативно, пользователь может самостоятельно управлять созданием этого секрета и разрешить его использование следующим образом: ingress :
tls :
letsencrypt : false
externalSecret :
enabled : true
Затем необходимо применить следующий секрет к пространству имен, в котором работает dex
:
apiVersion : v1
kind : Secret
type : kubernetes.io/tls
metadata :
name : dex-tls
data :
ca.crt : ...
tls.crt : ...
tls.key : ...
Если трафик к Dex должен проходить через прокси-сервер (например, когда приложение установлено в частном кластере), отдельные компоненты приложения необходимо настроить на использование прокси-сервера.
Настройка прокси-сервера может быть предоставлена приложению в определенном разделе карты конфигурации или секрета пользовательских значений с конфигурацией приложения:
cluster :
proxy :
http : " https://proxy.host:4040 " # hostname of the proxy for HTTP traffic
https : " https://proxy.host:4040 " # hostname of the proxy for HTTPS traffic
noProxy : " kubernetes-api-ip-range " # comma-separated list of hostnames and IP ranges, whose traffic should not go through the proxy. # Kubernetes API IP range needs to be defined here in order for Dex to work correctly
В дополнение к нескольким предопределенным статическим клиентам приложение Dex также поддерживает возможность определения пользовательских статических клиентов. Их необходимо определить как массив объектов в определенном свойстве файла yaml конфигурации под названием extraStaticClients
. Структура каждого пользовательского статического клиентского объекта точно такая же, как и в исходном Dex:
extraStaticClients :
- id : " client-id "
secret : " client-secret "
trustedPeers :
- " https://example.com "
public : true
name : " client-name-1 "
logoURL : " https://example.com/logo "
- idEnv : " CLIENT_ID "
secretEnv : " CLIENT_SECRET "
redirectURIs :
- " https://example.com/redirect "
name : " client-name-2 "
Примечания:
id
и idEnv
являются взаимоисключающими.secret
и secretEnv
являются взаимоисключающими.name
id
или idEnv
secret
или secretEnv
Дополнительные статические клиенты также могут быть настроены как доверенные одноранговые узлы предопределенных статических клиентов:
Добавьте дополнительный статический идентификатор клиента в список trustedPeers
в предварительно определенном статическом клиенте:
staticClients :
dexK8SAuthenticator :
clientAddress : " dex.installation.basedomain.io "
clientSecret : " default-client-dex-authenticator-secret "
trustedPeers :
- " client-id "
extraStaticClients :
- id : " client-id "
name : " client-name-1 "
secret : " client-secret "
Он создаст ту же конфигурацию:
staticClients :
- id : dex-k8s-authenticator
name : dex-k8s-authenticator
secret : default-client-dex-authenticator-secret
trustedPeers :
- client-id
- id : client-id
name : client-name-1
secret : client-secret
public : true
Дубликаты предотвращаются в том случае, если идентификатор любого дополнительного доверенного узла равен автоматически предварительно заполненному идентификатору доверенного узла.
Giant Swarm в настоящее время создает приложение dex
на основе ответвления исходного проекта. Мы реализуем дополнительную логику, которая добавляет идентификатор соединителя в качестве префикса к группам пользователей. Чтобы обновить изображение, используемое в этой диаграмме, в настоящее время необходимо выполнить следующие шаги в нашем репозитории вилки:
Затем в этом репо:
values.yaml
убедитесь, что values.schema.json
обновлен и правильно отражает все значения и их типы.master#release#v<major.minor.patch>
, дождитесь создания соответствующего PR-релиза, одобрите его, объедините.