Fixamos a autorización de ActiveDirectory a Kubernetes mediante Keycloak

Este artigo foi escrito para ampliar o xa existente, pero fala das funcións do paquete con Microsoft ActiveDirectory e tamén o complementa.

Neste artigo vouche dicir como instalar e configurar:

  • chaveiro é un proxecto de código aberto. O que proporciona un único punto de entrada para as solicitudes. Funciona con moitos protocolos, incluíndo LDAP e OpenID nos que estamos interesados.
  • porteiro de chaveiro - aplicación de proxy inverso que che permite integrar a autorización a través de Keycloak.
  • pasarela - unha aplicación que xera unha configuración para kubectl coa que pode iniciar sesión e conectarse á API de Kubernetes a través de OpenID.

Como funcionan os permisos en Kubernetes.

Podemos xestionar os dereitos de usuarios/grupos usando RBAC, xa se crearon unha morea de artigos sobre isto, non vou determe en detalle. O problema é que podes usar RBAC para restrinxir os dereitos dos usuarios, pero Kubernetes non sabe nada sobre os usuarios. Resulta que necesitamos un mecanismo de entrega de usuarios en Kubernetes. Para iso, engadiremos un provedor a Kuberntes OpenID, que dirá que ese usuario realmente existe, e o propio Kubernetes concederalle os dereitos.

Adestramento

  • Necesitarás un clúster ou minikube de Kubernetes
  • Active Directory
  • Dominios:
    keycloak.example.org
    kubernetes-dashboard.example.org
    pasarela.example.org
  • Certificado para dominios ou certificado autoasinado

Non vou determe sobre como crear un certificado autoasinado, cómpre crear 2 certificados, este é o cliente raíz (Autoridade de certificación) e comodín para o dominio *.example.org

Despois de recibir/emitir certificados, o cliente debe engadirse a Kubernetes, para iso creamos un segredo para el:

kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem

A continuación, usarémolo para o noso controlador de entrada.

Instalación de Keycloak

Decidín que o xeito máis sinxelo é usar solucións preparadas para iso, é dicir, gráficos de timón.

Instala o repositorio e actualízao:

helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update

Cree un ficheiro keycloak.yml co seguinte contido:

keycloak.yml

keycloak:
  # Имя администратора
  username: "test_admin"
  # Пароль администратор  
  password: "admin"
  # Эти флаги нужны что бы позволить загружать в Keycloak скрипты прямо через web морду. Это нам 
  понадобиться что бы починить один баг, о котором ниже.
  extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled" 
  # Включаем ingress, указываем имя хоста и сертификат который мы предварительно сохранили в secrets
  ingress:
    enabled: true 
    path: /
    annotations:
      kubernetes.io/ingress.class: nginx
      ingress.kubernetes.io/affinity: cookie
    hosts:
      - keycloak.example.org
    tls:
    - hosts:
        - keycloak.example.org
      secretName: tls-keycloak
  # Keycloak для своей работы требует базу данных, в тестовых целях я разворачиваю Postgresql прямо в Kuberntes, в продакшене так лучше не делать!
  persistence:
    deployPostgres: true
    dbVendor: postgres

postgresql:
  postgresUser: keycloak
  postgresPassword: ""
  postgresDatabase: keycloak
  persistence:
    enabled: true

Configuración da federación

A continuación, vai á interface web keycloak.example.org

Fai clic na esquina esquerda Engadir reino

Clave
Valor

nome
kubernetes

Mostrar Name
Kubernetes

Desactivar a verificación do correo electrónico do usuario:
Ámbitos do cliente —> Correo electrónico —> Mapeadores —> Correo electrónico verificado (Eliminar)

Configuramos a federación para importar usuarios de ActiveDirectory, deixarei capturas de pantalla a continuación, creo que quedará máis claro.

Federación de usuarios —> Engadir provedor... —> ldap

Configuración da federaciónFixamos a autorización de ActiveDirectory a Kubernetes mediante Keycloak
Fixamos a autorización de ActiveDirectory a Kubernetes mediante Keycloak

Se todo está ben, despois de premer o botón Sincronizar todos os usuarios verá unha mensaxe sobre a importación exitosa de usuarios.

A continuación temos que mapear os nosos grupos

Federación de usuarios --> ldap_localhost --> Mappers --> Crear

Creando un mapeadorFixamos a autorización de ActiveDirectory a Kubernetes mediante Keycloak

Configuración do cliente

É necesario crear un cliente, en termos de Keycloak, esta é unha aplicación que será autorizada por el. Destacarei os puntos importantes na captura de pantalla en vermello.

Clientes —> Crear

Configuración do clienteFixamos a autorización de ActiveDirectory a Kubernetes mediante Keycloak

Imos crear scoupe para grupos:

Ámbitos do cliente —> Crear

Crear ámbitoFixamos a autorización de ActiveDirectory a Kubernetes mediante Keycloak

E configura un mapeador para eles:

Ámbitos do cliente —> grupos —> Mapeadores —> Crear

MapeadorFixamos a autorización de ActiveDirectory a Kubernetes mediante Keycloak

Engade a asignación dos nosos grupos aos ámbitos de cliente predeterminados:

Clientes —> kubernetes —> Ámbitos de cliente —> Ámbitos de cliente predeterminados
seleccionar grupos в Ámbitos de cliente dispoñibles, prema Engadir seleccionado

Recibimos o segredo (e escríbeo no fío) que usaremos para a autorización en Keycloak:

Clientes —> kubernetes —> Credenciais —> Segredo
Isto completa a configuración, pero tiven un erro cando, despois da autorización exitosa, recibín un erro 403. Informe de erros.

Corrección:

Ámbitos do cliente —> roles —> Mappers —> Crear

MapeadorFixamos a autorización de ActiveDirectory a Kubernetes mediante Keycloak

Código de script

// add current client-id to token audience
token.addAudience(token.getIssuedFor());

// return token issuer as dummy result assigned to iss again
token.getIssuer();

Configuración de Kubernetes

Debemos especificar onde se atopa o noso certificado raíz do sitio e onde se atopa o provedor OIDC.
Para iso, edite o ficheiro /etc/kubernetes/manifests/kube-apiserver.yaml

kube-apiserver.yaml


...
spec:
  containers:
  - command:
    - kube-apiserver
...
    - --oidc-ca-file=/var/lib/minikube/certs/My_Root.crt
    - --oidc-client-id=kubernetes
    - --oidc-groups-claim=groups
    - --oidc-issuer-url=https://keycloak.example.org/auth/realms/kubernetes
    - --oidc-username-claim=email
...

Actualiza a configuración de kubeadm no clúster:

kubeadmconfig

kubectl edit -n kube-system configmaps kubeadm-config


...
data:
  ClusterConfiguration: |
    apiServer:
      extraArgs:
        oidc-ca-file: /var/lib/minikube/certs/My_Root.crt
        oidc-client-id: kubernetes
        oidc-groups-claim: groups
        oidc-issuer-url: https://keycloak.example.org/auth/realms/kubernetes
        oidc-username-claim: email
...

Configurando o proxy de autenticación

Podes usar o Keycloak Gatekeeper para protexer a túa aplicación web. Ademais de que este proxy inverso autorizará ao usuario antes de mostrar a páxina, tamén pasará información sobre ti á aplicación final nas cabeceiras. Así, se a súa aplicación admite OpenID, entón o usuario está autorizado inmediatamente. Considere o exemplo de Kubernetes Dashboard

Instalación de Kubernetes Dashboard


helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml

values_dashboard.yaml

enableInsecureLogin: true
service:
  externalPort: 80
rbac:
  clusterAdminRole: true
  create: true
serviceAccount:
  create: true
  name: 'dashboard-test'

Configuración de dereitos de acceso:

Imos crear un ClusterRoleBinding que outorgará dereitos de administrador do clúster (clúster-admin estándar de ClusterRole) para os usuarios do grupo DataOPS.


kubectl apply -f rbac.yaml

rbac.yaml


apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: dataops_group
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: DataOPS

Instalar keycloak gatekeeper:


helm repo add gabibbo97 https://gabibbo97.github.io/charts/
helm repo update
helm install gabibbo97/keycloak-gatekeeper --version 2.1.0 --name keycloak-gatekeeper -f values_proxy.yaml

valores_proxy.yaml



# Включаем ingress
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
  path: /
  hosts:
    - kubernetes-dashboard.example.org
  tls:
   - secretName: tls-keycloak
     hosts:
       - kubernetes-dashboard.example.org

# Говорим где мы будем авторизовываться у OIDC провайдера
discoveryURL: "https://keycloak.example.org/auth/realms/kubernetes"
# Имя клиента которого мы создали в Keycloak
ClientID: "kubernetes"
# Secret который я просил записать
ClientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Куда перенаправить в случае успешной авторизации. Формат <SCHEMA>://<SERVICE_NAME>.><NAMESAPCE>.<CLUSTER_NAME>
upstreamURL: "http://dashboard-kubernetes-dashboard.default.svc.cluster.local"
# Пропускаем проверку сертификата, если у нас самоподписанный
skipOpenidProviderTlsVerify: true
# Настройка прав доступа, пускаем на все path если мы в группе DataOPS
rules:
  - "uri=/*|groups=DataOPS"

Despois diso, cando tentas ir kubernetes-dashboard.example.org, seremos redirixidos a Keycloak e, en caso de autorización exitosa, chegaremos ao Panel de control xa iniciado.

instalación de pasarela

Para comodidade, pode engadir unha pasarela que xerará un ficheiro de configuración para kubectl, coa axuda do cal entraremos en Kubernetes baixo o noso usuario.


helm install --name gangway stable/gangway -f values_gangway.yaml

values_gangway.yaml


gangway:
  # Произвольное имя кластера
  clusterName: "my-k8s"
  # Где у нас OIDC провайдер
  authorizeURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/auth"
  tokenURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/token"
  audience: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/userinfo"
  # Теоритически сюда можно добавить groups которые мы замапили
  scopes: ["openid", "profile", "email", "offline_access"]
  redirectURL: "https://gangway.example.org/callback"
  # Имя клиента
  clientID: "kubernetes"
  # Секрет
  clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
  # Если оставить дефолтное значние, то за имя пользователя будет братья <b>Frist name</b> <b>Second name</b>, а при "sub" его логин
  usernameClaim: "sub"
  # Доменное имя или IP адресс API сервера
  apiServerURL: "https://192.168.99.111:8443"

# Включаем Ingress
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/proxy-buffer-size: "64k"
  path: /
  hosts:
  - gangway.example.org
  tls:
  - secretName: tls-keycloak
    hosts:
      - gangway.example.org

# Если используем самоподписанный сертификат, то его(открытый корневой сертификат) надо указать.
trustedCACert: |-
 -----BEGIN CERTIFICATE-----
 MIIDVzCCAj+gAwIBAgIBATANBgkqhkiG9w0BAQsFADA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwHhcNMjAwMjE0MDkxODAwWhcNMzAwMjE0MDkxODAwWjA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyP749PqqIRwNSqaK6qr0Zsi03G4PTCUlgaYTPZuMrwUVPK8xX2dWWs9MPRMOdXpgr8aSTZnVfmelIlVz4D7o2vK5rfmAe9GPcK0WbwKwXyhFU0flS9sU/g46ogHFrk03SZxQAeJhMLfEmAJm8LF5HghtGDs3t4uwGsB95o+lqPLiBvxRB8ZS3jSpYpvPgXAuZWKdZUQ3UUZf0X3hGLp7uIcIwJ7i4MduOGaQEO4cePeEJy9aDAO6qV78YmHbyh9kaW+1DL/Sgq8NmTgHGV6UOnAPKHTnMKXl6KkyUz8uLBGIdVhPxrlzG1EzXresJbJenSZ+FZqm3oLqZbw54Yp5hAgMBAAGjcjBwMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHISTOU/6BQqqnOZj+1xJfxpjiG0MAsGA1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAAcwHgYJYIZIAYb4QgENBBEWD3hjYSBjZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsFAAOCAQEAj7HC8ObibwOLT4ZYmISJZwub9lcE0AZ5cWkPW39j/syhdbbqjK/6jy2D3WUEbR+s1Vson5Ov7JhN5In2yfZ/ByDvBnoj7CP8Q/ZMjTJgwN7j0rgmEb3CTZvnDPAz8Ijw3FP0cjxfoZ1Z0V2F44Ry7gtLJWr06+MztXVyto3aIz1/XbMQnXYlzc3c3B5yUQIy44Ce5aLRVsAjmXNqVRmDJ2QPNLicvrhnUJsO0zFWI+zZ2hc4Ge1RotCrjfOc9hQY63jZJ17myCZ6QCD7yzMzAob4vrgmkD4q7tpGrhPY/gDcE+lUNhC7DO3l0oPy2wsnT2TEn87eyWmDiTFG9zWDew==
 -----END CERTIFICATE-----

Parece así. Permítelle descargar inmediatamente o ficheiro de configuración e xeralo mediante un conxunto de comandos:

Fixamos a autorización de ActiveDirectory a Kubernetes mediante Keycloak

Fonte: www.habr.com

Engadir un comentario