TLS/SSL Termination with Ingress
위키피디아: https://en.wikipedia.org/wiki/TLS_termination_proxy
SSL 프로토콜은 3.X 버전까지 나왔으며 현재 더 이상 사용하지 않는다.
TLS 는 SSL 프로토콜을 변형해서 만든 프로토콜이다. 현재 1.3 버전까지 나왔다.
클라이언트와 Proxy(LB) 사이에 TLS 를 사용하고 Proxy 와 웹서비스 사이에서는 HTTP 로 통신을 하는 방식이 TLS Termination 이다.
즉, 외부로 노출된 LB 에 클라이언트는 HTTPS 로 통신을 하고 LB 는 뒷단에 연결된 백엔드들과 HTTP 로 통신을 하는 방식을 뜻한다.
이런 구성을 사용하는 이유는 첫번째 LB 뒷단에 연결되는 백엔드들과 HTTPS 로 통신을 할 경우 각각의 백엔드마다 인증서를 관리해줘야 하는데 이가 매우 불편하기 때문에 TLS Termination 구조를 사용하는 것이다.
두번째 수학적인 연산을 하는 작업들 즉, 암복호화 하는데 CPU 를 굉장히 많이 사용하기 때문에 TLS Termination 을 사용한다.
Proxy 와 백엔드도 HTTPS 로 통신하는 End To End 방식일 경우 보안이 좀 더 좋을 것이라고 생각할 수 있지만 꼭 그런 것도 아니다. 사용자가 해커라고 가정할 경우 로드 밸런서로 공격을 보낼 경우 해당 공격도 암호화가 되기 때문에 LB 에서 확인할 방법이 없다. 그래서 백엔드에서 복호화를 한 이후에 WAF, IDS, IPS, Anti DDoS, Anti Vius 등을 사용해서 확인을 해야한다. 이는 매우 좋지 않고 복잡하며 관리적인 측면에서 어려움이 있다.
비암호화 되는 구간이 있어야 백엔드로 도착하기 전에 보안 장치들로 확인을 할 수 있다.
보안적인 관점에서 E to E 가 정말 힘든 작업이다.
코드 작성
ingress-secret.yml
apiVersion: v1
kind: Secret
metadata:
name: ingress-secret
type: kubernetes.io/tls
data:
tls.crt: |
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ1VENDQXMyZ0F3SUJBZ0lVQ2NFOTM4WEZFSnBLYjU2NTlJZE...
tls.key: |
LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBMms4YTFBYS96NDRWcGZ...
nginx-deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
protocol: TCP
nginx-svc.yml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
type: NodePort
selector:
app: nginx
ports:
- name: http
port: 80
targetPort: 80
nginx-ing.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
ingress.kubernetes.io/rewrite-target: /
spec:
tls:
- hosts:
- "*.nip.io"
secretName: ingress-secret
rules:
- host: "*.nip.io"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-svc
port:
number: 80
ingress 에서 tls 를 셋팅했기 때문에 따로 443 포트를 열지 않고 80 포트를 사용해도 자동으로 443 포트를 열어서 HTTPS 로 리다이렉션 해준다.