Kubernetes Dashboard mit Keycloak OIDC: Unterschied zwischen den Versionen

Aus RT-Wiki - IT-Notizbuch
Zur Navigation springen Zur Suche springen
Zeile 20: Zeile 20:




'# /etc/kubernetes/manifests/kube-apiserver.yaml<syntaxhighlight lang="yaml" line="1">
'# /etc/kubernetes/manifests/kube-apiserver.yaml
<syntaxhighlight lang="yaml" line="1">
spec:
spec:
   containers:
   containers:
Zeile 54: Zeile 55:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml
</syntaxhighlight>address_pool.yaml<syntaxhighlight lang="yaml" line="1">
</syntaxhighlight>
address_pool.yaml
<syntaxhighlight lang="yaml" line="1">
apiVersion: metallb.io/v1beta1
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
kind: IPAddressPool
Zeile 84: Zeile 87:
Reverse Proxy um mehrere Domains auf einer IP erreichbar zu machen.
Reverse Proxy um mehrere Domains auf einer IP erreichbar zu machen.


values.yaml<syntaxhighlight lang="yaml" line="1">
values.yaml
<syntaxhighlight lang="yaml" line="1">
controller:
controller:
   config:
   config:
     proxy-buffer-size: "16k"
     proxy-buffer-size: "8k"
</syntaxhighlight>Wenn header zu groß dann 50x Fehler. Deswegen auf 16k erhöhen<syntaxhighlight lang="bash">
   
    #extraArgs:
        #default-ssl-certificate: "default/my-tls-secret"
</syntaxhighlight>'''Hinweise:'''
 
''Wenn Header zu groß dann 502 Fehler. Deswegen auf 8k erhöhen''
 
''Für TLS benötigen wir ein 'Secret" mit dem Privat Key und dem Public Certificate für die Domain, die später für das Dahsboard genutzt werden soll.''
 
''Dieses kann man als Standard direkt in der Config für Ingress-Nginx hinerlegen oder später im Ingress.''
<syntaxhighlight lang="bash">
helm upgrade --install ingress-nginx ingress-nginx \
helm upgrade --install ingress-nginx ingress-nginx \
   --repo https://kubernetes.github.io/ingress-nginx \
   --repo https://kubernetes.github.io/ingress-nginx \
Zeile 96: Zeile 110:




 
=== OAUTH2 Proxy installieren ===
 
'# oauth2-proxy installieren /
 
=== OAUTH Proxy installieren ===
Authentifizierung gegen Keyclok und Token Weiterleitung an Dashboard
Authentifizierung gegen Keyclok und Token Weiterleitung an Dashboard
values.yaml<syntaxhighlight lang="yaml" line="1">
values.yaml
<syntaxhighlight lang="yaml" line="1">
extraArgs:
extraArgs:
   provider: keycloak-oidc
   provider: keycloak-oidc
Zeile 140: Zeile 151:


=== Dem Keycloak Benutzer die Admin Rolle zuweisen ===
=== Dem Keycloak Benutzer die Admin Rolle zuweisen ===
oidc-role.yaml<syntaxhighlight lang="yaml">
oidc-role.yaml
<syntaxhighlight lang="yaml">
apiVersion: rbac.authorization.k8s.io/v1
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
kind: ClusterRoleBinding
Zeile 155: Zeile 167:
</syntaxhighlight>'''''Hinweis:'''''
</syntaxhighlight>'''''Hinweis:'''''


Der Benutzername (subjects.name) entspricht dem <code>oidc-username-claim</code> aus der "kube-apiserver.yaml".<syntaxhighlight lang="bash">
Der Benutzername (subjects.name) entspricht dem <code>oidc-username-claim</code> aus der "kube-apiserver.yaml".
<syntaxhighlight lang="bash">
kubectl apply -f oidc-role.yaml
kubectl apply -f oidc-role.yaml
</syntaxhighlight>
</syntaxhighlight>

Version vom 22. Dezember 2022, 22:39 Uhr


Test
OS AlmaLinux 8

API-Server konfigurieren

'# /etc/kubernetes/manifests/kube-apiserver.yaml

spec:
  containers:
  - command:
    - kube-apiserver
... 
	- --oidc-issuer-url=https://<my.keycloak.server>/realms/<Realm-Name>
    - --oidc-client-id=k8s-cluster
    - --oidc-username-claim=email
    #- --oidc-ca-file=/path/to/oidc-ca.pem
	#- --oidc-username-prefix=-

Hinweis:

Wenn oidc-username-claim NICHT 'email' ist, wird standardmäßig die 'issuer-url' als Prefix benutzt (z.B. https://<my.keycloak.server>/realms/<Realm-Name>:<username>).

Um den Prefix zu dekativieren muss als Wert '-' angegeben werden.

Load Balancer installieren

'# MetalLB installieren / Aktiviert den Service Typ "LoadBalancer" der sonst nur in Cloud Umgebungen verfügbar ist

'# Bildet IPs aus dem Cluster in einen physischen Adressbereich des LANs

Ports in der Firewall öffnen

firewall-cmd --permanent --add-port=7946/tcp
firewall-cmd --permanent --add-port=7946/udp
firewall-cmd --reload

Installieren

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml

address_pool.yaml

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.1.240-192.168.1.250

l2_advert.yaml

apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system
  #- first-pool

IPAddressPools können explizit ausgewählt werden. Ohne Angabe werden alle Pools dem L2Advertisement zugeordnet.

kubectl apply -f address_pool.yaml
kubectl apply -f l2_advert.yaml

Reverse Proxy installieren

Reverse Proxy um mehrere Domains auf einer IP erreichbar zu machen.

values.yaml

controller:
  config:
    proxy-buffer-size: "8k"
    
    #extraArgs:
        #default-ssl-certificate: "default/my-tls-secret"

Hinweise:

Wenn Header zu groß dann 502 Fehler. Deswegen auf 8k erhöhen

Für TLS benötigen wir ein 'Secret" mit dem Privat Key und dem Public Certificate für die Domain, die später für das Dahsboard genutzt werden soll.

Dieses kann man als Standard direkt in der Config für Ingress-Nginx hinerlegen oder später im Ingress.

helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --create-namespace \
  -f values.yaml


OAUTH2 Proxy installieren

Authentifizierung gegen Keyclok und Token Weiterleitung an Dashboard values.yaml

extraArgs:
  provider: keycloak-oidc
  #provider-display-name: OIDC Login
  #http-address: "0.0.0.0:4180"
  #skip-provider-button: true
  #skip-jwt-bearer-tokens: true
  #ssl-insecure-skip-verify: true
  #ssl-upstream-insecure-skip-verify: true
  #pass-access-token: true
  #pass-authorization-header: true
  set-authorization-header: true
  #set-xauthrequest: true
  client-id: XXX # Change XXX to your client_id
  client-secret: XXX # Change XXX to your client_secret
  cookie-secret: XXX # Generate with 'openssl rand -base64 32 | head -c 32 | base64'
  #cookie-secure: false
  #cookie-httponly: false
  cookie-refresh: 4m # Zeit nach der ein neuer Access Token über den Refresh Token bezogen wird
  oidc-issuer-url: "https://<my.keycloak.server>/realms/<Realm-Name>"
  redirect-url: "https://<my.k8s.dashboard>/oauth2/callback"
  #whitelist-domain: ["*"]
  #allowed-group: ["*"]
  #allowed-role: ["*"]
  #email-domain: ["*"]

Hinweis:

Der Parameter cookie-refresh sollte kleiner als die "Access Token Lifespan" in Keycloak sein ("Realm Settings->Token").

helm upgrade --install oauth2-proxy oauth2-proxy \
  --repo https://oauth2-proxy.github.io/manifests \
  --namespace kubernetes-dashboard \
  -f values.yaml

Dem Keycloak Benutzer die Admin Rolle zuweisen

oidc-role.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: oidc-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: User
  name: user@keycloak.com
  namespace: kube-system

Hinweis:

Der Benutzername (subjects.name) entspricht dem oidc-username-claim aus der "kube-apiserver.yaml".

kubectl apply -f oidc-role.yaml