Ingress Controller를 통한 워크로드 노출

Ingress가 내부 워크로드를 외부로 노출하면 의도하지 않은 공개 경로가 생길 수 있습니다.

설명

Ingress는 Service를 HTTP·HTTPS 요청에 연결합니다. 컨트롤러와 로드 밸런서 설정에 따라 인터넷 또는 내부 네트워크에서 접근할 수 있으므로, 원래 내부용이어야 할 워크로드가 공개되지 않도록 확인해야 합니다.

모든 서비스가 Ingress 뒤에 있어야 하는 것은 아닙니다. 외부 공개가 필요한 서비스만 선별하고, 나머지는 내부 통신으로 제한하세요.

잠재적 영향

  • 내부 서비스가 인터넷 또는 외부 네트워크에 노출될 수 있습니다.
  • 인증, 속도 제한 등 필요한 보호 없이 공개되면 공격 표면이 넓어질 수 있습니다.
  • 잘못된 라우팅 설정으로 원하지 않는 서비스가 외부 요청을 받을 수 있습니다.

해결 방법

  • 외부 공개가 필요하지 않은 워크로드의 Ingress 공개 경로를 제거하거나 내부 전용 컨트롤러를 사용하세요.
  • 공개가 필요한 경우에도 대상 서비스와 경로를 최소 범위로 제한하세요.
  • 인증, 접근 제어, TLS와 속도 제한을 검토하고 실제 외부 접근 가능 여부를 시험하세요.

예시

첫 예시는 기존 extensions/v1beta1 형식을 보존한 설명용 발췌입니다. 이 Ingress API는 Kubernetes 1.22부터 제공되지 않으므로 현재 배포에는 지원되는 networking.k8s.io/v1 형식을 사용하세요.

변경 전

yaml
apiVersion: v1
kind: Service
metadata:
  name: app
spec:
  type: ClusterIP
  ports:
    - port: 3000
      targetPort: 3000
  selector:
    app: app
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: app-ingress
spec:
  rules:
    - host: app.acme.org
      http:
        paths:
          - backend:
              serviceName: app
              servicePort: 3000

변경 후

yaml
apiVersion: v1
kind: Service
metadata:
  name: app
spec:
  type: ClusterIP
  ports:
    - port: 3000
      targetPort: 3000
  selector:
    app: app

설명:

  • 변경 전: 컨트롤러가 app Service로 요청을 전달하는 경로입니다. 인터넷 노출 여부는 컨트롤러 설정에도 달려 있습니다.
  • 변경 후: 내부 ClusterIP Service만 남깁니다. 파일에서 Ingress를 생략하는 것만으로 기존 리소스가 삭제되지는 않으므로, 기존 app-ingress를 제거하고 다른 공개 경로도 확인하세요.

참조