Kubernetes 이야기

Dex와 OIDC 인증 본문

Kubernetes/일반

Dex와 OIDC 인증

kmaster 2023. 2. 13. 22:26
반응형

Dex는 OpenID Connect를 사용하는 ID 서비스이다. 

Dex의 흐름은 다음과 같다.

  • 사용자가 클라이언트 앱을 방문
  • 클라이언트 앱은 OAuth2 요청을 통해 사용자를 dex로 리디렉션
  • Dex는 사용자의 신원을 결정
  • Dex는 코드를 사용하여 사용자를 클라이언트로 리디렉션
  • 클라이언트는 코드를 dex와 id_token으로 교환

 

설치

---
apiVersion: v1
kind: Namespace
metadata:
  name: dex
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: dex
  name: dex
  namespace: dex
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dex
  template:
    metadata:
      labels:
        app: dex
    spec:
      serviceAccountName: dex # This is created below
      containers:
      - image: ghcr.io/dexidp/dex:v2.35.3
        name: dex
        command: ["/usr/local/bin/dex", "serve", "/etc/dex/cfg/config.yaml"]
        ports:
        - name: https
          containerPort: 5556
        volumeMounts:
        - name: config
          mountPath: /etc/dex/cfg
        readinessProbe:
          httpGet:
            path: /healthz
            port: 5556
            scheme: HTTP
      volumes:
      - name: config
        configMap:
          name: dex-config
          items:
          - key: config.yaml
            path: config.yaml
---
apiVersion: v1
kind: Service
metadata:
  name: dex
  namespace: dex
spec:
  selector:
    app: dex
  ports:
  - name: http
    protocol: TCP
    port: 5556
    targetPort: 5556
가끔 dex pod가 0/1 Running 상태로 호출이 안되는 경우가 발생한다. 원인은 /healthz 페이지가 404 not found에러가 발생하는데 정확한 원인을 찾지는 못했다.

 

dex에 사용할 configmap은 다음과 같다. 이 configmap은 nginx -> oauth2-proxy -> dex -> keycloak 로 연결되는 설정이다.

 

nginx->oauth2-proxy 설정 방법은 다음을 참고한다.

https://kmaster.tistory.com/150

apiVersion: v1
kind: ConfigMap
metadata:
  name: dex-config
data:
  config.yaml: |-
    issuer: <http://dex>

    storage:
      type: kubernetes
      config:
        inCluster: true

    web:
      http: 0.0.0.0:5556
      
    staticClients:
    - id: test # oauth2에서 이 이름을 입력해야 한다.
      secret: test-secret # oauth2에서 이 이름을 입력해야 한다.
      name: test
      redirectURIs:
      - <http://nginx/oauth2/callback>

    connectors:
    - type: oidc
      id: keycloak
      name: keycloak
      config:
        clientID: {{ CLIENT_ID }}
        clientSecret: {{ CLIENT_SECRET }}
        idpIssuerURL: {{ KEYCLOAK_URL }}/auth/realms/{{ REALM_NAME }}
        redirectURI: <http://dex/callback>
        insecure: false
        
    expiry:
      idTokens: 5m
      refreshTokens:
        absoluteLifetime: 1h
        reuseInterval: 3s

    oauth2:
      skipApprovalScreen: true

Service Account 와 role을 위해 다음을 생성한다.

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app: dex
  name: dex
  namespace: dex
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: dex
rules:
- apiGroups: ["dex.coreos.com"] # API group created by dex
  resources: ["*"]
  verbs: ["*"]
- apiGroups: ["apiextensions.k8s.io"]
  resources: ["customresourcedefinitions"]
  verbs: ["create"] # To manage its own resources, dex must be able to create customresourcedefinitions
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: dex
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: dex
subjects:
- kind: ServiceAccount
  name: dex           # Service account assigned to the dex pod, created above
  namespace: dex  # The namespace dex is running in

 

이제 nginx 를 브라우저로 호출 후 로그인 하면 다음 화면으로 이동한다.

만약 grant 화면을 조회하지 않고 싶으면

oauth2: skipApprovalScreen: true 옵션을 설정한다.

 

 

반응형

'Kubernetes > 일반' 카테고리의 다른 글

Strimzi로 Kubernetes에 Apache Kafka 설치  (1) 2023.12.10
Kubernetes Gateway API  (0) 2023.12.10
OAuth2 Proxy와 Keycloak 연동  (0) 2023.02.11
Chaos Mesh 에서 Physical Machines 카오스 엔지니어링  (0) 2023.02.08
KubeVela  (0) 2023.01.26
Comments