forked from k-space/kube
		
	oidc: add oidc-gateway manifests
This commit is contained in:
		
							
								
								
									
										276
									
								
								oidc-gateway/crds.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										276
									
								
								oidc-gateway/crds.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,276 @@ | ||||
| --- | ||||
| apiVersion: apiextensions.k8s.io/v1 | ||||
| kind: CustomResourceDefinition | ||||
| metadata: | ||||
|   name: oidcgatewayusers.codemowers.io | ||||
| spec: | ||||
|   group: codemowers.io | ||||
|   names: | ||||
|     plural: oidcgatewayusers | ||||
|     singular: oidcgatewayuser | ||||
|     kind: OIDCGWUser | ||||
|   scope: Namespaced | ||||
|   versions: | ||||
|     - name: v1alpha1 | ||||
|       served: true | ||||
|       storage: true | ||||
|       subresources: | ||||
|         status: { } | ||||
|       schema: | ||||
|         openAPIV3Schema: | ||||
|           required: | ||||
|             - spec | ||||
|           type: object | ||||
|           properties: | ||||
|             spec: | ||||
|               type: object | ||||
|               properties: | ||||
|                 email: | ||||
|                   type: string | ||||
|                 customGroups: | ||||
|                   type: array | ||||
|                   items: | ||||
|                     type: object | ||||
|                     properties: | ||||
|                       prefix: | ||||
|                         type: string | ||||
|                       name: | ||||
|                         type: string | ||||
|                 customProfile: | ||||
|                   type: object | ||||
|                   properties: | ||||
|                     name: | ||||
|                       type: string | ||||
|                     company: | ||||
|                       type: string | ||||
|                 githubEmails: | ||||
|                   type: array | ||||
|                   items: | ||||
|                     type: object | ||||
|                     properties: | ||||
|                       email: | ||||
|                         type: string | ||||
|                       primary: | ||||
|                         type: boolean | ||||
|                         default: false | ||||
|                 githubGroups: | ||||
|                   type: array | ||||
|                   items: | ||||
|                     type: object | ||||
|                     properties: | ||||
|                       prefix: | ||||
|                         type: string | ||||
|                         enum: [ 'github.com' ] | ||||
|                       name: | ||||
|                         type: string | ||||
|                 githubProfile: | ||||
|                   type: object | ||||
|                   properties: | ||||
|                     name: | ||||
|                       type: string | ||||
|                     company: | ||||
|                       type: string | ||||
|                     id: | ||||
|                       type: integer | ||||
|                     login: | ||||
|                       type: string | ||||
|                 slackId: | ||||
|                   type: string | ||||
|             status: | ||||
|               type: object | ||||
|               properties: | ||||
|                 primaryEmail: | ||||
|                   type: string | ||||
|                 emails: | ||||
|                   type: array | ||||
|                   items: | ||||
|                     type: string | ||||
|                 groups: | ||||
|                   type: array | ||||
|                   items: | ||||
|                     type: object | ||||
|                     properties: | ||||
|                       prefix: | ||||
|                         type: string | ||||
|                       name: | ||||
|                         type: string | ||||
|                 profile: | ||||
|                   type: object | ||||
|                   properties: | ||||
|                     name: | ||||
|                       type: string | ||||
|                     company: | ||||
|                       type: string | ||||
|                 slackId: | ||||
|                   type: string | ||||
|                 conditions: | ||||
|                   type: array | ||||
|                   items: | ||||
|                     type: object | ||||
|                     x-kubernetes-embedded-resource: true | ||||
|                     x-kubernetes-preserve-unknown-fields: true | ||||
|       additionalPrinterColumns: | ||||
|         - name: Name | ||||
|           type: string | ||||
|           jsonPath: .status.profile.name | ||||
|         - name: Emails | ||||
|           type: string | ||||
|           jsonPath: .status.emails | ||||
|         - name: Groups | ||||
|           type: string | ||||
|           jsonPath: .status.groups | ||||
| --- | ||||
| apiVersion: apiextensions.k8s.io/v1 | ||||
| kind: CustomResourceDefinition | ||||
| metadata: | ||||
|   name: oidcgatewayclients.codemowers.io | ||||
| spec: | ||||
|   group: codemowers.io | ||||
|   names: | ||||
|     plural: oidcgatewayclients | ||||
|     singular: oidcgatewayclient | ||||
|     kind: OIDCGWClient | ||||
|   scope: Namespaced | ||||
|   versions: | ||||
|     - name: v1alpha1 | ||||
|       served: true | ||||
|       storage: true | ||||
|       subresources: | ||||
|         status: { } | ||||
|       schema: | ||||
|         openAPIV3Schema: | ||||
|           required: | ||||
|             - spec | ||||
|           type: object | ||||
|           properties: | ||||
|             spec: | ||||
|               type: object | ||||
|               required: | ||||
|                 - redirectUris # TODO: add validation | ||||
|                 - grantTypes | ||||
|                 - responseTypes | ||||
|               properties: | ||||
|                 uri: | ||||
|                   type: string | ||||
|                 displayName: | ||||
|                   type: string | ||||
|                 redirectUris: | ||||
|                   type: array | ||||
|                   items: | ||||
|                     type: string | ||||
|                 grantTypes: | ||||
|                   type: array | ||||
|                   items: | ||||
|                     type: string | ||||
|                     enum: [ 'implicit', 'authorization_code', 'refresh_token' ] | ||||
|                 responseTypes: | ||||
|                   type: array | ||||
|                   items: | ||||
|                     type: string | ||||
|                     enum: [ 'code id_token', 'code', 'id_token', 'none' ] | ||||
|                 tokenEndpointAuthMethod: | ||||
|                   type: string | ||||
|                   enum: [ 'client_secret_basic', 'client_secret_jwt', 'client_secret_post', 'private_key_jwt', 'none' ] | ||||
|                 idTokenSignedResponseAlg: | ||||
|                   type: string | ||||
|                   enum: [ 'PS256','RS256', 'ES256' ] | ||||
|                 allowedGroups: | ||||
|                   type: array | ||||
|                   items: | ||||
|                     type: string | ||||
|                 availableScopes: | ||||
|                   type: array | ||||
|                   items: | ||||
|                     type: string | ||||
|                     enum: [ 'openid', 'profile', 'offline_access' ] | ||||
|                   default: [ 'openid' ] | ||||
|                 pkce: | ||||
|                   type: boolean | ||||
|                   default: true | ||||
|             status: | ||||
|               type: object | ||||
|               properties: | ||||
|                 gateway: | ||||
|                   type: string | ||||
|       additionalPrinterColumns: | ||||
|         - name: Gateway | ||||
|           type: string | ||||
|           description: 'OIDC gateway deployment which manages this client' | ||||
|           jsonPath: .status.gateway | ||||
|         - name: Uris | ||||
|           type: string | ||||
|           description: 'Redirect URLs configured for this client' | ||||
|           jsonPath: .spec.redirectUris | ||||
|         - name: Allowed groups | ||||
|           type: string | ||||
|           description: 'Groups allowed to this client' | ||||
|           jsonPath: .spec.allowedGroups | ||||
| --- | ||||
| apiVersion: apiextensions.k8s.io/v1 | ||||
| kind: CustomResourceDefinition | ||||
| metadata: | ||||
|   name: oidcgatewaymiddlewareclients.codemowers.io | ||||
| spec: | ||||
|   group: codemowers.io | ||||
|   names: | ||||
|     plural: oidcgatewaymiddlewareclients | ||||
|     singular: oidcgatewaymiddlewareclient | ||||
|     kind: OIDCGWMiddlewareClient | ||||
|   scope: Namespaced | ||||
|   versions: | ||||
|     - name: v1alpha1 | ||||
|       served: true | ||||
|       storage: true | ||||
|       subresources: | ||||
|         status: { } | ||||
|       schema: | ||||
|         openAPIV3Schema: | ||||
|           required: | ||||
|             - spec | ||||
|           type: object | ||||
|           properties: | ||||
|             spec: | ||||
|               type: object | ||||
|               properties: | ||||
|                 uri: | ||||
|                   type: string | ||||
|                 displayName: | ||||
|                   type: string | ||||
|                 allowedGroups: | ||||
|                   type: array | ||||
|                   items: | ||||
|                     type: string | ||||
|                 headerMapping: | ||||
|                   type: object | ||||
|                   default: | ||||
|                     user: 'Remote-User' | ||||
|                     name: 'Remote-Name' | ||||
|                     email: 'Remote-Email' | ||||
|                     groups: 'Remote-Groups' | ||||
|                   properties: | ||||
|                     user: | ||||
|                       type: string | ||||
|                     name: | ||||
|                       type: string | ||||
|                     email: | ||||
|                       type: string | ||||
|                     groups: | ||||
|                       type: string | ||||
|             status: | ||||
|               type: object | ||||
|               properties: | ||||
|                 gateway: | ||||
|                   type: string | ||||
|       additionalPrinterColumns: | ||||
|         - name: Gateway | ||||
|           type: string | ||||
|           description: 'OIDC gateway deployment which manages this client' | ||||
|           jsonPath: .status.gateway | ||||
|         - name: Uri | ||||
|           type: string | ||||
|           description: 'URL configured for this client' | ||||
|           jsonPath: .spec.uri | ||||
|         - name: Allowed groups | ||||
|           type: string | ||||
|           description: 'Groups allowed to this client' | ||||
|           jsonPath: .spec.allowedGroups | ||||
							
								
								
									
										157
									
								
								oidc-gateway/deployment.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								oidc-gateway/deployment.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,157 @@ | ||||
| --- | ||||
| apiVersion: rbac.authorization.k8s.io/v1 | ||||
| kind: ClusterRoleBinding | ||||
| metadata: | ||||
|   name: oidc-gateway-default | ||||
| roleRef: | ||||
|   apiGroup: rbac.authorization.k8s.io | ||||
|   kind: ClusterRole | ||||
|   name: oidc-gateway | ||||
| subjects: | ||||
|   - kind: ServiceAccount | ||||
|     name: oidc-gateway | ||||
| --- | ||||
| apiVersion: v1 | ||||
| kind: ServiceAccount | ||||
| metadata: | ||||
|   name: oidc-gateway | ||||
| --- | ||||
| apiVersion: codemowers.io/v1alpha1 | ||||
| kind: KeyDBCluster | ||||
| spec: | ||||
|   persistent: false | ||||
|   replicas: 3 | ||||
| --- | ||||
| apiVersion: networking.k8s.io/v1 | ||||
| kind: Ingress | ||||
| metadata: | ||||
|   name: oidc-gateway | ||||
|   annotations: | ||||
|     kubernetes.io/ingress.class: traefik | ||||
|     traefik.ingress.kubernetes.io/router.entrypoints: websecure | ||||
|     traefik.ingress.kubernetes.io/router.tls: "true" | ||||
|     external-dns.alpha.kubernetes.io/target: traefik.k-space.ee | ||||
| spec: | ||||
|   rules: | ||||
|     - host: auth2.k-space.ee | ||||
|       http: | ||||
|         paths: | ||||
|           - pathType: Prefix | ||||
|             path: "/" | ||||
|             backend: | ||||
|               service: | ||||
|                 name: oidc-gateway | ||||
|                 port: | ||||
|                   number: 3000 | ||||
|   tls: | ||||
|     - hosts: | ||||
|         - "*.k-space.ee" | ||||
| --- | ||||
| apiVersion: v1 | ||||
| kind: Service | ||||
| metadata: | ||||
|   name: oidc-gateway | ||||
| spec: | ||||
|   type: ClusterIP | ||||
|   selector: | ||||
|     app: oidc-gateway | ||||
|   ports: | ||||
|     - protocol: TCP | ||||
|       port: 3000 | ||||
| --- | ||||
| apiVersion: batch/v1 | ||||
| kind: Job | ||||
| metadata: | ||||
|   name: oidc-key-manager | ||||
| spec: | ||||
|   template: | ||||
|     spec: | ||||
|       serviceAccountName: oidc-gateway | ||||
|       containers: | ||||
|         - name: oidc-key-manager | ||||
|           image: codemowers/oidc-gateway | ||||
|           command: [ '/app/node_modules/.bin/key-manager', 'initialize', '-c', 'cluster' ] | ||||
|       restartPolicy: Never | ||||
| --- | ||||
| apiVersion: apps/v1 | ||||
| kind: Deployment | ||||
| metadata: | ||||
|   name: oidc-gateway | ||||
|   labels: | ||||
|     app: oidc-gateway | ||||
| spec: | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: oidc-gateway | ||||
|   replicas: 3 | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: oidc-gateway | ||||
|     spec: | ||||
|       serviceAccountName: oidc-gateway | ||||
|       containers: | ||||
|         - name: oidc-gateway | ||||
|           image: codemowers/oidc-gateway | ||||
|           ports: | ||||
|             - containerPort: 3000 | ||||
|           env: | ||||
|             - name: ISSUER_URL | ||||
|               value: 'https://auth2.k-space.ee/' | ||||
|             - name: DEPLOYMENT_NAME | ||||
|               valueFrom: | ||||
|                 fieldRef: | ||||
|                   fieldPath: metadata.labels['app'] | ||||
|             - name: GROUP_PREFIX | ||||
|               value: 'k-space' | ||||
|             - name: ADMIN_GROUP | ||||
|               value: 'k-space:admins' | ||||
| #            - name: REQUIRED_GROUP # allow everyone to authenticate, limit access to services on client level. | ||||
| #              value: 'codemowers:users' | ||||
|             - name: GITHUB_ORGANIZATION # if not set, gateway will add user groups from all organizations that (s)he granted access for. | ||||
|               value: 'codemowers' | ||||
|             - name: ENROLL_USERS # allow everyone to self-register | ||||
|               value: 'true' | ||||
|             - name: NAMESPACE_SELECTOR | ||||
|               value: '*' | ||||
|             - name: PREFERRED_EMAIL_DOMAIN # try to make primary email consistent | ||||
|               value: 'k-space.ee' | ||||
|           envFrom: | ||||
|             - secretRef: | ||||
|                 name: redis-oidc-gateway-owner-secrets | ||||
|             - secretRef: | ||||
|                 name: oidc-keys | ||||
|             - secretRef: | ||||
|                 name: oidc-gateway-email-credentials | ||||
|             - secretRef: | ||||
|                 name: github-client | ||||
|             - secretRef: | ||||
|                 name: slack-client | ||||
|           readinessProbe: | ||||
|             httpGet: | ||||
|               path: /.well-known/openid-configuration | ||||
|               port: 3000 | ||||
|               httpHeaders: | ||||
|                 - name: x-forwarded-for # suppress oidc-provider warning | ||||
|                   value: 'https://auth2.k-space.ee/' | ||||
|                 - name: x-forwarded-proto # suppress oidc-provider warning | ||||
|                   value: https | ||||
|             initialDelaySeconds: 5 | ||||
|             periodSeconds: 1 | ||||
|           volumeMounts: | ||||
|             - mountPath: /app/tos | ||||
|               name: tos | ||||
|             - mountPath: /app/approval | ||||
|               name: approval | ||||
|             - mountPath: /app/src/views/custom/emails | ||||
|               name: email-templates | ||||
|       volumes: | ||||
|         - name: tos | ||||
|           configMap: | ||||
|             name: oidc-gateway-tos-v1 | ||||
|         - name: approval | ||||
|           configMap: | ||||
|             name: oidc-gateway-approval-required | ||||
|         - name: email-templates | ||||
|           configMap: | ||||
|             name: oidc-gateway-email-templates | ||||
							
								
								
									
										59
									
								
								oidc-gateway/rbac.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								oidc-gateway/rbac.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| --- | ||||
| apiVersion: rbac.authorization.k8s.io/v1 | ||||
| kind: ClusterRole | ||||
| metadata: | ||||
|   name: oidc-gateway | ||||
| rules: | ||||
|   - apiGroups: | ||||
|       - codemowers.io | ||||
|     resources: | ||||
|       - oidcgatewayusers | ||||
|       - oidcgatewayusers/status | ||||
|       - oidcgatewayclients | ||||
|       - oidcgatewayclients/status | ||||
|       - oidcgatewaymiddlewareclients | ||||
|       - oidcgatewaymiddlewareclients/status | ||||
|     verbs: | ||||
|       - get | ||||
|       - list | ||||
|       - watch | ||||
|       - create | ||||
|       - update | ||||
|       - patch | ||||
|   - apiGroups: | ||||
|       - "" | ||||
|     resources: | ||||
|       - secrets | ||||
|     verbs: | ||||
|       - get | ||||
|       - create | ||||
|       - patch | ||||
|       - delete | ||||
|   - apiGroups: | ||||
|       - traefik.containo.us | ||||
|     resources: | ||||
|       - middlewares | ||||
|     verbs: | ||||
|       - get | ||||
|       - create | ||||
|       - update | ||||
|       - patch | ||||
|       - delete | ||||
| --- | ||||
| apiVersion: rbac.authorization.k8s.io/v1 | ||||
| kind: ClusterRoleBinding | ||||
| metadata: | ||||
|   name: oidc-gateway | ||||
| roleRef: | ||||
|   apiGroup: rbac.authorization.k8s.io | ||||
|   kind: ClusterRole | ||||
|   name: oidc-gateway | ||||
| subjects: | ||||
|   - kind: ServiceAccount | ||||
|     name: oidc-gateway | ||||
|     namespace: oidc-gateway | ||||
| --- | ||||
| apiVersion: v1 | ||||
| kind: ServiceAccount | ||||
| metadata: | ||||
|   name: oidc-gateway | ||||
							
								
								
									
										65
									
								
								oidc-gateway/texts.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								oidc-gateway/texts.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| --- | ||||
| apiVersion: v1 | ||||
| kind: ConfigMap | ||||
| metadata: | ||||
|   name: oidc-gateway-tos-v1 | ||||
| data: | ||||
|   tos.txt: | | ||||
|     Terms of Service | ||||
|  | ||||
| --- | ||||
| apiVersion: v1 | ||||
| kind: ConfigMap | ||||
| metadata: | ||||
|   name: oidc-gateway-approval-required | ||||
| data: | ||||
|   approval.txt: | | ||||
|     Dear User, | ||||
|      | ||||
|     Thank you for your interest in accessing the K-Space MTÜ infrastructure. To become a member, please contact us at info@k-space.ee | ||||
|      | ||||
|     Also see https://www.k-space.ee/ | ||||
|      | ||||
|     Best regards, K-Space MTÜ | ||||
| --- | ||||
| apiVersion: v1 | ||||
| kind: ConfigMap | ||||
| metadata: | ||||
|   name: oidc-gateway-email-templates | ||||
| data: | ||||
|   tos.txt: | | ||||
|     Hi, <%= name %>! | ||||
|      | ||||
|     You agreed with the Terms of Service at <%= timestamp %> | ||||
|  | ||||
|     Content SHA256 hash: <%= hash %> | ||||
|      | ||||
|     Best regards, | ||||
|     K-Space MTÜ | ||||
|   tos.ejs: | | ||||
|     <div> | ||||
|         <p>Hi, <%= name %>!</p> | ||||
|         <p>You agreed with the following Terms of Service at <%= timestamp %></p> | ||||
|         <p>Content SHA256 hash: <%= hash %></p> | ||||
|         <br /> | ||||
|         <blockquote> | ||||
|             <%- content -%> | ||||
|         </blockquote> | ||||
|         <br /> | ||||
|         <p>Best regards, <br/> K-Space MTÜ</p> | ||||
|     </div> | ||||
|   tos.subject: | | ||||
|     Terms of Service agreement confirmation | ||||
|   link.txt: | | ||||
|     Open the following link to log in: <%= url %> | ||||
|  | ||||
|     Best regards, | ||||
|     K-Space MTÜ | ||||
|   link.ejs: | | ||||
|     <div> | ||||
|         <p>Open the following link to log in: <%= url %></p> | ||||
|         <br /> | ||||
|         <p>Best regards, <br/> K-Space MTÜ</p> | ||||
|     </div> | ||||
|   link.subject: | | ||||
|     auth.k-space.ee login link | ||||
		Reference in New Issue
	
	Block a user