소스 검색

oauth with oidc (depends on deploy-rhsso)

Grega Bremec 2 년 전
부모
커밋
7308caca04
2개의 변경된 파일219개의 추가작업 그리고 0개의 파일을 삭제
  1. 9 0
      integrate-rhsso.yml
  2. 210 0
      roles/integrate-rhsso-ocp/tasks/main.yml

+ 9 - 0
integrate-rhsso.yml

@@ -0,0 +1,9 @@
+---
+- name: Integrate a configured RHSSO instance with OCP
+  hosts: workstation.lab.example.com
+  gather_subset: min
+  become: no
+  roles:
+    - role: integrate-rhsso-ocp
+      tags: integrate
+...

+ 210 - 0
roles/integrate-rhsso-ocp/tasks/main.yml

@@ -0,0 +1,210 @@
+---
+# A number of checks to be performed, but ultimately modify oauth/cluster with
+# an additional identityProvider for OIDC.
+#
+- name: Check for the KeyCloak resource
+  k8s_info:
+    kubeconfig: tmp/kubeconfig-ocp4
+    validate_certs: no
+    api_version: keycloak.org/v1alpha1
+    kind: keycloak
+    namespace: rhsso
+    name: rhsso
+  register: sso_cr
+
+- assert:
+    that:
+      - (sso_cr.resources | length) == 1
+      - sso_cr.resources[0].spec.externalAccess.enabled
+      - sso_cr.resources[0].status.ready
+      - sso_cr.resources[0].status.phase == "reconciling"
+    fail_msg: "ERROR: RHSSO instance is missing or not configured correctly."
+    success_msg: "OK: RHSSO instance is configured correctly."
+
+- name: Store RHSSO URL as a fact
+  set_fact:
+    sso_url: "{{ sso_cr.resources[0].status.externalURL }}"
+
+- name: Check for the realm resource
+  k8s_info:
+    kubeconfig: tmp/kubeconfig-ocp4
+    validate_certs: no
+    api_version: keycloak.org/v1alpha1
+    kind: keycloakrealm
+    namespace: rhsso
+    name: sample-realm
+  register: sso_realm
+
+- assert:
+    that:
+      - (sso_realm.resources | length) == 1
+      - sso_realm.resources[0].spec.realm.id == "sample"
+      - sso_realm.resources[0].spec.realm.realm == "sample"
+      - sso_realm.resources[0].spec.realm.enabled
+      - sso_realm.resources[0].status.ready
+      - sso_realm.resources[0].status.phase == "reconciling"
+    fail_msg: "ERROR: RHSSO sample realm is missing or not configured correctly."
+    success_msg: "OK: RHSSO sample realm is configured correctly."
+
+- name: Check that the client is configured correctly
+  k8s_info:
+    kubeconfig: tmp/kubeconfig-ocp4
+    validate_certs: no
+    api_version: keycloak.org/v1alpha1
+    kind: keycloakclient
+    namespace: rhsso
+    name: sample-client
+  register: sso_client
+
+- assert:
+    that:
+      - (sso_client.resources | length) == 1
+      - sso_client.resources[0].spec.client.clientId == "sample-client"
+      - '"offline_access" in sso_client.resources[0].spec.client.defaultClientScopes'
+      - sso_client.resources[0].status.ready
+      - sso_client.resources[0].status.phase == "reconciling"
+    fail_msg: "ERROR: RHSSO sample-client is missing or not configured correctly."
+    success_msg: "OK: RHSSO sample-client is configured correctly."
+
+- name: Store sample-client's secret name as a fact
+  set_fact:
+    sso_client_secret: "{{ sso_client.resources[0].status.secondaryResources.Secret[0] }}"
+
+- name: Read the sample-client's actual secret
+  k8s_info:
+    kubeconfig: tmp/kubeconfig-ocp4
+    validate_certs: no
+    api_version: v1
+    kind: secret
+    namespace: rhsso
+    name: "{{ sso_client_secret }}"
+  register: sso_client_secret
+
+- assert:
+    that:
+      - (sso_client_secret.resources | length) == 1
+      - sso_client_secret.resources[0].data.CLIENT_SECRET is defined
+    fail_msg: "ERROR: sample-client secret is missing."
+    success_msg: "OK: sample-client secret found."
+
+- name: Store the secret as a fact
+  set_fact:
+    sso_client_secret: "{{ sso_client_secret.resources[0].data.CLIENT_SECRET }}"
+
+- name: Check that the ingresscontroller's defaultCertificate is set
+  k8s_info:
+    kubeconfig: tmp/kubeconfig-ocp4
+    validate_certs: no
+    api_version: operator.openshift.io/v1
+    kind: ingresscontroller
+    namespace: openshift-ingress-operator
+    name: default
+  register: ingress_ca
+
+- name: Get the router's default CA content
+  k8s_info:
+    kubeconfig: tmp/kubeconfig-ocp4
+    validate_certs: no
+    api_version: v1
+    kind: secret
+    namespace: openshift-config
+    name: "{{ ingress_ca.resources[0].spec.defaultCertificate.name }}"
+  register: ingress_ca
+
+- name: Store the CA cert as an actual fact
+  set_fact:
+    ingress_ca: "{{ ingress_ca.resources[0].data['tls.crt'] }}"
+
+- name: Check on oauth/cluster
+  k8s_info:
+    kubeconfig: tmp/kubeconfig-ocp4
+    validate_certs: no
+    api_version: config.openshift.io/v1
+    kind: oauth
+    name: cluster
+  register: cluster_auth
+
+- assert:
+    that:
+      - (cluster_auth.resources | length) == 1
+      - (cluster_auth.resources[0].spec.identityProviders | length) >= 1
+      - cluster_auth.resources[0].spec.identityProviders[0].type == "HTPasswd"
+    fail_msg: "ERROR: OpenShift cluster authentication is not configured correctly."
+    success_msg: "OK: OpenShift cluster authentication is configured correctly."
+
+- name: Make certain client secret exists in openshift-config
+  k8s:
+    kubeconfig: tmp/kubeconfig-ocp4
+    validate_certs: no
+    api_version: v1
+    kind: secret
+    namespace: openshift-config
+    name: sso-client-secret
+    definition:
+      metadata:
+        labels:
+          app: sso
+      type: Opaque
+      data:
+        clientSecret: "{{ sso_client_secret }}"
+
+- name: Make certain router CA CM exists in openshift-config
+  k8s:
+    kubeconfig: tmp/kubeconfig-ocp4
+    validate_certs: no
+    api_version: v1
+    kind: configmap
+    namespace: openshift-config
+    name: sso-ingress-ca
+    definition:
+      metadata:
+        labels:
+          app: sso
+      data:
+        ca.crt: "{{ ingress_ca | string | b64decode }}"
+
+- name: Figure out what to do with oauth/cluster - option 1
+  set_fact:
+    oauth_op: add
+    oauth_path: /spec/identityProviders/-
+  when: (cluster_auth.resources[0].spec.identityProviders | length) == 1
+
+- name: Figure out what to do with oauth/cluster - option 2
+  set_fact:
+    oauth_op: replace
+    oauth_path: /spec/identityProviders/1
+  when: (cluster_auth.resources[0].spec.identityProviders | length) == 2
+
+- name: Patch oauth/cluster
+  kubernetes.core.k8s_json_patch:
+    kubeconfig: tmp/kubeconfig-ocp4
+    validate_certs: no
+    api_version: config.openshift.io/v1
+    kind: oauth
+    name: cluster
+    patch:
+      - op: "{{ oauth_op }}"
+        path: "{{ oauth_path }}"
+        value:
+          name: oidc_sso
+          mappingMethod: claim 
+          type: OpenID
+          openID:
+            clientID: sample-client
+            clientSecret: 
+              name: sso-client-secret
+            ca:
+              name: sso-ingress-ca
+            claims: 
+              preferredUsername:
+              - preferred_username
+              name:
+              - name
+              email:
+              - email
+              groups:
+              - groups
+            issuer: "{{ sso_url }}/auth/realms/sample"
+
+# TODO: Check that all keycloakuser (or all users?) have offline_access realm role?
+...