Amazon EKS의 AWS 프라이빗 CA를 사용하여 AWS App Mesh에서 MTL 활성화 - 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon EKS의 AWS 프라이빗 CA를 사용하여 AWS App Mesh에서 MTL 활성화

Omar Kahil, Emmanuel Saliu, Muhammad Shahzad, Andy Wong, Amazon Web Services

요약

이 패턴은 AWS App Mesh에서 AWS 사설 인증 기관(AWS 사설 CA)의 인증서를 사용하여 Amazon Web Services(AWS)에서 상호 전송 계층 보안(MTL)을 구현하는 방법을 보여줍니다. 모두를 위한 보안 프로덕션 ID 프레임워크(SPIFE)를 통해 Envoy 비밀 검색 서비스(SDS) API를 사용합니다. SPIFE는 세분화되고 동적인 워크로드 ID 관리를 제공하는 광범위한 커뮤니티 지원이 포함된 클라우드 네이티브 컴퓨팅 재단(CNCF) 오픈 소스 프로젝트입니다. SPIFE 표준을 구현하려면 SPIRE SPIFE 런타임 환경을 사용하세요.

App Mesh에서 mTLS를 사용하면 TLS를 통한 보안 계층이 추가되고 메시의 서비스가 연결을 설정하는 클라이언트를 확인할 수 있기 때문에 양방향 피어 인증을 제공합니다. 클라이언트-서버 관계에 있는 클라이언트도 세션 협상 프로세스 중에 X.509 인증서를 제공합니다. 서버는 이 인증서를 사용하여 클라이언트를 식별하고 인증합니다. 이를 통해 신뢰할 수 있는 인증 기관(CA) 서 발급한 인증서와 유효한 인증서인지 확인할 수 있습니다.

사전 조건 및 제한 사항

사전 조건 

  • 자체 관리형 또는 관리형 노드 그룹이 있는 Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터

  • SDS가 활성화된 상태로 클러스터에 배포된 App Mesh 컨트롤러

  • AWS Certificate Manager(ACM)의 프라이빗 인증서로, AWS 프라이빗 CA에서 발행

제한 사항

  • SPIRE 에이전트는 Kubernetes DaemonSet으로 실행되어야 하므로 SPIRE를 AWS Fargate에 설치할 수 없습니다.

제품 버전

  • AWS App Mesh Controller 차트 1.3.0 이상

아키텍처

다음 다이어그램은 VPC에서 App Mesh를 사용하는 EKS 클러스터를 보여줍니다. 한 워커 노드의 SPIRE 서버는 다른 워커 노드의 SPIRE 에이전트 및 AWS 사설 CA와 통신합니다. Envoy는 SPIRE 에이전트 워커 노드 간의 mTLS 통신에 사용됩니다.

mTLS용 SPIRE 에이전트 및 서버, App Mesh 및 Envoys가 있는 EKS 클러스터 작업자 노드입니다.

다이어그램은 다음 단계들을 보여줍니다.

  1. 인증서가 발급됩니다.

  2. 인증서 서명 및 인증서를 요청합니다.

도구

서비스

  • AWS Private CA – AWS Private Certificate Authority(AWS Private CA)를 사용하면 온프레미스 CA를 운영하는 데 드는 투자 및 유지 관리 비용 없이 루트 및 하위 CA를 비롯한 사설 CA 계층을 생성할 수 있습니다.

  • AWS App Mesh – AWS App Mesh는 서비스를 손쉽게 모니터링하고 제어할 수 있는 서비스 메시입니다. App Mesh는 서비스 통신 방식을 표준화하여 애플리케이션의 모든 서비스에 대해 일관된 가시성과 네트워크 트래픽 제어를 제공합니다.

  • Amazon EKS – Amazon Elastic Kubernetes Service(Amazon EKS)는 Kubernetes 컨트롤 플레인 또는 노드를 설치, 작동 및 유지 관리할 필요 없이 AWS에서 Kubernetes를 실행하는 데 사용할 수 있는 관리형 서비스입니다.

기타 도구

  • Helm – Kubernetes용 Helm 패키지 관리자는 Kubernetes 클러스터에서 애플리케이션을 설치하고 관리하는 데 도움이 됩니다. 이 패턴은 Helm을 사용하여 AWS App Mesh Controller를 배포합니다.

  • AWS App Mesh 컨트롤러 차트 - 이 패턴은 AWS App Mesh 컨트롤러 차트를 사용하여 Amazon EKS에서 AWS App Mesh를 활성화합니다.

에픽

작업설명필요한 기술

Amazon EKS에서 App Mesh를 설정합니다.

리포지토리에 제공된 기본 배포 단계를 따르세요.

DevOps 엔지니어

SPIRE를 설치합니다.

spire_setup.yaml을 사용하여 EKS 클러스터에 SPIRE를 설치합니다.

DevOps 엔지니어

AWS 프라이빗 CA 인증서를 설치합니다.

AWS 설명서의 지침에 따라 프라이빗 루트 CA용 인증서를 생성하고 설치합니다.

DevOps 엔지니어

클러스터 노드 인스턴스 역할에 권한을 부여합니다.

클러스터 노드 인스턴스 역할에 정책을 연결하려면 추가 정보 섹션에 있는 코드를 사용하세요.

DevOps 엔지니어

AWS 프라이빗 CA용 SPIRE 플러그인을 추가합니다.

SPIRE 서버 구성에 플러그인을 추가하려면 추가 정보 섹션에 있는 코드를 사용하세요. certificate_authority_arn Amazon 리소스 이름(ARN)을 프라이빗 CA ARN으로 바꿉니다. 사용되는 서명 알고리즘은 사설 CA의 서명 알고리즘과 동일해야 합니다. your_region을 AWS 리전으로 바꿉니다.

플러그인에 대한 자세한 내용은 서버 플러그인: UpstreamAuthority "aws_pca"를 참조하세요.

DevOps 엔지니어

bundle.cert를 업데이트합니다.

SPIRE 서버를 생성하면 spire-bundle.yaml 파일이 생성됩니다. spire-bundle.yaml 파일의 bundle.crt 값을 사설 CA에서 공개 인증서로 변경합니다.

DevOps 엔지니어
작업설명필요한 기술

SPIRE에 노드 및 워크로드 항목을 등록합니다.

SPIRE 서버에 노드 및 워크로드(서비스)를 등록하려면 리포지토리의 코드를 사용하세요.

DevOps 엔지니어

mTL이 활성화된 상태로 App Mesh에서 메시를 생성합니다.

App Mesh에서 마이크로서비스 애플리케이션의 모든 구성 요소(예: 가상 서비스, 가상 라우터, 가상 노드)를 사용하여 새 메시를 생성합니다.

DevOps 엔지니어

등록된 항목을 검사합니다.

다음 명령을 실행하여 노드와 워크로드에 대해 등록된 항목을 검사할 수 있습니다.

kubectl exec -n spire spire-server-0 -- /opt/spire/bin/spire-server entry show

그러면 SPIRE Agent의 항목이 표시됩니다.

DevOps 엔지니어
작업설명필요한 기술

mTLS 트래픽을 검증합니다.

  1. 프런트엔드 서비스에서 백엔드 서비스에 HTTP 헤더를 보내고 SPIRE에 등록된 서비스로 응답이 성공했는지 확인합니다.

  2. 상호 TLS 인증의 경우 다음 명령을 실행하여 ssl.handshake 통계를 검사할 수 있습니다.

    kubectl exec -it $POD -n $NAMESPACE -c envoy -- curl http://localhost:9901/stats | grep ssl.handshake

    이전 명령을 실행한 후 리스너 ssl.handshake 개수를 확인할 수 있습니다. 리스너 수는 다음 예와 비슷합니다.

    listener.0.0.0.0_15000.ssl.handshake: 2
DevOps 엔지니어

인증서가 AWS 사설 CA에서 발급되고 있는지 검증합니다.

SPIRE 서버의 로그를 보면 업스트림 사설 CA에서 플러그인이 올바르게 구성되었고 인증서가 발급되었는지 확인할 수 있습니다. 다음 명령을 실행합니다.

kubectl logs spire-server-0 -n spire

그런 다음 생성된 로그를 확인합니다. 이 코드는 서버의 이름이 spire-server-0이라고 지정되고 스파이어 네임스페이스에서 호스팅된다고 가정합니다. 플러그인이 성공적으로 로드되고 업스트림 사설 CA에 연결되는 것을 확인할 수 있을 것입니다.

DevOps 엔지니어

관련 리소스

추가 정보

클러스터 노드 인스턴스 역할에 권한 연결

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ACMPCASigning", "Effect": "Allow", "Action": [ "acm-pca:DescribeCertificateAuthority", "acm-pca:IssueCertificate", "acm-pca:GetCertificate", "acm:ExportCertificate" ], "Resource": "*" } ] } AWS Managed Policy: "AWSAppMeshEnvoyAccess"

ACM용 SPIRE 플러그인 추가

Add the SPIRE plugin for ACM Change certificate_authority_arn to your PCA ARN. The signing algorithm used must be the same as the signing algorithm on the PCA. Change your_region to the appropriate AWS Region. UpstreamAuthority "aws_pca" { plugin_data { region = "your_region" certificate_authority_arn = "arn:aws:acm-pca:...." signing_algorithm = "your_signing_algorithm" } }