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