Mutual TLS

마이크로서비스 아키텍처(MSA) 패턴의 보안 측면에서 Mutual TLS(mTLS)는 매우 중요한 역할을 한다.

mTLS는 마이크로서비스 아키텍처에서 보안을 강화하는 핵심 기술로, 서비스 간 통신의 신뢰성과 안전성을 크게 향상시킨다. 적절히 구현된 mTLS는 MSA 환경에서 강력한 보안 계층을 제공하여 전체 시스템의 안정성을 높이는 데 기여한다.

Mutual TLS는 상호 TLS 또는 양방향 TLS라고도 불린다. 이는 클라이언트와 서버 간의 통신에서 양쪽 모두가 서로의 신원을 확인하는 인증 방식이다.

mTLS
https://www.cloudflare.com/ko-kr/learning/access-management/what-is-mutual-tls/

일반 TLS와의 차이점

  1. 일반 TLS: 서버만 인증서를 제공하고 클라이언트가 서버의 신원을 확인한다.
  2. mTLS: 서버와 클라이언트 모두 인증서를 제공하고 서로의 신원을 확인한다.

mTLS의 작동 원리

mTLS는 다음과 같은 단계로 작동한다.

  1. 클라이언트가 서버에 연결을 요청한다.
  2. 서버가 자신의 TLS 인증서를 클라이언트에게 제공한다.
  3. 클라이언트는 서버의 인증서를 확인한다.
  4. 클라이언트가 자신의 인증서를 서버에게 제공한다.
  5. 서버는 클라이언트의 인증서를 확인한다.
  6. 양쪽 모두 인증이 완료되면 안전한 통신 채널이 설정된다.

mTLS의 인증서 검증 과정

  1. 디지털 서명 검증: 서버와 클라이언트는 받은 인증서의 디저털 서명을 검증한다.
    1. 인증서에서 발급자의 공개키 추출
    2. 인증서의 서명 알고리즘 확인
    3. 인증서 본문의 해시값 계산
    4. 디지털 서명 검증
  2. 인증서 체인 검증: 신뢰할 수 있는 루트 CA까지의 인증서 체인을 검증한다.
    1. 인증서 체인 구성: 상위 인증서를 찾고, 자체 서명된 인증서(루트 CA)에 도달하면 종료
    2. 체인의 각 인증서 검증: 상위 인증서로 현재 인증서 검증하고 인증서 제약 조건을 검증한다.
    3. 루트 CA가 신뢰할 수 있는 CA인지 확인
  3. 유효기간 및 목적 검증: 인증서의 유효기간과 사용 목적을 확인한다.
    1. 유효기간 검증
    2. 키 사용 목적 검증
  4. 실시간 폐기 상태 확인: CRL 또는 OCSP를 통해 인증서의 폐기 상태를 확인한다.
    1. OCSP를 통한 확인
    2. CRL을 통한 확인
  5. 호스트명 검증: 서버 인증서의 경우 추가로 호스트명을 검증한다.
    1. Subject Alternative Names 확인
    2. Common Name 확인 (레거시 지원)

이러한 검증 과정은 TLS 핸드셰이크 중에 자동으로 수행되며, 검증에 실패하면 연결이 즉시 종료된다. 각 단계는 보안을 위해 매우 중요하며, 하나라도 실패하면 전체 인증 과정이 실패하게 된다.

mTLS의 장점

  1. 강화된 보안: 양방향 인증을 통해 중간자 공격(MitM)과 같은 보안 위협을 방지할 수 있다.
  2. 세분화된 접근 제어: 클라이언트의 신원을 확인할 수 있어 더 정교한 접근 제어가 가능하다.
  3. 데이터 무결성 보장: 암호화된 통신으로 데이터의 기밀성과 무결성을 보장한다.
  4. 신뢰할 수 있는 통신: 서버와 클라이언트 모두 신뢰할 수 있는 엔터티임을 확인할 수 있다.

MSA에서의 mTLS 활용

마이크로서비스 아키텍처에서 mTLS는 다음과 같이 활용된다:

  1. 서비스 간 통신 보안: 마이크로서비스 간의 모든 통신을 암호화하고 인증한다.
  2. 제로 트러스트 보안 모델: 네트워크 내부의 모든 통신에 대해 인증을 요구하여 보안을 강화한다.
  3. 서비스 메시와의 통합: Istio와 같은 서비스 메시 도구를 사용하여 mTLS를 쉽게 구현하고 관리할 수 있다.

mTLS의 실제 적용 사례

Istio와 같은 서비스 메시는 mTLS를 통해 마이크로서비스 간의 안전한 통신을 지원한다.
Istio에서는 프록시 간의 통신에 mTLS를 적용하여, TLS가 아닌 모든 통신을 차단함으로써 불법적인 접근을 방지한다.

또한, NGINX와 같은 로드 밸런서를 활용하여 mTLS를 적용할 수 있다. 이를 통해 클라이언트와 서버 간의 상호 인증을 구현하고, 데이터의 기밀성과 무결성을 보장할 수 있다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /path/to/server.crt;
    ssl_certificate_key /path/to/server.key;

    ssl_client_certificate /path/to/ca.crt;
    ssl_verify_client on;

    location / {
        proxy_pass http://backend;
    }
}

이 설정에서 ssl_client_certificatessl_verify_client 지시어를 통해 클라이언트 인증서 검증을 활성화한다.

주의사항

  1. 인증서 관리: 많은 수의 클라이언트 인증서를 관리해야 할 수 있으므로 효율적인 인증서 관리 시스템이 필요하다.
  2. 성능 영향: 추가적인 인증 과정으로 인해 약간의 성능 저하가 있을 수 있다.
  3. 구현 복잡성: 일반 TLS에 비해 구현이 더 복잡할 수 있으므로 적절한 도구와 프레임워크의 사용이 중요하다.

참고 및 출처