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.orgDepois 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 IngressInstalar 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.ymlkeycloak:
#
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.orgNo canto esquerdo, clique em Adicionar regiãoDesabilitar 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 ... -> ldapConfiguraçã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 gruposFederação de usuários -> ldap_localhost -> Mapeadores -> CriarConfiguraçã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 -> CriarCrie um grupo para grupos:Escopos do Cliente -> CriarE configure o mapeador para eles:Escopos do Cliente -> grupos -> Mapeadores -> CriarAdicione o mapeamento de nossos grupos aos escopos de cliente padrão:Clientes -> kubernetes -> escopos de cliente -> escopos de cliente padrãoSelecione 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 -> SegredoEste é 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 -> CriarCódigo de script
token.addAudience(token.getIssuedFor());
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.yamlkube-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 kubeadmkubectl 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 KubernetesInstalar o painel do Kubernetes
helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml
values_dashboard.yamlenableInsecureLogin: 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:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
path: /
hosts:
- kubernetes-dashboard.example.org
tls:
- secretName: tls-keycloak
hosts:
- kubernetes-dashboard.example.org
discoveryURL: "https://keycloak.example.org/auth/realms/kubernetes"
ClientID: "kubernetes"
ClientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
upstreamURL: "http://dashboard-kubernetes-dashboard.default.svc.cluster.local"
skipOpenidProviderTlsVerify: true
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"
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"
scopes: ["openid", "profile", "email", "offline_access"]
redirectURL: "https://gangway.example.org/callback"
clientID: "kubernetes"
clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
usernameClaim: "sub"
apiServerURL: "https://192.168.99.111:8443"
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: