본문 바로가기
클라우드/Istio

[Istio] 인그레스 게이트웨이의 보안 핵심: TLS SIMPLE vs MUTUAL 모드 완벽 정리 🛡️

by gasbugs 2025. 11. 29.

안녕하세요! 오늘은 쿠버네티스 서비스 메시의 표준, Istio(이스티오)를 다룰 때 가장 중요하면서도 헷갈리기 쉬운 Gateway의 TLS 모드에 대해 이야기해보려 합니다.

 

외부의 트래픽을 우리 클러스터로 안전하게 받아들이기 위해서는 보안 연결(HTTPS)이 필수적인데요. Istio Gateway에서는 이 보안 레벨을 어떻게 조정할까요?

 

가장 많이 사용되는 SIMPLE 모드와 MUTUAL 모드의 차이점, 그리고 설정 과정에서 자주 겪는 CLI 에러 해결법까지 아주 상세하게 파헤쳐 보겠습니다. 🚀

 


1. 잠깐! 시크릿 생성하다가 에러 나셨나요? 🚨

Istio 게이트웨이에 인증서를 적용하려면 먼저 쿠버네티스 Secret을 만들어야 합니다. 그런데 아래와 같은 에러를 만나는 경우가 종종 있습니다.

error: flag needs an argument: --from-file
bash: tls.crt=/root/certificates/booking.example.com.crt: No such file or directory

 

이것은 보통 명령어가 길어질 때 줄바꿈(Enter) 처리를 잘못해서 발생합니다. 터미널은 백슬래시(\) 없이 줄을 바꾸면 명령어가 끝난 줄 알고 실행해버리기 때문이죠.

 

✅ 올바른 해결법

옵션들을 한 줄에 쓰거나, 줄을 바꿀 때 꼭 \를 붙여주세요. 특히 mTLS를 위해서는 CA 인증서(ca.crt)도 함께 넣어야 한다는 점을 잊지 마세요!

# mTLS용 시크릿 생성 예시 (한 줄로 깔끔하게!)
kubectl create secret generic booking-credential-mutual -n istio-system \
  --from-file=ca.crt=/root/certificates/example.com.crt \
  --from-file=tls.crt=/root/certificates/booking.example.com.crt \
  --from-file=tls.key=/root/certificates/booking.example.com.key

 

자, 이제 재료(인증서)가 준비되었으니 요리(TLS 모드 설정)를 시작해볼까요? 👨‍🍳


2. mode: SIMPLE (단방향 TLS) 🌐

SIMPLE 모드는 우리가 흔히 인터넷 서핑을 할 때 만나는 표준 HTTPS 방식입니다.

💡 동작 원리

이 방식은 "서버(Gateway)만 신분증을 제시"합니다.

  1. Client(사용자) ➡️ Gateway: "접속 좀 할게요."
  2. Gateway ➡️ Client: "네, 제가 바로 그 사이트(Server) 맞습니다. 제 인증서 확인해보세요." 📜
  3. Client: "음, 믿을만한 기관(CA)에서 발급해줬군. 합격!" ✅
  4. 🔒 암호화 통신 시작

🎯 특징 및 용도

  • 게이트웨이는 클라이언트가 누구인지 검사하지 않습니다. (누구나 접속 가능)
  • 용도: 일반적인 웹 서비스, 쇼핑몰, 블로그 등 대중에게 공개된 서비스.

📝 YAML 설정 예시

서버의 인증서와 키가 담긴 시크릿(credentialName)만 지정하면 됩니다.

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: my-simple-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 443
      name: https
      protocol: HTTPS
    hosts:
    - "example.com"
    tls:
      mode: SIMPLE  # 👈 여기!
      credentialName: booking-credential # 서버 인증서(tls.crt, tls.key)만 있으면 됨

3. mode: MUTUAL (양방향 TLS / mTLS) 🤝

MUTUAL 모드는 보안이 훨씬 강화된 방식입니다. 이름 그대로 "서로(Mutual)" 인증합니다. 흔히 mTLS라고 부릅니다.

💡 동작 원리

이 방식은 "서버와 클라이언트 모두 신분증을 교환"합니다.

  1. Client ➡️ Gateway: "접속 요청!"
  2. Gateway ➡️ Client: "일단 제 신분증(Server Cert) 확인하시고요." 📜
  3. Gateway ➡️ Client: "근데 당신은 누구죠? 당신 신분증(Client Cert)도 보여주세요." 👮‍♂️
  4. Client ➡️ Gateway: "여기 제 인증서입니다." 🪪
  5. Gateway: (가지고 있는 CA 인증서로 검증) "오, 우리 회사 파트너 맞네요. 통과!" ✅
  6. 🔒 양방향 암호화 통신 시작

🎯 특징 및 용도

  • 클라이언트도 반드시 유효한 인증서가 있어야 접속이 가능합니다. (없으면 400 에러 등으로 거부됨)
  • 용도: 금융권 API, 파트너사 전용 시스템, 내부 관리자 페이지, IoT 기기 통신 등 신뢰된 대상만 접속해야 할 때.

📝 YAML 설정 예시

여기서는 서버 인증서뿐만 아니라, 클라이언트를 검증할 CA 인증서가 시크릿에 반드시 포함되어 있어야 합니다.

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: my-mutual-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 443
      name: https
      protocol: HTTPS
    hosts:
    - "booking.example.com"
    tls:
      mode: MUTUAL  # 👈 강력한 보안!
      credentialName: booking-credential-mutual # 여기엔 ca.crt가 필수 포함!

4. 한눈에 요약하기 📊

구분 SIMPLE (단방향) MUTUAL (양방향)
인증 주체 클라이언트가 서버를 검증 서로가 상대방을 검증
클라이언트 준비물 없음 (브라우저만 있으면 됨) 클라이언트 인증서(Client Cert)
게이트웨이 준비물 서버 인증서 + 키 서버 인증서 + 키 + CA 인증서
보안 강도 보통 (데이터 암호화) 최상 (데이터 암호화 + 접근 제어)
추천 시나리오 퍼블릭 웹사이트 보안이 중요한 내부/B2B 시스템

🏁 마치며

Istio를 도입하는 큰 이유 중 하나가 바로 이 강력한 보안 기능 때문입니다.

  • 일반 사용자에게 서비스한다면 👉 SIMPLE
  • 검증된 시스템끼리만 통신해야 한다면 👉 MUTUAL

이 두 가지를 상황에 맞게 골라 쓰는 것이 Istio 보안의 첫걸음입니다. 오늘 정리한 내용이 여러분의 안전한 클러스터 구축에 도움이 되기를 바랍니다! 읽어주셔서 감사합니다. 😊