Apertamos a autorização do ActiveDirectory para o Kubernetes com Keycloak

Este artigo foi escrito para expandir um existente , mas fala sobre os recursos do pacote com o Microsoft ActiveDirectory e o complementa.

Neste artigo, mostrarei como instalar e configurar:

  • Keycloak é um projeto de código aberto. Que fornece um único ponto de entrada para aplicativos. Funciona com muitos protocolos, incluindo o LDAP e o OpenID que nos interessam.
  • Keycloak gatekeeper - aplicativo proxy reverso que permite integrar a autorização através do Keycloak.
  • Gangway - o aplicativo que gera uma configuração para o kubectl com o qual você pode efetuar login e conectar-se à API do Kubernetes via OpenID

Como os direitos funcionam no Kubernetes.


Podemos gerenciar direitos de usuário / grupo usando o RBAC, muitos artigos já foram criados sobre isso, não vou me deter sobre isso em detalhes. O problema é que você pode usar o RBAC para restringir os direitos do usuário, mas o Kubernetes não sabe nada sobre os usuários. Acontece que você precisa de um mecanismo de entrega do usuário no Kubernetes. Para fazer isso, adicionaremos um provedor OpenID ao Kuberntes, que dirá que esse usuário realmente existe, e o próprio Kubernetes dará direitos a ele.

Treinamento

  • Você precisará de um cluster ou minikube do Kubernetes
  • Diretório ativo
  • Domínios:
    keycloak.example.org
    kubernetes-dashboard.example.org
    gangway.example.org
  • Certificado para domínios ou certificado autoassinado

Não vou me debruçar sobre como criar um certificado autoassinado, você precisa criar 2 certificados, este é o cliente raiz (Autoridade de Certificação) e curinga para o domínio * .example.org

Depois de receber / gravar os certificados, o cliente deve ser adicionado ao Kubernetes, para isso crie um segredo para isso:

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

Em seguida, vamos usá-lo para o nosso controlador Ingress

Instalar Keycloak


Eu decidi que a maneira mais fácil de usar soluções prontas para isso, ou seja, helm chart-s.

Instale o repositório e atualize-o:

helm repo add codecentric https://codecentric.imtqy.com/helm-charts
helm repo update

Crie o arquivo keycloak.yml com o seguinte conteúdo:

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


Configuração da federação


Em seguida, vá para a interface da web keycloak.example.org

No canto esquerdo, clique em Adicionar região
ChaveValor
Nomekubernetes
Nome em ExibiçãoKubernetes

Desabilitar a verificação da confirmação de email do usuário:
Escopos do cliente -> Email -> Mapeadores -> Email verificado (Excluir)

Configuramos a federação para importar usuários do ActiveDirectory, deixarei as capturas de tela abaixo, acho que será mais claro.

Federação do usuário -> Adicionar provedor ... -> ldap

Configuração da federação



Se tudo estiver bem, depois de clicar no botão Sincronizar todos os usuários , você receberá uma mensagem sobre a importação bem-sucedida de usuários.

Em seguida, precisamos mapear nossos grupos

Federação de usuários -> ldap_localhost -> Mapeadores -> Criar

Criação do Mapper


Configuração do cliente


É necessário criar um cliente, em termos de Keycloak, é um aplicativo que será autorizado por ele. Vou destacar os pontos importantes na captura de tela em vermelho.

Clientes -> Criar

Configuração do cliente


Crie um grupo para grupos:

Escopos do Cliente -> Criar

Fazendo scoupe


E configure o mapeador para eles:

Escopos do Cliente -> grupos -> Mapeadores -> Criar

Mapper


Adicione o mapeamento de nossos grupos aos escopos de cliente padrão:

Clientes -> kubernetes -> escopos de cliente -> escopos de cliente padrão
Selecione grupos em Escopos de cliente disponíveis , clique em Adicionar selecionado.

Temos um segredo (e o escrevemos no thread) que usaremos para autorização no Keycloak:

Clientes -> kubernetes -> Credenciais -> Segredo
Este é o fim da instalação, mas recebi um erro quando, após uma autorização bem-sucedida, recebi o erro 403. Relatório de bug .

Correção:

escopos do cliente -> funções -> Mapeadores -> Criar

Mapper


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();


Configurar o Kubernetes


Precisamos indicar onde está o nosso certificado raiz do site e onde o provedor OIDC está localizado.
Para fazer isso, edite o arquivo /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
...


Atualize a configuração do kubeadm no cluster:

configuração do kubeadm
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
...


Configurar o proxy de autenticação


Você pode usar o gatekeeper de capa de chave para proteger seu aplicativo da web. Além do fato de esse proxy reverso autorizar o usuário antes de mostrar a página, ele também transmitirá informações sobre você nos cabeçalhos para o aplicativo final. Portanto, se seu aplicativo oferecer suporte ao OpenID, o usuário efetuará login imediatamente. Vejamos o exemplo do painel Kubernetes

Instalar o painel do Kubernetes



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'


Definindo permissões:


Crie um ClusterRoleBinding que concederá direitos de administrador de cluster (ClusterRole padrão cluster-admin) para usuários no 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


Instale o gatekeeper de capa de chave:



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

values_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"


Depois disso, quando você tentar acessar o kubernetes-dashboard.example.org , você será redirecionado para o Keycloak e, se a autorização for bem-sucedida, já estaremos conectados ao Dashboard.

Instalação do passadiço


Por conveniência, você pode adicionar um corredor que irá gerar um arquivo de configuração para o kubectl, com o qual já entraremos no Kubernetes sob nosso usuário.


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 algo assim. Permite baixar imediatamente o arquivo de configuração e criá-lo usando um conjunto de comandos:


All Articles