상호 인증
상호 인증 (Mutual Authentication, Beta)
Cilium의 mTLS 기반 상호 인증(Mutual Authentication)은 서비스 간 통신에 인증, 기밀성, 무결성을 제공해요. 현재는 베타 기능이며, SPIFFE(SPIRE)를 통한 아이덴티티 관리를 사용해요.
본문
참고
이것은 베타 기능이에요. 문제가 있으면 피드백을 제공하고 GitHub 이슈를 열어주세요.
이 기능은 아직 불완전해요. 자세한 내용은 아래 Detailed Roadmap Status를 참고해주세요.
상호 인증과 mTLS 배경 (Mutual Authentication and mTLS Background)
Mutual Transport Layer Security(mTLS)는 네트워크를 통해 두 엔티티 사이에서 교환되는 데이터의 신뢰성(authenticity), 무결성(integrity), 기밀성(confidentiality)을 보장하는 메커니즘이에요.
클라이언트가 서버의 아이덴티티를 검증하는 단방향 인증 과정인 전통적인 TLS와 달리, mutual TLS는 클라이언트와 서버가 서로를 인증하도록 요구해서 추가 보안 계층을 더해요.
Mutual TLS는 서비스 간 통신에 인증, 기밀성, 무결성을 제공하는 것을 목표로 해요.
Cilium의 상호 인증 (Mutual Authentication in Cilium)
Cilium의 mTLS 기반 상호 인증 지원은 일반 연결에 대해 상호 인증 핸드셰이크를 대역 외(out-of-band)로 수행하게 해요.
Cilium이 서비스 간 인증과 암호화에 대한 대부분의 공통 요구사항을 충족하게 하려면 암호화를 활성화해야 해요.
참고
Cilium의 암호화 기능인 WireGuard Transparent Encryption과 IPsec Transparent Encryption은 파드 사이의 암호화 연결을 자동으로 생성하고 유지하도록 활성화할 수 있어요.
동적이고 이질적인 환경에서 아이덴티티 검증이라는 과제를 다루기 위해, 상호 인증은 분산 시스템을 위한 안전한 아이덴티티 검증 프레임워크를 요구해요.
참고
Cilium Service Mesh의 상호 인증 아키텍처에 대해 더 배우려면 CFP를 읽어주세요.
아이덴티티 관리 (Identity Management)
Cilium의 현재 상호 인증 지원에서 아이덴티티 관리는 SPIFFE(Secure Production Identity Framework for Everyone)를 사용해 제공돼요.
SPIFFE의 이점 (SPIFFE benefits)
SPIFFE가 제공하는 이점은 다음과 같아요:
- 신뢰할 수 있는 아이덴티티 발급 (Trustworthy identity issuance): SPIFFE는 아이덴티티를 발급하고 관리하는 표준화된 메커니즘을 제공해요. 서비스가 자주 스케일 업/다운될 수 있는 동적 환경에서도 분산 시스템의 각 서비스가 고유하고 검증 가능한 아이덴티티를 받도록 보장해요.
- 아이덴티티 증명 (Identity attestation): SPIFFE는 서비스가 증명(attestation)을 통해 자신의 아이덴티티를 입증할 수 있게 해줘요. 디지털 서명이나 암호 증명 같은 검증 가능한 증거를 제공해서 서비스가 자신의 신뢰성과 무결성을 증명할 수 있도록 보장해요.
- 동적이고 확장 가능한 환경 (Dynamic and scalable environments): SPIFFE는 동적 환경에서 아이덴티티 관리의 과제를 다뤄요. 서비스가 지속적으로 배포, 업데이트, 폐기되는 클라우드 네이티브 아키텍처에서 중요한 자동 아이덴티티 발급, 회전, 폐기를 지원해요.
Cilium과 SPIFFE (Cilium and SPIFFE)
SPIFFE는 워크로드가 중앙 서버에서 아이덴티티를 요청할 수 있는 API 모델을 제공해요. 여기서 워크로드는 Cilium Security Identity와 같은 의미를 갖는데, 즉 레이블 집합으로 설명되는 파드 집합이에요. SPIFFE 아이덴티티는 URI의 하위 클래스이며, spiffe://trust.domain/path/with/encoded/info 같은 모양이에요.
SPIFFE 설정에는 두 가지 주요 부분이 있어요:
- 신뢰 도메인의 신뢰 루트를 형성하는 중앙 SPIRE 서버
- 먼저 SPIRE 서버에서 자신의 아이덴티티를 얻은 다음, 자신의 노드에서 실행되는 워크로드의 아이덴티티 요청을 검증하는 노드별 SPIRE agent
워크로드가 (보통 시작 시에) 자신의 아이덴티티를 얻고 싶으면, SPIFFE workload API를 사용해 로컬 SPIRE agent에 연결하고 자신을 agent에게 설명해요.
그러면 SPIRE agent는 워크로드가 정말로 말하는 그 사람인지 확인한 다음 SPIRE 서버에 연결해서, 워크로드가 아이덴티티를 요청하고 있고 그 요청이 유효하다고 증명해요.
SPIRE agent는 워크로드에 대해 여러 가지를 확인해요 — 파드가 정말로 온 노드에서 실행 중인지, 레이블이 일치하는지 등이에요.
SPIRE agent가 SPIRE 서버에서 아이덴티티를 요청하면, SVID(SPIFFE Verified Identity Document) 형식으로 워크로드에 다시 전달해요. 이 문서에는 X.509 버전의 TLS 키페어가 포함돼요.
SPIRE의 일반적인 흐름에서는 워크로드가 SPIRE 서버에서 자신의 정보를 요청해요. Cilium의 SPIFFE 지원에서는 Cilium agent가 공통 SPIFFE 아이덴티티를 얻고 다른 워크로드를 대신해 직접 아이덴티티를 요청할 수 있어요.
이것은 다음 예제에서 시연돼요.
사전 요구사항 (Prerequisites)
- 상호 인증은 현재 인증서 관리에 SPIFFE API에서만 지원돼요.
- Cilium Helm 차트에는 상호 인증용 SPIRE 서버를 배포하는 옵션이 포함돼 있어요. 직접 SPIRE 서버를 배포하고 Cilium이 그것을 사용하도록 구성할 수도 있어요.
설치 (Installation)
참고
기본 설치는 클러스터에서 PersistentVolumeClaim 지원이 필요해요. 클러스터 프로바이더에 지원되는지, 또는 어떻게 활성화하는지 확인해주세요.
랩이나 로컬 클러스터라면 설치 명령에 authentication.mutual.spire.install.server.dataStorage.enabled=false를 전달해 인메모리 스토리지로 전환할 수 있어요. 단, SPIRE 서버 파드가 재시작되면 모든 데이터를 다시 만들어야 해요.
Cilium CLI로 설치 — 최신 버전의 Cilium CLI를 설치해볼게요. Cilium CLI는 Cilium 설치, Cilium 설치 상태 검사, 다양한 기능(예: clustermesh, Hubble) 활성화/비활성화에 사용할 수 있어요.
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "arm64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-darwin-${CLI_ARCH}.tar.gz{,.sha256sum}
shasum -a 256 -c cilium-darwin-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-darwin-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-darwin-${CLI_ARCH}.tar.gz{,.sha256sum}
전체 릴리스 페이지를 참고해주세요.
상호 인증과 그와 연관된 SPIRE 서버는 다음 명령으로 활성화할 수 있어요. 이 명령은 Cilium CLI Helm 모드 버전 0.15 이상이 필요해요.
$ cilium install \
--set authentication.mutual.spire.enabled=true \
--set authentication.mutual.spire.install.enabled=true
다음으로 Cilium agent와 operator의 상태를 확인할 수 있어요:
$ cilium status
Helm으로 설치 — Cilium Helm 차트에는 상호 인증용 SPIRE 서버를 배포하는 옵션이 포함돼 있어요. 직접 SPIRE 서버를 배포하고 Cilium이 그것을 사용하도록 구성할 수도 있어요. 새 설치에 대해서는 Installation using Helm을 참고해주세요.
helm install cilium cilium/cilium --version 1.20.2 \
--namespace kube-system \
--set authentication.enabled=true \
--set authentication.mutual.spire.enabled=true \
--set authentication.mutual.spire.install.enabled=true
kubectl -n kube-system rollout restart deployment/cilium-operator
kubectl -n kube-system rollout restart ds/cilium
helm install cilium oci://quay.io/cilium/charts/cilium 1.20.2 \
--namespace kube-system \
--set authentication.enabled=true \
--set authentication.mutual.spire.enabled=true \
--set authentication.mutual.spire.install.enabled=true
kubectl -n kube-system rollout restart deployment/cilium-operator
kubectl -n kube-system rollout restart ds/cilium
다음으로 Cilium agent와 operator의 상태를 확인할 수 있어요:
$ cilium status
예제 (Examples)
상호 인증 기능을 사용하고 활용하는 방법은 다음 예제를 참고해주세요:
- Mutual Authentication Example
영상
Cilium의 상호 인증에 대한 영상 설명과 데모를 원한다면 eCHO 에피소드 100 "Next-gen mutual authentication in Cilium"을 확인해보세요.
제한 사항 (Limitations)
- Cilium Mutual Authentication은 아직 개발 중이며 베타로 간주돼요. 계획된 여러 보안 기능이 아직 구현되지 않았어요. 자세한 내용은 아래를 참고해주세요.
- Cilium의 상호 인증은 SPIFFE의 프로덕션 준비 구현인 SPIRE로만 검증됐어요. Cilium은 SPIFFE API를 사용하므로, 다른 SPIFFE 구현도 동작할 수 있어요. 하지만 Cilium은 현재 제공되는 SPIRE 설치로만 테스트되며, 다른 SPIFFE 구현을 사용하는 것은 현재 지원되지 않아요.
- Cluster Mesh와 Service Mesh를 결합하는 여러 클러스터에 걸친 단일 신뢰 도메인을 구축하는 현재 옵션은 없어요. 따라서 Cluster Mesh로 연결된 클러스터는 현재 상호 인증과 호환되지 않아요.
- 상호 인증의 현재 지원은 Cilium이 관리하는 클러스터 안에서만 동작하며, 외부 mTLS 솔루션과는 호환되지 않아요.
상세 로드맵 상태 (Detailed Roadmap Status)
다음 표는 상호 인증 기능의 로드맵 상태를 보여드려요. 보안 모델 관점에서 기능이 완료되기 전에 몇 가지 작업 항목이 남아 있어요. 자세한 내용은 GitHub 이슈 28986을 참고해주세요.
- SPIFFE/SPIRE 통합: Beta
- Agent용 인증 API: Beta
- Agent 간 mTLS 핸드셰이크: Beta
- 아이덴티티별 핸드셰이크를 위한 인증 캐시: Beta
- CiliumNetworkPolicy 지원: Beta
- WireGuard와 통합: TODO
- 연결별 핸드셰이크: TODO
- 인증 데이터와 ipcache 동기화: TODO
- 보안 모델의 상세 문서: TODO
- 모델 침투 테스트 수행: TODO
- 패킷 드롭 최소화: TODO
- 네트워크 암호화에 인증 시크릿 사용: TODO
- 성숙도 검토 및 stable 고려: TODO
더 알아보기 (Learn more)
- Mutual Authentication 예제 — 상호 인증 데모 예제
- 설치 (Prerequisites & Installation) — 상호 인증 설치
- Cilium Service Mesh — Cilium Service Mesh 개요