Un pequeno tutorial sobre como pode usar Keycloak para conectar Kubernetes ao seu servidor LDAP e configurar a importación de usuarios e grupos. Isto permitirache configurar RBAC para os teus usuarios e usar o proxy de autenticación para protexer o panel de control de Kubernetes e outras aplicacións que non poden autenticarse.
Instalación de Keycloak
Supoñamos que xa tes un servidor LDAP. Isto pode ser Active Directory, FreeIPA, OpenLDAP ou calquera outra cousa. Se non tes un servidor LDAP, en principio podes crear usuarios directamente na interface Keycloak ou usar provedores públicos de oidc (Google, Github, Gitlab), o resultado será case o mesmo.
En primeiro lugar, imos instalar o propio Keycloak. A instalación pódese realizar por separado ou directamente nun clúster de Kubernetes. Por regra xeral, se tes varios clústeres de Kubernetes, sería máis fácil instalalo por separado. Por outra banda sempre podes usar
Para almacenar os datos de Keycloak necesitarás unha base de datos. O predeterminado é h2
(todos os datos almacénanse localmente), pero tamén é posible utilizalos postgres
, mysql
ou mariadb
.
Se aínda así decides instalar Keycloak por separado, atoparás instrucións máis detalladas en
Configuración da federación
Primeiro de todo, imos crear un novo reino. Realm é o espazo da nosa aplicación. Cada aplicación pode ter o seu propio reino con diferentes usuarios e configuracións de autorización. O reino Mestre é usado polo propio Keycloak e está mal usalo para calquera outra cousa.
Faga clic aquí Engadir reino
opción
Valor
nome
kubernetes
Mostrar Name
Kubernetes
Nome de visualización HTML
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >
Kubernetes comproba por defecto se o correo electrónico do usuario está confirmado ou non. Xa que usamos o noso propio servidor LDAP, esta comprobación volverá case sempre false
. Desactivemos a representación desta opción en Kubernetes:
Ámbitos de cliente -> email -> Mapeadores -> Correo electrónico verificado (Eliminar)
Agora imos configurar a federación; para facelo, vai a:
Federación de usuarios -> Engadir provedor... -> ldap
Aquí tes un exemplo de configuración de FreeIPA:
opción
Valor
Nome de visualización da consola
freeipa.example.org
Vendedor
Red Hat Directory Server
Atributo LDAP UUID
ipauniqueid
URL de conexión
ldaps://freeipa.example.org
Usuarios DN
cn=users,cn=accounts,dc=example,dc=org
Enlace DN
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
Vincular credencial
<password>
Permitir a autenticación Kerberos:
on
Reino Kerberos:
EXAMPLE.ORG
Principal do servidor:
HTTP/[email protected]
KeyTab:
/etc/krb5.keytab
Usuario keycloak-svc
deben crearse previamente no noso servidor LDAP.
No caso de Active Directory, só tes que seleccionar Vendedor: Active Directory e as configuracións necesarias introduciranse no formulario automaticamente.
Faga clic aquí gardar
Agora imos adiante:
Federación de usuarios -> freeipa.example.org -> Mapeadores -> Nome
opción
Valor
Atributo Ldap
givenName
Agora imos activar a asignación de grupos:
Federación de usuarios -> freeipa.example.org -> Mapeadores -> crear
opción
Valor
nome
groups
Tipo de mapeador
group-ldap-mapper
Grupos LDAP DN
cn=groups,cn=accounts,dc=example,dc=org
Estratexia de recuperación de grupos de usuarios
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
Agora que a configuración da federación está completa, pasemos á configuración do cliente.
Configuración do cliente
Imos crear un novo cliente (unha aplicación que recibirá usuarios de Keycloak). Seguimos:
Clientes -> crear
opción
Valor
ID de cliente
kubernetes
Tipo de acceso
confidenrial
URL raíz
http://kubernetes.example.org/
URI de redirección válidos
http://kubernetes.example.org/*
URL de administrador
http://kubernetes.example.org/
Tamén creemos un ámbito para grupos:
Ámbitos de cliente -> crear
opción
Valor
Modelo
No template
nome
groups
Camiño de grupo completo
false
E configura un mapeador para eles:
Ámbitos de cliente -> grupos -> Mapeadores -> crear
opción
Valor
nome
groups
Tipo de mapeador
Group membership
Nome da reclamación do token
groups
Agora necesitamos activar o grupo de mapas no noso ámbito de cliente:
Clientes -> kubernetes -> Ámbitos de cliente -> Ámbitos de cliente predeterminados
seleccionar grupos в Ámbitos de cliente dispoñibles, prema Engadir seleccionado
Agora imos configurar a autenticación da nosa aplicación, vai a:
Clientes -> kubernetes
opción
Valor
Autorización habilitada
ON
Prememos gardar e con isto complétase a configuración do cliente, agora na pestana
Clientes -> kubernetes -> credenciais
podes conseguir Segredo que usaremos máis adiante.
Configuración de Kubernetes
Configurar Kubernetes para a autorización OIDC é bastante trivial e non moi complicado. Todo o que tes que facer é poñer o certificado CA do teu servidor OIDC /etc/kubernetes/pki/oidc-ca.pem
e engade as opcións necesarias para kube-apiserver.
Para iso, actualiza /etc/kubernetes/manifests/kube-apiserver.yaml
en todos os teus mestres:
...
spec:
containers:
- command:
- kube-apiserver
...
- --oidc-ca-file=/etc/kubernetes/pki/oidc-ca.pem
- --oidc-client-id=kubernetes
- --oidc-groups-claim=groups
- --oidc-issuer-url=https://keycloak.example.org/auth/realms/kubernetes
- --oidc-username-claim=email
...
Ademais, actualice a configuración de kubeadm no clúster para non perder esta configuración ao actualizar:
kubectl edit -n kube-system configmaps kubeadm-config
...
data:
ClusterConfiguration: |
apiServer:
extraArgs:
oidc-ca-file: /etc/kubernetes/pki/oidc-ca.pem
oidc-client-id: kubernetes
oidc-groups-claim: groups
oidc-issuer-url: https://keycloak.example.org/auth/realms/kubernetes
oidc-username-claim: email
...
Isto completa a configuración de Kubernetes. Podes repetir estes pasos en todos os teus clústeres de Kubernetes.
Autorización inicial
Despois destes pasos, xa terás un clúster de Kubernetes con autorización OIDC configurada. O único é que os teus usuarios aínda non teñen un cliente configurado nin o seu propio kubeconfig. Para resolver este problema, cómpre configurar a distribución automática de kubeconfig aos usuarios despois da autorización exitosa.
Para iso, podes usar aplicacións web especiais que che permiten autenticar o usuario e despois descargar o kubeconfig xa preparado. Unha das máis convenientes é
Para configurar Kuberos, só tes que describir o modelo para kubeconfig e executalo cos seguintes parámetros:
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template
Para información máis detallada consulte
Tamén é posible usar
O kubeconfig resultante pódese comprobar no sitio web users[].user.auth-provider.config.id-token
desde o teu kubeconfig ata o formulario do sitio web e recibe inmediatamente unha transcrición.
Configurando RBAC
Ao configurar RBAC, pode facer referencia tanto ao nome de usuario (campo name
no token jwt) e por grupo de usuarios (campo groups
en ficha jwt). Aquí tes un exemplo de configuración de dereitos para un grupo kubernetes-default-namespace-admins
:
kubernetes-default-namespace-admins.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: default-admins
namespace: default
rules:
- apiGroups:
- '*'
resources:
- '*'
verbs:
- '*'
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: kubernetes-default-namespace-admins
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: default-admins
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: kubernetes-default-namespace-admins
Podes atopar máis exemplos de RBAC en
Configurando o proxy de autenticación
Hai un proxecto marabilloso
dashboard-proxy.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: kubernetes-dashboard-proxy
spec:
replicas: 1
template:
metadata:
labels:
app: kubernetes-dashboard-proxy
spec:
containers:
- args:
- --listen=0.0.0.0:80
- --discovery-url=https://keycloak.example.org/auth/realms/kubernetes
- --client-id=kubernetes
- --client-secret=<your-client-secret-here>
- --redirection-url=https://kubernetes-dashboard.example.org
- --enable-refresh-tokens=true
- --encryption-key=ooTh6Chei1eefooyovai5ohwienuquoh
- --upstream-url=https://kubernetes-dashboard.kube-system
- --resources=uri=/*
image: keycloak/keycloak-gatekeeper
name: kubernetes-dashboard-proxy
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /oauth/health
port: 80
initialDelaySeconds: 3
timeoutSeconds: 2
readinessProbe:
httpGet:
path: /oauth/health
port: 80
initialDelaySeconds: 3
timeoutSeconds: 2
---
apiVersion: v1
kind: Service
metadata:
name: kubernetes-dashboard-proxy
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: kubernetes-dashboard-proxy
type: ClusterIP
Fonte: www.habr.com