Kubernetes Ingress의 워크로드 공개 범위 점검

Ingress의 실제 접근 경로와 인증·TLS 구성이 서비스 요구사항에 맞는지 확인하세요.

설명

Ingress는 지원되는 컨트롤러를 통해 HTTP·HTTPS 요청을 클러스터 서비스로 전달합니다. Ingress가 있다는 사실만으로 인터넷 공개가 확정되는 것은 아니며 컨트롤러, 엔드포인트와 네트워크 설정에 따라 달라집니다. 내부 전용 워크로드를 의도치 않게 공개하면 공격 표면이 늘어날 수 있습니다.

잠재적 영향

  • 외부 요청이 민감한 관리 기능이나 내부 서비스에 도달할 수 있습니다.
  • 인증·TLS나 백엔드 연결이 잘못되면 데이터 노출 또는 서비스 장애가 발생할 수 있습니다.

해결 방법

  • 필요한 서비스만 Ingress에 연결하고 대상 Service 이름과 포트를 확인하세요. 내부 전용 서비스는 사설 컨트롤러·엔드포인트와 필요한 네트워크 제한을 사용하세요.
  • 공개 서비스는 적절한 인증과 TLS를 적용하고 실제 외부 접근을 시험하세요. Service 이름을 Terraform 참조로 바꾸는 것만으로 공개 범위나 접근 권한이 제한되지는 않습니다.

예시

제거된 이전 Ingress API의 레거시 발췌입니다. Kubernetes 1.22 이후에는 지원되는 Ingress API와 kubernetes_ingress_v1 형식을 사용하세요. 컨트롤러, 경로 해석과 Service의 실제 백엔드는 별도 구성입니다.

변경 전

hcl
resource "kubernetes_service" "example" {
  metadata {
    name = "ingress-service"
  }

  spec {
    port {
      port        = 80
      target_port = 80
      protocol    = "TCP"
    }

    type = "NodePort"
  }
}

resource "kubernetes_ingress" "example" {
  metadata {
    name = "example"
  }

  spec {
    rule {
      http {
        path {
          path = "/*"

          backend {
            service_name = "example"
            service_port = 80
          }
        }
      }
    }
  }
}

변경 후

hcl
resource "kubernetes_service" "example" {
  metadata {
    name = "ingress-service"
  }

  spec {
    port {
      port        = 80
      target_port = 80
      protocol    = "TCP"
    }

    type = "NodePort"
  }
}

resource "kubernetes_ingress" "example" {
  metadata {
    name = "example"
  }

  spec {
    rule {
      http {
        path {
          path = "/*"

          backend {
            service_name = kubernetes_service.example.metadata.0.name
            service_port = 80
          }
        }
      }
    }
  }
}

설명:

  • 변경 전: 백엔드 이름 example은 선언된 Service 이름 ingress-service와 다릅니다. 해당 이름의 별도 Service가 없다면 연결되지 않습니다.
  • 변경 후: 선언된 Service의 이름을 참조합니다. 이름 연결을 바로잡지만 공개 범위나 인증을 바꾸지는 않습니다.

참조