하드닝 가이드 - 스케줄러 구성

하드닝 가이드 - 스케줄러 구성 (Hardening Guide - Scheduler Configuration)

쿠버네티스 스케줄러제어 플레인의 핵심 컴포넌트 중 하나예요.

이 문서는 스케줄러의 보안 자세(posture)를 개선하는 방법을 다뤄요.

잘못 구성된 스케줄러는 보안상 영향을 미칠 수 있어요. 그런 스케줄러는 특정 노드를 대상으로 삼아 그 노드와 그 리소스를 공유하는 워크로드나 애플리케이션을 축출(evict)할 수 있어요. 이는 취약한 오토스케일러를 공격하는 Yo-Yo attack을 돕는 데 사용될 수 있어요.

출처: 문서

본문

kube-scheduler 구성

스케줄러 인증·인가 명령줄 옵션

인증 구성을 설정할 때 kube-scheduler의 인증이 kube-api-server의 인증과 일관되게 유지되도록 해야 해요. 어떤 요청에 인증 헤더가 없는 경우, 인증은 클러스터 안의 모든 인증이 일관되게 유지되도록 kube-api-server를 통해 일어나야 해요.

  • authentication-kubeconfig: 스케줄러가 API 서버에서 인증 구성 옵션을 가져올 수 있도록 올바른 kubeconfig를 제공해요. 이 kubeconfig 파일은 엄격한 파일 권한으로 보호해야 해요.
  • authentication-tolerate-lookup-failure: 스케줄러가 API 서버에서 인증 구성을 항상 조회하도록 하려면 이 값을 false 로 설정해요.
  • authentication-skip-lookup: 스케줄러가 API 서버에서 인증 구성을 항상 조회하도록 하려면 이 값을 false 로 설정해요.
  • authorization-always-allow-paths: 이 경로는 익명 인가에 적합한 데이터로 응답해야 해요. 기본값은 /healthz,/readyz,/livez 예요.
  • profiling: 디버깅 정보를 제공하지만 프로덕션 클러스터에서 활성화하면 서비스 거부(denial of service)나 정보 누출의 위험이 되므로 false 로 설정해 프로파일링 엔드포인트를 비활성화해요. --profiling 인자는 더 이상 사용되지 않으며 이제 KubeScheduler DebuggingConfiguration으로 제공할 수 있어요. 프로파일링은 kube-scheduler 구성에서 enableProfilingfalse 로 설정해 비활성화할 수 있어요.
  • requestheader-client-ca-file: 이 인자를 전달하지 마세요.

스케줄러 네트워킹 명령줄 옵션

  • bind-address: 대부분의 경우 kube-scheduler는 외부에서 접근할 필요가 없어요. 바인드 주소를 localhost 로 설정하는 것이 안전한 관행이에요.
  • permit-address-sharing: SO_REUSEADDR 을 통한 연결 공유를 비활성화하려면 false 로 설정해요. SO_REUSEADDRTIME_WAIT 상태에 있는 종료된 연결의 재사용으로 이어질 수 있어요.
  • permit-port-sharing: 기본값 false. 보안 영향을 완전히 이해하지 못했다면 기본값을 사용해요.

스케줄러 TLS 명령줄 옵션

  • tls-cipher-suites: 항상 선호하는 암호 스위트 목록을 제공해요. 이렇게 하면 안전하지 않은 암호 스위트로 암호화가 일어나지 않아요.

커스텀 스케줄러용 스케줄링 구성

쿠버네티스 스케줄링 코드에 기반한 커스텀 스케줄러를 사용할 때, 클러스터 관리자는 queueSort, prefilter, filter, permit 확장 지점(extension points)을 사용하는 플러그인에 주의해야 해요. 이 확장 지점들은 스케줄링 프로세스의 다양한 단계를 제어하며, 잘못된 구성은 클러스터에서 kube-scheduler의 동작에 영향을 줄 수 있어요.

핵심 고려 사항

  • queueSort 확장 지점을 사용하는 플러그인은 한 번에 정확히 하나만 활성화할 수 있어요. queueSort 를 사용하는 플러그인은 면밀히 검토해야 해요.
  • prefilter 또는 filter 확장 지점을 구현하는 플러그인은 모든 노드를 스케줄 불가능으로 표시할 수 있어요. 이는 새 파드의 스케줄링을 중단시킬 수 있어요.
  • permit 확장 지점을 구현하는 플러그인은 파드의 바인딩을 방지하거나 지연시킬 수 있어요. 그런 플러그인은 클러스터 관리자가 철저히 검토해야 해요.

기본 플러그인이 아닌 플러그인을 사용할 때는 다음과 같이 queueSort, filter, permit 확장 지점을 비활성화하는 것을 고려해요:

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: my-scheduler
    plugins:
      # Disable specific plugins for different extension points
      # You can disable all plugins for an extension point using "*"
      queueSort:
        disabled:
        - name: "*"             # Disable all queueSort plugins
      # - name: "PrioritySort"  # Disable specific queueSort plugin
      filter:
        disabled:
        - name: "*"                 # Disable all filter plugins
      # - name: "NodeResourcesFit"  # Disable specific filter plugin
      permit:
        disabled:
        - name: "*"               # Disables all permit plugins
      # - name: "TaintToleration" # Disable specific permit plugin

이렇게 하면 my-scheduler 라는 스케줄러 프로필이 생성돼요. 파드의 .spec.spec.schedulerName 값이 없으면 kube-scheduler는 기본 구성과 기본 플러그인을 사용해 그 파드에 대해 실행돼요. .spec.schedulerNamemy-scheduler 로 설정된 파드를 정의하면 kube-scheduler는 실행되지만 커스텀 구성으로 실행돼요. 그 커스텀 구성에서는 queueSort, filter, permit 확장 지점이 비활성화돼요.

이 KubeSchedulerConfiguration을 사용하면서 커스텀 스케줄러를 실행하지 않고, .spec.schedulerNamenonexistent-scheduler(또는 클러스터에 존재하지 않는 다른 스케줄러 이름)로 설정된 파드를 정의하면 그 파드에 대해 이벤트가 생성되지 않아요.

노드 라벨링 금지하기

클러스터 관리자는 클러스터 사용자가 노드에 라벨을 붙일 수 없도록 해야 해요. 악의적인 행위자는 nodeSelector 를 사용해 워크로드가 있어서는 안 되는 노드에 스케줄링할 수 있어요.

더 알아보기 (Learn more)