A service may need to access Keycloak to perform various tasks. These typical uses for a service to access Keycloak include creating a new service account, creating a new user, etc. These operations require Keycloak administrative access. As part of the System Management Services (SMS) installation process, Keycloak is initialized with a Master realm. An administrative client and user are created within this realm. The system installation process adds the information needed for the Keycloak administrator's authentication into a Kubernetes secret that can be accessed by any pod. Using this information and the Keycloak REST API, a service can create an account in the Shasta
realm. The Keycloak master administrative authentication information is located in the keycloak-master-admin-auth
secret, which includes the following fields:
-
client-id
- Client ID for administrative operations -
user
- Username for the Keycloak Master admin. -
password
- Password for the Keycloak Master admin. -
internal_token_url
- URL that can be used to get a token, such as https://istio-ingressgateway.istio-system.svc.cluster.local/keycloak/realms/master/protocol/openid-connect/token.The pod in the following example gets a Keycloak Master admin token and makes a request to create a client with a user ID attribute mapper.
kubectl apply -f - <<EOF apiVersion: v1 kind: Pod metadata: name: kc-admin-example namespace: services spec: containers: - name: kc-admin-example image: alpine command: - sh - -c - >- apk update && apk add --no-cache curl jq && echo endpoint: \$(cat /mnt/auth/internal_token_url) && echo client_id: \$(cat /mnt/auth/client-id) && echo user: \$(cat /mnt/auth/user) && TOKEN=\$(curl -s --cacert /mnt/shasta-ca/certificate_authority.crt -d grant_type=password -d client_id=\$(cat /mnt/auth/client-id) -d username=\$(cat /mnt/auth/user) -d password=\$(cat /mnt/auth/password) \$(cat /mnt/auth/internal_token_url) | jq -r .access_token) && echo "=== Making request with token \$(echo \$TOKEN | head -c10)... ===" && curl -is --cacert /mnt/shasta-ca/certificate_authority.crt -H "Authorization: Bearer \$TOKEN" -H "Content-Type: application/json" -d '{"clientId": "example", "publicClient": true, "standardFlowEnabled": false, "implicitFlowEnabled": false, "directAccessGrantsEnabled": true, "protocolMappers": [ {"name": "uid-user-attribute-mapper", "protocolMapper": "oidc-usermodel-attribute-mapper", "protocol": "openid-connect", "config": {"user.attribute": "uid", "claim.name": "uid", "access.token.claim": false, "userinfo.token.claim": true}}]}' https://istio-ingressgateway.istio-system.svc.cluster.local/keycloak/admin/realms/shasta/clients volumeMounts: - name: ca-vol mountPath: /mnt/shasta-ca - name: auth-vol mountPath: '/mnt/auth' readOnly: true volumes: - name: ca-vol configMap: name: cray-configmap-ca-public-key - name: auth-vol secret: secretName: keycloak-master-admin-auth restartPolicy: Never EOF
kubectl logs -n services kc-admin-example
Example output:
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz v3.8.1-115-ge3ed6b4e31 [http://dl-cdn.alpinelinux.org/alpine/v3.8/main] v3.8.1-112-g45bdd0edfb [http://dl-cdn.alpinelinux.org/alpine/v3.8/community] OK: 9546 distinct packages available fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/x86_64/APKINDEX.tar.gz (1/7) Installing ca-certificates (20171114-r3) (2/7) Installing nghttp2-libs (1.32.0-r0) (3/7) Installing libssh2 (1.8.0-r3) (4/7) Installing libcurl (7.61.1-r1) (5/7) Installing curl (7.61.1-r1) (6/7) Installing oniguruma (6.8.2-r0) (7/7) Installing jq (1.6_rc1-r1) Executing busybox-1.28.4-r1.trigger Executing ca-certificates-20171114-r3.trigger OK: 7 MiB in 20 packages endpoint: https://istio-ingressgateway.istio-system.svc.cluster.local/keycloak/realms/master/protocol/openid-connect/token client_id: admin-cli user: admin === Making request with token eyJhbGciOi... === HTTP/1.1 201 Created Content-Length: 0 Connection: keep-alive Location: https://istio-ingressgateway.istio-system.svc.cluster.local/keycloak/admin/realms/shasta/clients/070c8537-6c46-43a4-b0bb-209b3c4b94c6 Date: Fri, 30 Nov 2018 20:07:39 GMT X-Kong-Upstream-Latency: 27 X-Kong-Proxy-Latency: 1 Via: kong/0.14.1
The new example client is now visible in the Keycloak administrative web application.