Kubernetes 이야기

Nginx ingress - External OAUTH Authentication ( Google ) 본문

Kubernetes/일반

Nginx ingress - External OAUTH Authentication ( Google )

kmaster 2022. 4. 17. 21:55
반응형

Kubernetes에서는 Kubernetes Nginx Controller를 선택하여 Prometheus, grafana, 다양한 애플리케이션 등과 같은 공개 URL을 애플리케이션 로드 밸런서(AWS 또는 GCP의 경우 Google 로드 밸런서)를 통해 노출시켜 서비스 한다. 

 

Kubernetes에 배포된 아래와 같은 서비스들을 호출한다고 해보자.

이렇게 호출하기 위해서 아래와 같이 Ingress를 구성하게 될 것이다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example
spec:
  ingressClassName: nginx
  rules:
  - host: www.test.com
    http:
      paths:
      - path: /svc1/
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 80
      - path: /svc2/
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 80
      - path: /svc3/
        pathType: Prefix
        backend:
          service:
            name: service3
            port:
              number: 80

 

서로 다른 서비스들에서 인증이 필요하다면, 각 서비스별로 인증처리를 위한 개발을 진행해야 할 것이다. 사용자가 서비스를 호출할때 앞에 인증을 위한 별도 서비스를 설치한다면 각각의 서비스별로 인증을 개발해야 하는 문제를 해결할 수 있을 것이다. ( 보통 이런 기능이 API Gateway 라는 곳에 있다. )

 

Nginx Ingress Controller는 4가지 인증을 지원한다.

  • 기본인증 : ID / Password 
  • 클라이언트 인증서
  • External Basic Authentication
  • External OAUTH Authentication

일반적인 ID, Password를 통해 인증을 할 수 있지만, 내부 시스템의 경우 직원이 퇴사할 때마다 비밀번호를 변경해야 하는 번거로움이 있고, 비밀번호 교체를 놓치면 보안상 위험하다. 이를 방지하기 위해 Google, GitHub 등과 통합할 수 있는 OAuth2-Proxy 서비스를 활용하여 사용자가 인증할 수 있도록 하고 사용자가 인증되면 실제 URL로 리디렉션할 수 있는 구성을 할 수 있다.

 

이번에는 External OAUTH Authentication 사용 방법에 대해 알아보자.

구성도는 아래와 같다.

Idp 는 OAuth 를 지원하는 Provider를 말한다. 그럼 먼저 OAuth Proxy 를 설치해 보자.

 

1. Google 연동하기

OAuth Proxy 설치

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: oauth2-proxy
  name: oauth2-proxy
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: oauth2-proxy
  template:
    metadata:
      labels:
        k8s-app: oauth2-proxy
    spec:
      containers:
      - args:
        - --provider=google
        - --email-domain=*
        - --upstream=file:///dev/null
        - --http-address=0.0.0.0:4180
        env:
        - name: OAUTH2_PROXY_CLIENT_ID
          value: <Client ID>
        - name: OAUTH2_PROXY_CLIENT_SECRET
          value: <Client Secret>
        - name: OAUTH2_PROXY_COOKIE_SECRET
          value: SECRET (ex : echo Secretdata | base64 )
        image: quay.io/oauth2-proxy/oauth2-proxy:latest
        imagePullPolicy: Always
        name: oauth2-proxy
        ports:
        - containerPort: 4180
          protocol: TCP

---

apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: oauth2-proxy
  name: oauth2-proxy
spec:
  ports:
  - name: http
    port: 4180
    protocol: TCP
    targetPort: 4180
  selector:
    k8s-app: oauth2-proxy

여기서 google 을 사용하여 사용자를 인증하므로 CLIENT_ID 및 CLIENT_SECRET 을 생성해야 한다. Google에서는 다음의 주소에서 필요한 키를 만들수 있다.

https://console.developers.google.com/apis/credentials

 

프로젝트 만들기로 들어가서 새 프로젝트를 생성한다.

이제 사용자 인증 정보를 만들어보자.

OAuth 클라이언트 ID를 만들자.

아래와 같이 생성된 클라이언트 ID와 보안 비밀번호를 OAuth Deployment 에 사용한다.

마지막으로 "승인된 자바스크립트 원본"과 "리리렉션 URI' 를 등록해 준다 . ( Nginx Ingress Controller에 등록된 domain정보를 등록한다. )

이제 OAuth Proxy와 Ingress를 등록해 보자.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth"
    nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$escaped_request_uri"
    cert-manager.io/cluster-issuer: selfsigned-cluster-issuer
  name: external-auth-oauth2
spec:
  ingressClassName: nginx
  rules:
  - host: www.10.60.200.122.nip.io
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: spring-petclinic
            port:
              number: 8080
  tls:
  - hosts:
    - www.10.60.200.122.nip.io
    secretName: spring-cert
---

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: selfsigned-cluster-issuer
  name: oauth2-proxy
spec:
  ingressClassName: nginx
  rules:
  - host: www.10.60.200.122.nip.io
    http:
      paths:
      - path: /oauth2
        pathType: Prefix
        backend:
          service:
            name: oauth2-proxy
            port:
              number: 4180
  tls:
  - hosts:
    - www.10.60.200.122.nip.io
    secretName: oauth-cert

 

반응형

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

nginx ingress를 사용하여 외부 application proxy 설정  (0) 2022.04.21
올바른 Dockerfile 작성하기  (0) 2022.04.19
Kubernetes Cluster 설계  (0) 2022.04.10
Bare metal VS VM Kubernetes  (0) 2022.04.09
Vertical Pod Autoscaler (VPA)  (0) 2022.04.09
Comments