mTLS

Mutual TLS (mTLS)는 Istio의 핵심 보안 기능으로, 서비스 간 통신을 자동으로 암호화하고 인증합니다.

목차

mTLS 개요

Istio Identity Provisioning

Istio는 서비스 간 통신에 자동으로 mTLS를 적용하여 Zero Trust 네트워크를 구현합니다.

Identity 기반 보안

Istio는 SPIFFE (Secure Production Identity Framework for Everyone) 표준을 사용하여 각 워크로드에 강력한 신원을 부여합니다:

Identity 프로비저닝 과정:

  1. Kubernetes가 파드를 생성하고 ServiceAccount를 할당

  2. Istio Agent가 파드 내에서 시작

  3. Agent가 Istiod에 CSR (Certificate Signing Request) 전송

  4. Istiod가 SPIFFE ID 기반 X.509 인증서 발급

  5. Agent가 Envoy에 인증서 전달 (SDS 프로토콜)

  6. 인증서 자동 갱신 (기본 TTL: 24시간)

spinner

mTLS 모드

STRICT 모드 (권장)

PERMISSIVE 모드 (마이그레이션용)

DISABLE 모드

인증서 관리

Certificate Hierarchy

Istio 기본 CA 인증서

Istio는 설치 시 자동으로 자체 서명된 루트 CA를 생성합니다. 위 다이어그램은 Istio의 인증서 계층 구조를 보여줍니다:

  • Root CA: 최상위 신뢰 앵커

  • Intermediate CA: 워크로드 인증서 발급용 중간 CA

  • Workload Certificates: 각 서비스의 mTLS 인증서 (자동 갱신)

spinner

기본 인증서 속성:

  • 유효 기간: 90일 (자동 갱신: 만료 24시간 전)

  • 키 크기: 2048-bit RSA

  • 서명 알고리즘: SHA-256

인증서 확인

사용자 정의 CA 인증서 사용

프로덕션 환경에서는 기업 내부 CA 또는 공인 CA를 사용하는 것이 좋습니다.

1단계: CA 인증서 및 키 생성

2단계: Kubernetes Secret 생성

3단계: Istio 재시작

4단계: 검증

AWS Certificate Manager (ACM) 통합

ACM Private CA를 사용하여 Istio 인증서를 관리할 수 있습니다.

1단계: ACM Private CA 생성

2단계: Cert-Manager + AWS PCA Issuer 설치

3단계: AWSPCAIssuer 생성

4단계: Istio에서 사용

인증서 갱신 정책

인증서 순환 (Rotation)

PeerAuthentication 설정

전역 설정

네임스페이스별 설정

워크로드별 설정

포트별 설정

AWS 서비스와 mTLS 통합

AWS Application Load Balancer (ALB)와 mTLS

ALB는 클라이언트 인증서 기반 mTLS를 지원합니다.

spinner

1단계: ALB에 mTLS 설정

2단계: AWS Load Balancer Controller 설정

3단계: Istio Gateway에서 클라이언트 인증서 검증

4단계: 클라이언트 인증서 정보 전달

ALB는 클라이언트 인증서 정보를 HTTP 헤더로 전달합니다:

ALB가 전달하는 헤더:

  • X-Amzn-Mtls-Clientcert-Serial-Number: 인증서 시리얼 번호

  • X-Amzn-Mtls-Clientcert-Subject: 인증서 Subject DN

  • X-Amzn-Mtls-Clientcert-Issuer: 인증서 Issuer DN

  • X-Amzn-Mtls-Clientcert-Validity: 유효 기간

  • X-Amzn-Mtls-Clientcert-Leaf: 클라이언트 인증서 (PEM)

Amazon CloudFront와 mTLS

CloudFront는 클라이언트 인증서 검증을 지원합니다.

spinner

1단계: CloudFront 배포 생성

2단계: CloudFront Function으로 인증서 검증

3단계: Istio에서 CloudFront 헤더 검증

End-to-End mTLS 아키텍처

클라이언트부터 백엔드까지 전체 구간 mTLS:

spinner

구간별 보안:

  1. 클라이언트 → CloudFront: mTLS (클라이언트 인증서 검증)

  2. CloudFront → ALB: TLS + 인증서 정보 헤더

  3. ALB → Istio Gateway: TLS + 인증서 정보 헤더

  4. Istio Mesh 내부: 자동 mTLS (Envoy-to-Envoy)

외부 서비스와 mTLS

Legacy 시스템 통합

외부 API mTLS 클라이언트 인증

Istio에서 외부 API에 클라이언트 인증서를 제시해야 하는 경우:

Egress Gateway를 통한 외부 mTLS

마이그레이션 전략

1단계: 현재 상태 확인

2단계: PERMISSIVE 모드로 전환

3단계: 모니터링

4단계: STRICT 모드로 전환

일반적인 문제와 해결

1. mTLS 연결 실패

증상:

원인 분석:

해결 방법:

  1. PeerAuthentication과 DestinationRule 불일치:

  1. 사이드카가 주입되지 않은 파드:

2. 인증서 만료 문제

증상:

인증서 만료 확인:

해결 방법:

3. Clock Skew (시간 동기화 문제)

증상:

원인: 파드/노드 간 시간 차이로 인증서 검증 실패

확인:

해결 방법:

4. 순환 참조 (Circular Dependency)

증상:

원인: Service A → Service B → Service A 호출 시 mTLS 핸드셰이크 타임아웃

확인:

해결 방법:

5. Mixed Protocol (mTLS + 평문)

증상:

원인: 일부 서비스는 mTLS, 일부는 평문 사용

확인:

해결 방법:

6. Headless Service mTLS

증상: Headless 서비스에서 mTLS 연결 실패

해결 방법:

7. mTLS와 네트워크 정책 충돌

증상: NetworkPolicy 적용 후 mTLS 연결 실패

해결 방법:

성능 및 모니터링

mTLS 성능 영향

지표
평문
mTLS
증가율

지연 시간 (p50)

5ms

6ms

+20%

지연 시간 (p99)

15ms

18ms

+20%

CPU 사용률

10%

15%

+50%

메모리 사용률

100MB

120MB

+20%

처리량 (RPS)

10000

8500

-15%

최적화 방법:

  1. 하드웨어 가속 (AES-NI):

  1. TLS 1.3 사용 (더 빠른 핸드셰이크):

  1. Connection Pooling:

Prometheus 메트릭

mTLS 연결 메트릭:

Grafana 대시보드

인증서 만료 알림

로깅 및 디버깅

베스트 프랙티스

  1. 프로덕션 환경:

    • STRICT 모드 사용

    • 사용자 정의 CA 인증서 사용

    • 인증서 자동 갱신 설정

    • 만료 알림 구성

  2. 성능 최적화:

    • TLS 1.3 사용

    • Connection pooling 활성화

    • AES-NI 지원 인스턴스 사용

  3. 모니터링:

    • 인증서 만료 추적

    • mTLS 연결 성공률 모니터링

    • 핸드셰이크 지연 시간 추적

  4. 보안:

    • 정기적인 CA 순환

    • 최소 권한 원칙

    • NetworkPolicy와 함께 사용

참고 자료

마지막 업데이트