본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

클러스터 내 파드 트래픽 암호화

원문 보기 위키 갱신

Calico 클러스터에서 WireGuard로 파드 간 트래픽을 암호화하는 방법을 다뤄요. 클러스터 내부 트래픽에 전송 계층 수준의 암호화를 쉽게 켤 수 있어요. FelixConfiguration의 파라미터로 IPv4와 IPv6를 독립적으로 활성화하는 절차도 함께 배워요.

출처: 문서

본문

전체 그림

WireGuard를 활성화해서 Calico 클러스터의 노드 간, 클러스터 내 파드 트래픽을 전송 구간에서 보호해요.

가치

이 기능을 활성화하면 Calico가 노드 사이에 WireGuard 터널을 자동으로 만들고 관리해서, 노드 간 클러스터 내 파드 트래픽에 전송 수준 보안을 제공해요. WireGuard는 특수 하드웨어 없이도 형식 검증(formally verified)된 보안과 성능 좋은 터널을 제공해요. WireGuard 구현을 깊이 파고들고 싶다면 이 백서를 보세요.

개념

WireGuard 소개

Calico는 노드 간 파드 트래픽과 노드 간 호스트 네트워크 트래픽을 모두 지원해요. Calico는 사이드카 방식이 아니기 때문에, 한 파드에서 다른 파드로 가는 전체 경로가 암호화되는 건 아니에요. 경로 중 호스트-호스트 구간만 암호화돼요. 호스트-파드 구간에는 암호화되지 않은 트래픽이 있지만, 공격자가 이 트래픽을 가로채기는 쉽지 않아요. 암호화되지 않은 트래픽을 가로채려면 노드에 대한 root 권한이 필요하죠.

Calico는 IPv4와 IPv6 트래픽 모두에 WireGuard 암호화를 지원해요. FelixConfiguration 리소스의 파라미터로 각각 독립적으로 활성화할 수 있어요:

  • wireguardEnabled - IPv4 언더레이 네트워크 위 IPv4 트래픽 암호화를 활성화
  • wireguardEnabledV6 - IPv6 언더레이 네트워크 위 IPv6 트래픽 암호화를 활성화

시작하기 전에...

용어

  • 노드 간 파드 트래픽: 한 노드의 파드에서 나와 다른 노드의 파드를 목적지로 하는 트래픽
  • 노드 간 호스트 네트워크 트래픽: 노드 자체가 만들었거나, 다른 노드 또는 호스트 네트워크 파드를 목적지로 하는 호스트 네트워크 파드의 트래픽
  • 같은 노드 파드 트래픽: 같은 노드의 파드 사이 트래픽

지원되는 암호화

  • 노드 간 파드 트래픽: IPv4만
  • 노드 간 호스트 네트워크 트래픽, IPv4/IPv6: EKS와 AKS에 배포된 관리형 클러스터에서만 지원

미지원

  • 암호화된 같은 노드 파드 트래픽
  • GKE
  • 자체 커스텀 키를 사용한 트래픽 암호화

필수 사항

  • Calico 암호화에 참여하려는 클러스터의 모든 노드에서, 노드의 운영체제에 WireGuard가 설치되어 있는지 확인하세요.

    참고: 일부 노드 운영체제는 WireGuard를 지원하지 않거나 기본 설치가 아니에요. Calico WireGuard 암호화를 활성화하는 데 모든 노드에 WireGuard가 설치되어 있을 필요는 없어요. 다만 WireGuard가 설치되지 않은 노드로 오가는 트래픽은 암호화되지 않아요.

  • 클러스터의 모든 노드에 대한 IP 주소. 노드 사이에 보안 터널을 맺는 데 필요해요. Calico가 IP 자동 탐지 방법으로 이 작업을 자동으로 할 수 있어요.

방법

WireGuard 설치

WireGuard는 Linux 5.6+ 커널에 포함되어 있고, 일부 리눅스 배포판에서는 더 오래된 커널로 백포트되어 있어요.

운영체제별 안내에 따라 클러스터 노드에 WireGuard를 설치하세요. WireGuard 설치 후 커널 모듈을 시스템에서 사용할 수 있도록 노드를 재부팅해야 할 수 있어요.

WireGuard 설치 페이지에 없는 플랫폼은 WireGuard 활성화로 넘어가기 전에 다음 안내를 사용하세요.

Tab: EKS

기본 Amazon Machine Image(AMI)에 WireGuard를 설치하려면:

   sudo yum install kernel-devel-`uname -r` -y
   sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y
   sudo curl -o /etc/yum.repos.d/jdoss-wireguard-epel-7.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
   sudo yum install wireguard-dkms wireguard-tools -y

Tab: AKS

AKS 클러스터 노드는 WireGuard가 이미 설치된 커널의 Ubuntu를 실행하므로, 수동 설치가 필요 없어요.

Tab: OpenShift

OpenShift v4.8에 WireGuard를 설치하려면:

  1. 필수 요소를 설치해요:

  2. kmods에 필요한 도구를 내려받고 구성해요.

FAKEROOT=$(mktemp -d)
git clone https://github.com/tigera/kmods-via-containers
cd kmods-via-containers
make install FAKEROOT=${FAKEROOT}
cd ..
git clone https://github.com/tigera/kvc-wireguard-kmod
cd kvc-wireguard-kmod
make install FAKEROOT=${FAKEROOT}
cd ..
  1. ${FAKEROOT}/root/etc/kvc/wireguard-kmod.conf를 구성/편집해요.

    a. conf 파일 $FAKEROOT/etc/kvc/wireguard-kmod.conf에 KERNEL_CORE_RPM, KERNEL_DEVEL_RPM, KERNEL_MODULES_RPM 패키지의 URL을 설정해야 해요. kernel-core, kernel-devel, kernel-modules rpm 사본은 RedHat Access에서 받아, OCP 워커가 접근할 수 있는 http 파일 서버에 올려두세요.

    b. kvc-wireguard-kmod/wireguard-kmod.conf 구성과 WireGuard 버전-커널 버전 호환성에 도움이 필요하면 kvc-wireguard-kmod README 파일을 참고하세요.

  2. 클러스터의 호스트에서 자신의 RHEL8 시스템으로 RHEL Entitlement 데이터를 가져와요.

    tar -czf subs.tar.gz /etc/pki/entitlement/ /etc/rhsm/ /etc/yum.repos.d/redhat.repo
    
  3. subs.tar.gz 파일을 작업 공간으로 복사한 뒤 다음 명령으로 내용을 풀어요.

    tar -x -C ${FAKEROOT}/root -f subs.tar.gz
    
  4. CoreOS Butane으로 머신 구성을 트랜스파일해요.

    cd kvc-wireguard-kmod
    make ignition FAKEROOT=${FAKEROOT} > mc-wg.yaml
    
  5. 클러스터에 KUBECONFIG를 설정한 상태에서, 다음 명령으로 MachineConfig를 적용해 클러스터 전체에 WireGuard를 설치해요.

    oc create -f mc-wg.yaml
    

클러스터에서 WireGuard 활성화

Tab: Operator

다음 명령으로 모든 노드에서 IPv4 WireGuard 암호화를 활성화해요.

kubectl patch felixconfiguration default --type='merge' -p '{"spec":{"wireguardEnabled":true}}'

다음 명령으로 모든 노드에서 IPv6 WireGuard 암호화를 활성화해요.

kubectl patch felixconfiguration default --type='merge' -p '{"spec":{"wireguardEnabledV6":true}}'

모든 노드에서 IPv4와 IPv6 WireGuard 암호화를 모두 활성화하려면 다음 명령을 사용해요.

kubectl patch felixconfiguration default --type='merge' -p '{"spec":{"wireguardEnabled":true,"wireguardEnabledV6":true}}'

Tab: Manifest

다음 명령으로 모든 노드에서 IPv4 WireGuard 암호화를 활성화해요.

calicoctl patch felixconfiguration default --type='merge' -p '{"spec":{"wireguardEnabled":true}}'

다음 명령으로 모든 노드에서 IPv6 WireGuard 암호화를 활성화해요.

calicoctl patch felixconfiguration default --type='merge' -p '{"spec":{"wireguardEnabledV6":true}}'

모든 노드에서 IPv4와 IPv6 WireGuard 암호화를 모두 활성화하려면 다음 명령을 사용해요.

calicoctl patch felixconfiguration default --type='merge' -p '{"spec":{"wireguardEnabled":true,"wireguardEnabledV6":true}}'

다음 단계는 EKS와 AKS 클러스터에서만, 그리고 클러스터가 Calico CNI가 아닌 클라우드 공급자 CNI 플러그인을 사용하는 경우에만 수행하세요. 다음 명령으로 노드 간 호스트 네트워크 트래픽에 WireGuard 암호화를 활성화해요.

calicoctl patch felixconfiguration default --type='merge' -p '{"spec": {"wireguardHostEncryptionEnabled": true}}'

OpenShift라면 WireGuard가 활성화된 Felix 구성을 커스텀 리소스 아래에 추가해요.

참고: 위 명령은 다른 WireGuard 속성을 바꾸는 데도 쓸 수 있어요. 다른 WireGuard 파라미터와 구성 평가 목록은 Felix 구성을 참고하세요.

WireGuard 활성화 시 Calico 네트워킹이 사용하는 MTU를 검토하고 수정하면 네트워크 성능이 좋아져요. 네트워크 성능 극대화를 위한 MTU 구성 가이드의 안내에 따라 네트워크에 맞는 MTU 값을 설정하세요.

개별 노드에서 WireGuard 비활성화

WireGuard가 설치된 특정 노드에서 WireGuard를 끄려면, 노드 전용 Felix 구성을 수정해요. 예를 들어 my-node 노드의 트래픽 암호화를 끄려면 다음 명령을 사용해요. 이 명령은 IPv4와 IPv6 모두에 대해 WireGuard를 비활성화하니, 한쪽 IP 버전만 끌 때는 그에 맞게 수정하세요:

cat <<EOF | kubectl apply -f -
apiVersion: projectcalico.org/v3
kind: FelixConfiguration
metadata:
  name: node.my-node
spec:
  logSeverityScreen: Info
  reportingInterval: 0s
  wireguardEnabled: false
  wireguardEnabledV6: false
EOF

위 명령을 실행하면 Calico는 my-node 노드로 오가는 트래픽을 전혀 암호화하지 않아요.

my-node 노드에서 IPv4와 IPv6 노드 간 파드 트래픽 암호화를 다시 켜려면, 이 노드의 FelixConfiguration을 패치하세요(IPv4 또는 IPv6만 다룰 때는 그에 맞게 수정):

calicoctl patch felixconfiguration node.my-node --type='merge' -p '{"spec":{"wireguardEnabled":true,"wireguardEnabledV6":true}}'

구성 확인

노드가 WireGuard 암호화로 구성됐는지 확인하려면, calicoctl로 Felix가 설정한 노드 상태를 확인해요. 예를 들면:

     calicoctl get node <NODE-NAME> -o yaml
   ...
   status:
     ...
     wireguardPublicKey: jlkVyQYooZYzI2wFfNhSZez5eWh44yfq1wKVjLvSXgY=
     wireguardPublicKeyV6: hTnWXGM4qk/Z8fQgyGFdpPd4qM9QGR2ey30s31yC6g4=
     ...

클러스터에서 WireGuard 비활성화

모든 노드에서 WireGuard를 끄려면 기본 Felix 구성을 수정해요. 예를 들면:

  calicoctl patch felixconfiguration default --type='merge' -p '{"spec":{"wireguardEnabled":false,"wireguardEnabledV6":false}}'

추가 리소스

더 알아보기 (Learn more)

암호화를 켠 뒤에는 MTU 구성 가이드로 오버헤드를 보정하는 걸 잊지 마세요. WireGuard의 설계 배경이 궁금하면 공식 백서가 좋은 출발점이에요.