일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Pulumi
- Kubernetes 인증
- Kubernetes
- keda
- blue/green
- Continuous Deployment
- opentelemetry
- Argo
- Litmus
- knative
- argocd
- seldon core
- tekton
- Kubeflow
- mlops
- nginx ingress
- Kopf
- serving
- 카오스 엔지니어링
- 오퍼레이터
- Model Serving
- CANARY
- kubernetes operator
- gitops
- MLflow
- operator
- CI/CD
- argo rollout
- gitea
- opensearch
- Today
- Total
Kubernetes 이야기
Nginx ingress - External OAUTH Authentication ( Google ) 본문
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 |