Securing Control Plane Communications with Ciphers

Dongmin Lee·2024년 3월 5일
0

Kubernetes

목록 보기
9/10

1. Intro

클라이언트와 API 서버, 그리고 다양한 쿠버네티스 구성 요소 간의 통신은 상호 TLS(Mutual TLS, mTLS)를 통해 이루어진다. TLS(전송 계층 보안)는 공개 키 암호화를 사용하여 작동하며 암호화는 사이퍼(ciphers) 로 알려진 암호화 알고리즘에 의해 수행된다. 새로운 사이퍼는 보안성이 더 높기 때문에, 시간이 지나면서 새로 발견되곤 한다.

새로운 사이퍼가 발견될 때마다, 이를 일반적으로 사용하기 위해 암호화를 구현하는 소프트웨어 라이브러리가 업데이트되어야 한다. 이러한 업데이트는 HTTPS (TLS) 프로토콜을 사용하는 모든 소프트웨어에 적용되어야 하며, 아래의 항목들도 포함되어야 한다.

  • Browsers
  • Web clients (e.g. curl, wget)
  • Web servers (e.g. IIS, nginx, apache etc)
  • Layer 7 appliances (e.g. AWS Application Load Balancer, Web Application Firewalls)
  • Kubernetes components (API server, controller manager, kubelet, scheduler)
  • etcd

대부분의 TLS는 소프트웨어 패키지는, 컨트롤 플레인의 모든 구성 요소와 etcd를 포함하여, 연결할 때 협상(negotiation)할 수 있는 사이퍼를 제한할 수 있다. 새로운(강력한) 사이퍼만을 사용하도록 사용 가능한 사이퍼를 제한함으로써, 새로운 사이퍼를 가지고 있지 않은 오래된 클라이언트가 연결을 설정하는 것을 방지할 수 있으며, 이는 취약점이 있는 오래된(약한) 사이퍼를 사용하여 연결이 손상될 수 있는 위험을 줄일 수 있다.

2. Ciphers and the Kubernetes Control Plane

Kubernetes 컨트롤 플레인의 모든 구성 요소(e.g., API server, controller manager, kubelet, scheduler)는 다음과 같은 두 가지 argument을 가지고 있다.

  • --tls-min-version: 연결 협상 시 사용할 수 있는 최소 TLS 버전을 설정한다. 가능한 값: VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13으로, 각각 TLS 1.0부터 TLS 1.3까지를 나타낸다. 기본값은 VersionTLS10이다.
  • --tls-cipher-suites: 연결 협상 시 사용될 수 있는 사이퍼 스위트의 쉼표로 구분된 리스트를 설정한다. 이 리스트는 매우 많으며, 전체 목록은 api server argument page에서 찾을 수 있다. 이 argument를 생략하면 기본값은 GoLang cipher suites package에 의해 제공되는 리스트로 설정된다.

etcd도 마찬가지로 사이퍼 스위트를 설정하는 command line argument를 가지고 있으며, 이를 통해 API 서버와 etcd 간의 통신을 공통으로 사용하는 특정 사이퍼만을 사용하도록 제한할 수 있다.

  • --cipher-suites: 연결 협상 시 사용될 수 있는 사이퍼 스위트의 쉼표로 구분된 리스트를 설정한다. 이 argument를 생략하면 기본값은 GoLang cipher suites package에 의해 제공되는 리스트로 설정된다.

모든 사이퍼 스위트와 TLS 버전의 조합이 서로 호환되는 것은 아니므로, --tls-min-versionVersionTLS13으로 설정한 경우 사용할 수 없는 특정 사이퍼가 있을 수 있으며, --tls-cipher-suites를 사용하여 호환되지 않는 사이퍼를 명시적으로 지정하면 API 서버가 다시 시작되지 않을 수 있다.

CKS 시험 문제에서 사이퍼에 관한 질문을 받게 되면, 어떤 사이퍼를 사용해야 하는지 문제에서 알려줄 것이다.

3. Example

etcd and api server 간의 통신을 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 사이퍼로 제한하고, api server의 최소 TLS 버전을 TLS 1.2로 제한한다면,

  1. Edit the API server manifest and add the following two arguments
--tls-min-version=VersionTLS12
--tls-cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  1. Edit the etcd manifest and add the following argument
--cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  1. Wait for both pods to restart. This may take a minute or more.

만약 둘 중 하나 또는 두 파드 모두 제대로 다시 시작되지 않는 경우, diagnose crashed apiserver를 통해 문제를 진단할 수 있다.

4. References

https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver

0개의 댓글