7.7. IPsec 암호화 구성
IPsec을 활성화하면 클러스터 외부의 Pod와 IPsec 끝점 간의 내부 pod-to-pod 클러스터 트래픽을 모두 암호화할 수 있습니다. OVN-Kubernetes 클러스터 네트워크의 노드 간 모든 pod-to-pod 네트워크 트래픽은 전송 모드에서 IPsec으로 암호화됩니다.
IPsec은 기본적으로 비활성화되어 있습니다. 클러스터를 설치하는 동안 또는 클러스터를 설치한 후 IPsec을 활성화할 수 있습니다. 클러스터 설치에 대한 자세한 내용은 OpenShift Container Platform 설치 개요 를 참조하십시오.
OpenShift Container Platform 클러스터의 IPsec에 대해 다음과 같은 지원 제한 사항이 있습니다.
- OpenShift Container Platform 4.15로 업데이트하기 전에 IPsec을 비활성화해야 합니다. IPsec을 비활성화하지 않고 업데이트하는 경우 pod-to-pod 통신이 중단될 수 있는 알려진 문제가 있습니다. (OCPBUGS-43323)
- IBM Cloud®에서 IPsec은 NAT-T만 지원합니다. 이 플랫폼에서 ESP(Security Payload)를 캡슐화하는 것은 지원되지 않습니다.
- 클러스터에서 Red Hat OpenShift Container Platform에 호스팅되는 컨트롤 플레인 을 사용하는 경우 pod-to-pod 또는 외부 호스트에 대한 트래픽의 IPsec 암호화에는 IPsec이 지원되지 않습니다.
- 하나 이상의 인터페이스가 OVS(Open vSwitch)에 연결된 경우 네트워크 인터페이스에서 ESP 하드웨어 오프로드를 사용할 수 없습니다. 클러스터에 IPsec을 활성화하면 OVS에 연결된 인터페이스가 있는 IPsec 사용이 트리거됩니다. 기본적으로 OpenShift Container Platform은 OVS에 연결된 인터페이스에서 ESP 하드웨어 오프로드를 비활성화합니다.
- OVS에 연결되지 않은 네트워크 인터페이스에 IPsec을 활성화한 경우 클러스터 관리자는 OVS에 연결되지 않은 각 인터페이스에서 ESP 하드웨어 오프로드를 수동으로 비활성화해야 합니다.
다음 목록은 IPsec 문서의 주요 작업을 간략하게 설명합니다.
- 클러스터 설치 후 IPsec을 활성화하고 비활성화합니다.
- 클러스터와 외부 호스트 간의 트래픽에 대한 IPsec 암호화를 구성합니다.
- IPsec이 다른 노드의 Pod 간 트래픽을 암호화하는지 확인합니다.
7.7.1. 작업 모드
OpenShift Container Platform 클러스터에서 IPsec을 사용하는 경우 다음 운영 모드에서 선택할 수 있습니다.
모드 | 설명 | 기본 |
---|---|---|
| 트래픽은 암호화되지 않습니다. 이는 클러스터 기본값입니다. | 제공됨 |
| pod-to-pod 트래픽은 "Pod-to-pod IPsec"에 의해 암호화된 네트워크 트래픽 흐름의 유형에 설명된 대로 암호화됩니다. IPsec에 필요한 구성 단계를 완료한 후 외부 노드로의 트래픽이 암호화될 수 있습니다. | 없음 |
| IPsec에 필요한 구성 단계를 완료한 후 외부 노드로의 트래픽이 암호화될 수 있습니다. | 없음 |
7.7.2. 사전 요구 사항
외부 호스트에 대한 트래픽을 암호화하기 위한 IPsec 지원의 경우 다음 사전 요구 사항이 충족되어야 합니다.
-
OVN-Kubernetes 네트워크 플러그인은 로컬 게이트웨이 모드에서 구성해야 합니다. 여기서
ovnKubernetesConfig.gatewayConfig.routingViaHost=true
. NMState Operator가 설치되어 있습니다. 이 Operator는 IPsec 구성을 지정하는 데 필요합니다. 자세한 내용은 Kubernetes NMState Operator 정보를 참조하십시오.
참고NMState Operator는 IPsec 구성에 대해서만 GCP(Google Cloud Platform)에서 지원됩니다.
-
Butane 툴(
butane
)이 설치되어 있습니다. Butane을 설치하려면 Butane 설치를 참조하십시오.
이러한 사전 요구 사항은 호스트 NSS 데이터베이스에 인증서를 추가하고 외부 호스트와 통신하도록 IPsec을 구성해야 합니다.
7.7.3. IPsec이 활성화된 경우 네트워크 연결 요구 사항
OpenShift Container Platform 클러스터 구성 요소가 통신할 수 있도록 시스템 간 네트워크 연결을 구성해야 합니다. 각 시스템에서 클러스터에 있는 다른 모든 시스템의 호스트 이름을 확인할 수 있어야 합니다.
프로토콜 | 포트 | 설명 |
---|---|---|
UDP |
| IPsec IKE 패킷 |
| IPsec NAT-T 패킷 | |
ESP | 해당 없음 | IPsec Encapsulating Security Payload (ESP) |
7.7.4. pod-to-pod 트래픽에 대한 IPsec 암호화
pod-to-pod 트래픽의 IPsec 암호화의 경우 다음 섹션에서는 어떤 특정 pod-to-pod 트래픽이 암호화되는지, 어떤 종류의 암호화 프로토콜이 사용되는지, X.509 인증서가 처리되는 방법을 설명합니다. 이러한 섹션은 특정 외부 네트워크 인프라에 대해 수동으로 구성해야 하는 클러스터와 외부 호스트 간의 IPsec 암호화에는 적용되지 않습니다.
7.7.4.1. pod-to-pod IPsec으로 암호화된 네트워크 트래픽 흐름 유형
IPsec을 활성화하면 포드 간 다음 네트워크 트래픽 흐름만 암호화됩니다.
- 클러스터 네트워크의 서로 다른 노드에 있는 pod 간 트래픽
- 호스트 네트워크의 포드에서 클러스터 네트워크의 포드로의 트래픽
다음 트래픽 흐름은 암호화되지 않습니다.
- 클러스터 네트워크의 동일한 노드에 있는 pod 간 트래픽
- 호스트 네트워크의 포드 간 트래픽
- 클러스터 네트워크의 포드에서 호스트 네트워크 포드로의 트래픽
암호화되거나 암호화되지 않은 흐름은 다음 다이어그램에 설명되어 있습니다.
7.7.4.2. 암호화 프로토콜 및 IPsec 모드
사용된 암호화 암호는 AES-GCM-16-256
입니다. 무결성 검사 값(ICV)은 16
바이트입니다. 키 길이는 256
비트입니다.
사용된 IPsec 모드는 전송 모드입니다. 즉, ESP(Encapsulated Security Payload) 헤더를 원래 패킷의 IP 헤더에 추가하고 패킷 데이터를 암호화하여 엔드 투 엔드 통신을 암호화하는 모드입니다. OpenShift Container Platform은 현재 pod-to-pod 통신에 IPsec tunnel 모드를 사용하거나 지원하지 않습니다.
7.7.4.3. 보안 인증서 생성 및 교체
CNO(Cluster Network Operator)는 암호화에 IPsec에서 사용하는 자체 서명된 X.509 인증 기관(CA)을 생성합니다. 각 노드의 CSR(인증서 서명 요청)은 CNO에서 자동으로 충족됩니다.
CA는 10년 동안 유효합니다. 개별 노드 인증서는 5년간 유효하며 4년 6개월 경과 후 자동으로 교체됩니다.
7.7.5. 외부 트래픽에 대한 IPsec 암호화
OpenShift Container Platform은 제공해야 하는 TLS 인증서가 있는 외부 호스트에 대한 트래픽에 대해 IPsec 암호화를 지원합니다.
7.7.5.1. 지원되는 플랫폼
이 기능은 다음 플랫폼에서 지원됩니다.
- 베어 메탈
- GCP(Google Cloud Platform)
- Red Hat OpenStack Platform (RHOSP)
- VMware vSphere
RHEL(Red Hat Enterprise Linux) 작업자 노드가 있는 경우 외부 트래픽에 대해 IPsec 암호화를 지원하지 않습니다.
클러스터에서 Red Hat OpenShift Container Platform에 호스팅된 컨트롤 플레인을 사용하는 경우 외부 호스트에 대한 트래픽을 암호화하기 위해 IPsec을 구성하는 것은 지원되지 않습니다.
7.7.5.2. 제한
다음과 같은 금지 사항이 있는지 확인합니다.
- IPv6 구성은 현재 외부 트래픽에 대해 IPsec을 구성할 때 NMState Operator에서 지원되지 않습니다.
-
제공된 인증서 번들에 있는 인증서 공통 이름(CN)은
ovs_
접두사로 시작해야 합니다. 이 이름은 각 노드의 NSS(Network Security Services) 데이터베이스의 pod-to-pod IPsec CN 이름과 충돌할 수 있기 때문입니다.
7.7.6. IPsec 암호화 활성화
클러스터 관리자는 클러스터와 외부 IPsec 끝점 간에 pod-to-pod IPsec 암호화 및 IPsec 암호화를 활성화할 수 있습니다.
다음 모드 중 하나로 IPsec을 구성할 수 있습니다.
-
full
: pod-to-pod 및 외부 트래픽에 대한 암호화 -
External
: 외부 트래픽의 암호화
pod-to-pod 트래픽 외에도 외부 트래픽에 대한 암호화를 구성해야 하는 경우 "외부 트래픽의 IPsec 암호화 구성" 절차도 완료해야 합니다.
사전 요구 사항
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. -
IPsec ESP 헤더의 오버헤드를 허용하도록 클러스터 MTU의 크기를
46
바이트 감소했습니다.
프로세스
IPsec 암호화를 활성화하려면 다음 명령을 입력합니다.
$ oc patch networks.operator.openshift.io cluster --type=merge \ -p '{ "spec":{ "defaultNetwork":{ "ovnKubernetesConfig":{ "ipsecConfig":{ "mode":<mode> }}}}}'
다음과 같습니다.
mode
-
외부
호스트에 대한 트래픽만 암호화하거나 Pod 트래픽에 Pod로 Pod를 암호화하고 선택적으로 외부 호스트로 트래픽을 암호화하려면Full
을 지정합니다. 기본적으로 IPsec은 비활성화되어 있습니다.
- 선택 사항: 외부 호스트에 대한 트래픽을 암호화해야 하는 경우 "외부 트래픽용 IPsec 암호화 구성" 절차를 완료합니다.
검증
OVN-Kubernetes 데이터 플레인 Pod의 이름을 찾으려면 다음 명령을 입력합니다.
$ oc get pods -n openshift-ovn-kubernetes -l=app=ovnkube-node
출력 예
ovnkube-node-5xqbf 8/8 Running 0 28m ovnkube-node-6mwcx 8/8 Running 0 29m ovnkube-node-ck5fr 8/8 Running 0 31m ovnkube-node-fr4ld 8/8 Running 0 26m ovnkube-node-wgs4l 8/8 Running 0 33m ovnkube-node-zfvcl 8/8 Running 0 34m
다음 명령을 실행하여 클러스터에서 IPsec이 활성화되어 있는지 확인합니다.
참고클러스터 관리자는 IPsec이
전체
모드로 구성된 경우 클러스터의 Pod 간에 IPsec이 활성화되어 있는지 확인할 수 있습니다. 이 단계에서는 클러스터와 외부 호스트 간에 IPsec이 작동하는지 확인하지 않습니다.$ oc -n openshift-ovn-kubernetes rsh ovnkube-node-<XXXXX> ovn-nbctl --no-leader-only get nb_global . ipsec
다음과 같습니다.
<XXXXX>
- 이전 단계에서 Pod의 임의의 문자 시퀀스를 지정합니다.
출력 예
true
7.7.7. 외부 트래픽에 대한 IPsec 암호화 구성
클러스터 관리자는 IPsec을 사용하여 외부 트래픽을 암호화하려면 PKCS#12 인증서 제공을 포함하여 네트워크 인프라에 대해 IPsec을 구성해야 합니다. 이 절차에서는 Butane을 사용하여 머신 구성을 생성하므로 butane
명령이 설치되어 있어야 합니다.
머신 구성을 적용한 후 Machine Config Operator가 클러스터의 영향을 받는 노드를 재부팅하여 새 머신 구성을 롤아웃합니다.
사전 요구 사항
-
OpenShift CLI(
oc
)를 설치합니다. -
로컬 컴퓨터에
butane
유틸리티를 설치했습니다. - NMState Operator가 클러스터에 설치되어 있습니다.
-
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. - IPsec 끝점에 대한 기존 PKCS#12 인증서와 PEM 형식의 CA 인증서가 있습니다.
-
클러스터에서
전체
또는외부
모드에서 IPsec을 활성화했습니다. -
OVN-Kubernetes 네트워크 플러그인은 로컬 게이트웨이 모드에서 구성해야 합니다. 여기서
ovnKubernetesConfig.gatewayConfig.routingViaHost=true
.
프로세스
NMState Operator 노드 네트워크 구성 정책을 사용하여 IPsec 구성을 생성합니다. 자세한 내용은 IPsec VPN 구현으로 Libreswan을 참조하십시오.
IPsec 끝점인 클러스터 노드의 IP 주소를 확인하려면 다음 명령을 입력합니다.
$ oc get nodes
다음 예와 같이 NMState Operator에 대한 노드 네트워크 구성 정책이 포함된
ipsec-config.yaml
이라는 파일을 생성합니다.NodeNetworkConfigurationPolicy
오브젝트에 대한 개요 는 Kubernetes NMState 프로젝트를 참조하십시오.NMState IPsec 전송 구성의 예
apiVersion: nmstate.io/v1 kind: NodeNetworkConfigurationPolicy metadata: name: ipsec-config spec: nodeSelector: kubernetes.io/hostname: "<hostname>" 1 desiredState: interfaces: - name: <interface_name> 2 type: ipsec libreswan: left: <cluster_node> 3 leftid: '%fromcert' leftrsasigkey: '%cert' leftcert: left_server leftmodecfgclient: false right: <external_host> 4 rightid: '%fromcert' rightrsasigkey: '%cert' rightsubnet: <external_address>/32 5 ikev2: insist type: transport
- 1
- 정책을 적용할 호스트 이름을 지정합니다. 이 호스트는 IPsec 구성에서 왼쪽 호스트로 사용됩니다.
- 2
- 호스트에서 생성할 인터페이스의 이름을 지정합니다.
- 3
- 클러스터 측에서 IPsec 터널을 종료하는 클러스터 노드의 호스트 이름을 지정합니다. 이름은 제공된 PKCS#12 인증서의 SAN
[Subject Alternate Name]
과 일치해야 합니다. - 4
host.example.com
과 같은 외부 호스트 이름을 지정합니다. 이름은 제공된 PKCS#12 인증서의 SAN[Subject Alternate Name]
과 일치해야 합니다.- 5
10.1.2.3/32
와 같은 외부 호스트의 IP 주소를 지정합니다.
NMState IPsec 터널 구성의 예
apiVersion: nmstate.io/v1 kind: NodeNetworkConfigurationPolicy metadata: name: ipsec-config spec: nodeSelector: kubernetes.io/hostname: "<hostname>" 1 desiredState: interfaces: - name: <interface_name> 2 type: ipsec libreswan: left: <cluster_node> 3 leftid: '%fromcert' leftmodecfgclient: false leftrsasigkey: '%cert' leftcert: left_server right: <external_host> 4 rightid: '%fromcert' rightrsasigkey: '%cert' rightsubnet: <external_address>/32 5 ikev2: insist type: tunnel
- 1
- 정책을 적용할 호스트 이름을 지정합니다. 이 호스트는 IPsec 구성에서 왼쪽 호스트로 사용됩니다.
- 2
- 호스트에서 생성할 인터페이스의 이름을 지정합니다.
- 3
- 클러스터 측에서 IPsec 터널을 종료하는 클러스터 노드의 호스트 이름을 지정합니다. 이름은 제공된 PKCS#12 인증서의 SAN
[Subject Alternate Name]
과 일치해야 합니다. - 4
host.example.com
과 같은 외부 호스트 이름을 지정합니다. 이름은 제공된 PKCS#12 인증서의 SAN[Subject Alternate Name]
과 일치해야 합니다.- 5
10.1.2.3/32
와 같은 외부 호스트의 IP 주소를 지정합니다.
IPsec 인터페이스를 구성하려면 다음 명령을 입력합니다.
$ oc create -f ipsec-config.yaml
각 호스트의 NSS(Network Security Services) 데이터베이스에 추가할 다음 인증서 파일을 제공합니다. 이러한 파일은 후속 단계에서 Butane 구성의 일부로 가져옵니다.
-
left_server.p12
: IPsec 엔드포인트의 인증서 번들 -
ca.pem
: 인증서에 서명한 인증 기관
-
클러스터에 인증서를 추가할 머신 구성을 생성합니다.
컨트롤 플레인 및 작업자 노드에 대한 Butane 구성 파일을 생성하려면 다음 명령을 입력합니다.
$ for role in master worker; do cat >> "99-ipsec-${role}-endpoint-config.bu" <<-EOF variant: openshift version: 4.17.0 metadata: name: 99-${role}-import-certs labels: machineconfiguration.openshift.io/role: $role systemd: units: - name: ipsec-import.service enabled: true contents: | [Unit] Description=Import external certs into ipsec NSS Before=ipsec.service [Service] Type=oneshot ExecStart=/usr/local/bin/ipsec-addcert.sh RemainAfterExit=false StandardOutput=journal [Install] WantedBy=multi-user.target storage: files: - path: /etc/pki/certs/ca.pem mode: 0400 overwrite: true contents: local: ca.pem - path: /etc/pki/certs/left_server.p12 mode: 0400 overwrite: true contents: local: left_server.p12 - path: /usr/local/bin/ipsec-addcert.sh mode: 0740 overwrite: true contents: inline: | #!/bin/bash -e echo "importing cert to NSS" certutil -A -n "CA" -t "CT,C,C" -d /var/lib/ipsec/nss/ -i /etc/pki/certs/ca.pem pk12util -W "" -i /etc/pki/certs/left_server.p12 -d /var/lib/ipsec/nss/ certutil -M -n "left_server" -t "u,u,u" -d /var/lib/ipsec/nss/ EOF done
이전 단계에서 생성한 Butane 파일을 머신 구성으로 변환하려면 다음 명령을 입력합니다.
$ for role in master worker; do butane -d . 99-ipsec-${role}-endpoint-config.bu -o ./99-ipsec-$role-endpoint-config.yaml done
머신 구성을 클러스터에 적용하려면 다음 명령을 입력합니다.
$ for role in master worker; do oc apply -f 99-ipsec-${role}-endpoint-config.yaml done
중요MCO(Machine Config Operator)는 각 머신 구성 풀에서 머신을 업데이트하므로 각 노드를 하나씩 재부팅합니다. 외부 IPsec 연결을 사용할 수 있으려면 모든 노드가 업데이트될 때까지 기다려야 합니다.
다음 명령을 입력하여 머신 구성 풀 상태를 확인합니다.
$ oc get mcp
업데이트된 노드의 상태가
UPDATED=true
,UPDATING=false
,DEGRADED=false
입니다.참고기본적으로 MCO는 풀당 한 번에 하나의 시스템을 업데이트하므로 클러스터 크기에 따라 마이그레이션에 걸리는 총 시간이 증가합니다.
IPsec 머신 구성이 성공적으로 롤아웃되었는지 확인하려면 다음 명령을 입력합니다.
IPsec 머신 구성이 생성되었는지 확인합니다.
$ oc get mc | grep ipsec
출력 예
80-ipsec-master-extensions 3.2.0 6d15h 80-ipsec-worker-extensions 3.2.0 6d15h
IPsec 확장이 컨트롤 플레인 노드에 적용되는지 확인합니다.
$ oc get mcp master -o yaml | grep 80-ipsec-master-extensions -c
예상 출력
2
IPsec 확장이 작업자 노드에 적용되었는지 확인합니다.
$ oc get mcp worker -o yaml | grep 80-ipsec-worker-extensions -c
예상 출력
2
추가 리소스
- nmstate IPsec API에 대한 자세한 내용은 IPsec 암호화를참조하십시오.
7.7.8. 외부 IPsec 끝점에 대한 IPsec 암호화 비활성화
클러스터 관리자는 기존 IPsec 터널을 외부 호스트에 제거할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다. -
클러스터에서
전체
또는외부
모드에서 IPsec을 활성화했습니다.
프로세스
다음 YAML을 사용하여
remove-ipsec-tunnel.yaml
이라는 파일을 생성합니다.kind: NodeNetworkConfigurationPolicy apiVersion: nmstate.io/v1 metadata: name: <name> spec: nodeSelector: kubernetes.io/hostname: <node_name> desiredState: interfaces: - name: <tunnel_name> type: ipsec state: absent
다음과 같습니다.
name
- 노드 네트워크 구성 정책의 이름을 지정합니다.
node_name
- 삭제할 IPsec 터널이 있는 노드의 이름을 지정합니다.
tunnel_name
- 기존 IPsec 터널의 인터페이스 이름을 지정합니다.
IPsec 터널을 제거하려면 다음 명령을 입력합니다.
$ oc apply -f remove-ipsec-tunnel.yaml
7.7.9. IPsec 암호화 비활성화
클러스터 관리자는 IPsec 암호화를 비활성화할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 클러스터에 로그인합니다.
프로세스
IPsec 암호화를 비활성화하려면 다음 명령을 입력합니다.
$ oc patch networks.operator.openshift.io cluster --type=merge \ -p '{ "spec":{ "defaultNetwork":{ "ovnKubernetesConfig":{ "ipsecConfig":{ "mode":"Disabled" }}}}}'
-
선택 사항: IP 패킷의 IPsec ESP 헤더에서 오버헤드가 더 이상 없으므로 클러스터 MTU 크기를
46
바이트까지 늘릴 수 있습니다.
7.7.10. 추가 리소스
- RHEL(Red Hat Enterprise Linux) 9에서 IPsec을 사용하여 VPN 구성
- Butane 설치
- OVN-Kubernetes CNI(Container Network Interface) 네트워크 플러그인 정보
- 클러스터 네트워크의 MTU 변경
- Network [operator.openshift.io/v1] API