ServiceAccount 토큰 자동 마운트 설정 점검

Kubernetes API 토큰이 필요하지 않은 파드에는 자동 마운트를 비활성화하세요.

설명

ServiceAccount 토큰이 파드에 자동으로 마운트되면 애플리케이션이 해당 계정의 Kubernetes API 자격 증명을 사용할 수 있습니다. API 호출이 필요하지 않은 워크로드에는 불필요한 자격 증명입니다. 파드와 ServiceAccount의 실제 설정을 함께 확인해야 하며 파드의 설정이 우선합니다.

토큰이 불필요하게 들어 있으면 애플리케이션 취약점이나 잘못된 디버깅 도구를 통해 노출될 가능성이 커집니다. 필요한 경우에만 명시적으로 허용하는 편이 안전합니다.

잠재적 영향

  • API 접근이 필요하지 않은 파드에도 토큰이 제공될 수 있습니다.
  • 컨테이너가 침해되면 계정에 허용된 범위에서 추가 정찰이나 권한 악용이 이어질 수 있습니다.

해결 방법

  • Kubernetes API 토큰이 필요하지 않은 파드와 워크로드 템플릿에 automount_service_account_token = false를 설정하세요.
  • 토큰이 필요한 워크로드는 용도별 ServiceAccount와 최소 권한을 사용하고, 필요한 대상과 수명을 가진 토큰을 제공하세요. 명시적 토큰 볼륨 등 다른 자격 증명 경로도 확인하세요.

예시

자동 마운트만 비교하는 DaemonSet 예제입니다. 지정한 네임스페이스는 별도로 준비하고 실제 배포에는 유지보수되는 이미지를 선택하세요. 이 옵션은 명시적으로 구성한 토큰 볼륨까지 제거하지는 않습니다.

변경 전

hcl
resource "kubernetes_daemonset" "example" {
  metadata {
    name      = "terraform-example"
    namespace = "something"
  }

  spec {
    selector {
      match_labels = {
        test = "MyExampleApp"
      }
    }

    template {
      metadata {
        labels = {
          test = "MyExampleApp"
        }
      }

      spec {
        automount_service_account_token = true

        container {
          image = "nginx:1.7.8"
          name  = "example"
        }
      }
    }
  }
}

변경 후

hcl
resource "kubernetes_daemonset" "example" {
  metadata {
    name      = "terraform-example"
    namespace = "something"
  }

  spec {
    selector {
      match_labels = {
        test = "MyExampleApp"
      }
    }

    template {
      metadata {
        labels = {
          test = "MyExampleApp"
        }
      }

      spec {
        automount_service_account_token = false

        container {
          image = "nginx:1.7.8"
          name  = "example"
        }
      }
    }
  }
}

설명:

  • 변경 전: 토큰 자동 마운트를 허용합니다. API 토큰이 필요하지 않은 파드에는 불필요한 노출입니다.
  • 변경 후: 자동 마운트를 비활성화합니다. 토큰이 필요한 기능은 별도로 검토해야 합니다.

참조